# 开发环境（deve）运维说明

本文档描述与 **测试环境（sit）** 并行运行的 **开发环境** 的设计、部署与日常运维。配置脚本位于仓库 `docs/devops/dev/`。

---

## 1. 环境与目标

| 环境 | Git 分支 | Spring Profile | 宿主机 Java 目录 | 说明 |
|------|----------|----------------|------------------|------|
| 测试 sit | `sit` | `test` | `/docker/java` | 现有联调 / 测试 |
| **开发 deve** | **`deve`** | **`dev`** | **`/deve/java`** | 本环境 |

开发环境目标：

- 与 test **共用中间件**（MySQL、Nacos、RocketMQ、xxl-job-admin、Jenkins），节省资源
- Java 服务、Redis、业务库、Nacos 命名空间 **隔离**，避免 dev 污染 test
- Jenkins **按需构建**微服务，默认 `gateway + store + second`
- 开发者可用 IDEA 直连 dev 中间件，或在服务器跑 `java-dev` 容器联调

---

## 2. 架构概览

```mermaid
flowchart TB
  subgraph host["测试机 120.26.186.130"]
    subgraph mw["/docker/middleware 共用"]
      MySQL[(MySQL 30001)]
      Nacos[Nacos 8848]
      RMQ[RocketMQ]
      XXL[xxl-job-admin 30019]
      RedisTest[redis 30002]
      Jenkins[Jenkins 30003]
      Nginx[Nginx 80/443]
    end

    subgraph mwdev["/docker/middleware-dev 增补"]
      RedisDev[redis-dev 20022]
    end

    subgraph test["/docker/java 测试"]
      GWt[gateway :8000 profile=test]
    end

    subgraph dev["/deve/java 开发"]
      GWd[gateway-dev :28000 profile=dev]
    end
  end

  GWt --> Nacos
  GWd --> Nacos
  GWt --> RedisTest
  GWd --> RedisDev
  GWt --> MySQL
  GWd --> MySQL
  Jenkins --> dev
  Nginx --> GWt
  Nginx --> GWd
```

---

## 3. 隔离矩阵

| 资源 | 测试 | 开发 | 隔离方式 |
|------|------|------|----------|
| MySQL 实例 | 共用 `mysql:3306` | 共用 | **不同 database**（dev 库） |
| Nacos | namespace `acd615de-…` | **public / dev 命名空间** | `bootstrap-test.yml` vs `bootstrap-dev.yml` |
| Redis | `redis-6.0.8` `30002` | **`redis-dev` `20022`** | 独立实例 + 独立数据目录 |
| RocketMQ | 共用 | 共用 | consumer group / topic 前缀在 Nacos 区分 |
| xxl-job-admin | 共用 `30019` | 共用 | **执行器 appname + 回调端口** 区分 |
| Java 容器 | `gateway`… | `gateway-dev`… | 独立 compose、端口 `28xxx` |
| 日志 | `/docker/java/logs` | `/deve/java/logs` | 独立目录 |

---

## 4. 服务器目录与仓库对应

### 4.1 宿主机路径

```text
/docker/middleware/              # 测试中间件（已有）
/docker/middleware-dev/          # 开发增补中间件（redis-dev）
/docker/java/                    # 测试 Java 服务
/deve/java/                      # 开发 Java 服务（compose + jar + logs）
```

首次部署建议从仓库复制：

```bash
# 开发 Java
mkdir -p /deve/java
cp docs/devops/dev/java/docker-compose.yml /deve/java/
mkdir -p /deve/java/gateway /deve/java/store /deve/java/second \
         /deve/java/store-platform /deve/java/lawyer /deve/java/job /deve/java/dining \
         /deve/java/logs/gateway /deve/java/logs/store ...

# 开发 Redis
mkdir -p /docker/middleware-dev
cp -r docs/devops/dev/middleware/* /docker/middleware-dev/
```

### 4.2 仓库文件索引

| 路径 | 说明 |
|------|------|
| `docs/devops/dev/Introduction.md` | 本文档 |
| `docs/devops/dev/java/docker-compose.yml` | 7 个 Java 微服务 compose |
| `docs/devops/dev/java/Jenkinsfile` | Jenkins 流水线（Pipeline from SCM） |
| `docs/devops/dev/middleware/docker-compose.yml` | redis-dev |
| `docs/devops/dev/middleware/redis-dev/conf/redis.conf` | dev Redis 配置 |

---

## 5. 端口一览

### 5.1 Java 服务（宿主机 → 容器）

| 服务 | 容器名 | compose 服务名 | 宿主机端口 | 容器端口 | Profile |
|------|--------|----------------|------------|----------|---------|
| gateway | `gateway-dev` | `gateway` | **28000** | 8000 | dev |
| store | `store-dev` | `store` | **28004** | 30004 | dev |
| second | `second-dev` | `second` | **28005** | 30005 | dev |
| store-platform | `store-platform-dev` | `store-platform` | **28006** | 30006 | dev |
| lawyer | `lawyer-dev` | `lawyer` | **28007** | 30007 | dev |
| job | `job-dev` | `job` | **28008** / **28018** | 30008 / 9999 | dev |
| dining | `dining-dev` | `dining` | **28014** | 30014 | dev |

对比测试环境：gateway `8000`，store `30004`，job 回调 `30018`。

### 5.2 中间件（开发相关）

| 组件 | 宿主机端口 | 容器内访问（app-network） |
|------|------------|---------------------------|
| redis-dev | **20022** | `redis-dev:6379` |
| MySQL（共用） | 30001 | `mysql:3306` |
| Nacos（共用） | 8848 | `nacos-2.5.2:8848` |
| xxl-job-admin（共用） | 30019 | `xxl-job-admin:8080` |

---

## 6. 部署步骤

### 6.1 前置条件

```bash
docker network inspect app-network   # 须已存在（middleware 创建）
```

### 6.2 启动 redis-dev

```bash
cd /docker/middleware-dev
docker compose up -d
docker exec redis-dev redis-cli -a Alien123456 ping
```

### 6.3 启动 Java 服务

日常最小集（约 2~2.5GB 额外内存）：

```bash
cd /deve/java
docker compose up -d gateway store second
```

全量：

```bash
cd /deve/java
docker compose up -d
```

### 6.4 Jenkins 容器挂载（必配）

在 `/docker/middleware/docker-compose.yml` 的 `jenkins` 服务中增加：

```yaml
volumes:
  - /deve/java:/deve/java          # dev 部署目录
  # 已有：../java:/app_deploy、docker.sock 等
```

---

## 7. Nacos 配置（dev 命名空间）

`spring.profiles.active=dev` 读取 `bootstrap-dev.yml`（默认 **public** 命名空间，与 test 的 `acd615de-…` 分离）。

在 dev 命名空间 `common.yml`（及 `alien-job` 等）中确认：

```yaml
spring:
  datasource:
    url: jdbc:mysql://mysql:3306/<dev库名>?...
  redis:
    host: redis-dev
    port: 6379
    password: Alien123456

xxl:
  job:
    admin:
      addresses: http://xxl-job-admin:8080/xxl-job-admin
    accessToken: default_token
    executor:
      appname: alien-job-dev          # 与 test 的 alien-job 区分
      ip: 120.26.186.130
      port: 28018                     # 宿主机映射端口（非容器内 9999）
      logpath: /app/logs
```

RocketMQ：为 dev 配置独立 `consumer.group` 前缀，避免与 test 抢消费。

---

## 8. xxl-job 共用 Admin 的隔离

共用 **一个** `xxl-job-admin`（`30019`），通过 **执行器** 隔离：

| 项 | test (`job`) | dev (`job-dev`) |
|----|--------------|-----------------|
| executor.appname | `alien-job` | **`alien-job-dev`** |
| 回调地址 | `120.26.186.130:30018` | **`120.26.186.130:28018`** |
| 业务库 | test 库 | dev 库（profile=dev） |

控制台操作：

1. 「执行器管理」中应看到两组：`alien-job` 与 `alien-job-dev` 均 **在线**
2. dev 定时任务绑定 **`alien-job-dev`** 执行器；test 任务绑定 `alien-job`
3. dev 任务默认可 **停止**，联调时再启用

验证：

```bash
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:28018/
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:30018/
```

---

## 9. Jenkins 流水线

### 9.1 Job 配置

| 项 | 值 |
|----|-----|
| 类型 | Pipeline script from SCM |
| 仓库 | `http://8.152.195.41:3000/alien/alien_cloud` |
| 默认分支 | `*/deve` |
| Script Path | **`docs/devops/dev/java/Jenkinsfile`** |

保存后执行一次构建以注册参数。

### 9.2 构建参数

| 参数 | 默认 | 说明 |
|------|------|------|
| `GIT_BRANCH` | `deve` | 可改分支 |
| `STOP_ALL` | `false` | 为 true 时先 `docker compose stop` 全部 dev 服务 |
| `DEPLOY_gateway` | **true** | |
| `DEPLOY_store` | **true** | |
| `DEPLOY_second` | **true** | |
| `DEPLOY_store_platform` | false | |
| `DEPLOY_lawyer` | false | |
| `DEPLOY_job` | false | |
| `DEPLOY_dining` | false | |

规则：

- 至少勾选一个微服务
- `STOP_ALL=true` 时 **必须勾选 gateway**
- 流水线：`Checkout → [Stop All] → Maven(-pl 勾选模块 -am) → 拷贝 jar 到 /deve/java → compose up -d + restart`

### 9.3 与 sit 任务对比

| sit | deve |
|-----|------|
| 脚本写在 Job 内 | SCM `Jenkinsfile` |
| 分支 `sit` | 参数 `GIT_BRANCH`，默认 `deve` |
| 全量构建部署 | 按需模块 |
| `/app_deploy` + `docker restart` | `/deve/java` + `docker compose` |

---

## 10. 内存与资源建议

基于测试机 `docker stats`（7 个 test Java 合计约 5.6GB RSS，宿主机约 10GB 可用）：

| 策略 | 服务 | 大约额外内存 |
|------|------|--------------|
| **日常推荐** | gateway + store + second | ~2~2.5 GB |
| 全链路 | 7 个 Java | ~4.5~5.5 GB |

dev compose 默认：`mem_limit` 800M（store 700M），`-Xmx384m`。`store-dev` 为最重模块，若 OOM 可适当提高 `mem_limit` 或 `-Xmx`。

---

## 11. 日常运维命令

```bash
# 查看 dev 容器状态
cd /deve/java && docker compose ps

# 查看内存
docker stats --no-stream gateway-dev store-dev job-dev --format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}"

# 重启单个服务
cd /deve/java && docker compose restart store

# 停止全部 dev Java（不影响 test）
cd /deve/java && docker compose stop

# 日志
tail -f /deve/java/logs/store/alien-store/*.log
docker logs -f store-dev --tail 200

# 健康检查
curl -s http://127.0.0.1:28000/actuator/health
```

### 日志备份示例

```bash
tar -czf /tmp/alien-store-logs-$(date +%Y%m%d-%H%M%S).tar.gz \
  -C /deve/java/logs/store alien-store
```

---

## 12. 本地 IDEA 直连

不启动服务器 Java 容器时，可本地起单个服务并连 dev 中间件：

| 配置项 | 值 |
|--------|-----|
| `spring.profiles.active` | `dev` |
| MySQL | `120.26.186.130:30001`，dev 库 |
| Redis | `120.26.186.130:20022`，密码 `Alien123456` |
| Nacos | `120.26.186.130:8848`，dev 命名空间 |

**勿**使用 test 的 Nacos namespace，避免注册到 test 服务发现。

---

## 13. Nginx

配置文件：`docs/devops/dev/middleware/nginx/dev.conf` → 宿主机 `/docker/middleware/nginx/conf.d/dev.conf`。

域名 **`deve.ailien.shop`**（与阿里云已有 `dev` 记录区分，避免 DNS 冲突）。

```bash
docker exec nginx-1.28 nginx -t && docker exec nginx-1.28 nginx -s reload
```

静态资源目录：`/deve/html`（如 `https://deve.ailien.shop/group_web/`）。

---

## 14. 常见问题

| 现象 | 可能原因 | 处理 |
|------|----------|------|
| dev 请求打到 test 服务 | Profile 仍为 `test` 或 Nacos namespace 错误 | 确认 `-Dspring.profiles.active=dev` |
| Redis 认证失败 | Nacos 未配 password | `common.yml` 补 `Alien123456` |
| xxl-job 回调失败 | executor.port 写成 9999 | 宿主机侧应为 **28018** |
| Jenkins 部署 jar 失败 | 未挂载 `/deve/java` | 检查 jenkins volumes |
| 新 jar 不生效 | 仅 `up -d` 未 restart | 流水线已 `up -d` + `restart`；手工同理 |
| `STOP_ALL` 后网关不通 | 未勾选 gateway | 勾选 `DEPLOY_gateway` |
| 构建参数无复选框 | Job 有旧的手动参数冲突 | 删除 Job 内重复参数，重新保存 Job |

---

## 15. 变更记录

| 日期 | 说明 |
|------|------|
| 2026-06 | 初版：dev Java compose、redis-dev、Jenkinsfile、本文档 |

配置变更请同步更新仓库 `docs/devops/dev/` 下对应文件，再部署到服务器。
