# 顺丰无源码增量发布 这套配置用于把顺丰环境从“在甲方服务器拉源码并现场构建”迁移为“我方构建镜像、甲方服务器只接收镜像包”。它只更新以下服务: - `admin`:主、从服务器 - `gateway`、`auth`、`monitor`:主、从服务器 - `data`:仅主服务器 现有 `emp-pdf`、`emp-ws`、`emp-nacos`、`emp-tdengine` 不在新发布链路中,不会被停止、重建或删除。 ## 一、迁移前核对 先在主、从服务器分别记录现状,尤其要核对 Compose 项目名: ```bash docker inspect emp-gateway \ --format '{{ index .Config.Labels "com.docker.compose.project" }}' docker inspect emp-gateway \ --format '{{ index .Config.Labels "com.docker.compose.project.config_files" }}' docker inspect emp-gateway --format '{{.Config.Image}} {{.Image}}' docker inspect emp-admin --format '{{.Config.Image}} {{.Image}}' docker ps -a pm2 list ``` 如果第一个命令不是 `emp_server`,需要把两台服务器 `release.env` 中的 `BACKEND_PROJECT_NAME` 改成实际值。这样更新时会复用原有 `emp_server_emp-net` 网络,不会额外创建另一套网络。 顺丰环境默认地址为:主服务器 `192.168.0.3`、从服务器 `192.168.0.4`、SSH 端口 `22`。如果 SSH 端口不是 `22`,需要同步修改两台服务器的 `release.env`。 ## 二、一次性安装无源码运行目录 在我方受控构建机生成引导包: ```bash cd /home/git/deploy/isolated DEPLOY_ENV=emp-shunfeng COS_UPLOAD=1 EMP_ROOT=/home/git \ bash ./profiles/emp-shunfeng/build-runtime-package.sh ``` 脚本会把引导包上传到 COS,并输出 `Target bootstrap command`。将这段命令分别复制到主、从服务器执行一次即可;构建机不需要直通顺丰服务器,服务器上也不需要预先存在 `deploy-from-url.sh`。 如果选择线下传包,也可以把生成的 `dist/emp-shunfeng-runtime-bootstrap-*.tar.gz` 放到主、从服务器,再分别执行: ```bash mkdir -p /tmp/emp-shunfeng-bootstrap tar -xzf emp-shunfeng-runtime-bootstrap-*.tar.gz \ -C /tmp/emp-shunfeng-bootstrap --strip-components=1 cd /tmp/emp-shunfeng-bootstrap DEPLOY_HOME=/home/emp-shunfeng \ EXISTING_ENV_FILE=<现有emp_server目录下.env的绝对路径> \ bash ./install-runtime.sh ``` 安装只复制运行配置,不加载镜像,也不重启任何容器。随后在两台机器核对: ```bash vi /home/emp-shunfeng/runtime/.env vi /home/emp-shunfeng/runtime/release.env cd /home/emp-shunfeng/runtime docker compose --env-file .env -f docker-compose.yml \ -p emp_server config >/tmp/emp-shunfeng-compose-config.txt ``` `REMOTE_DEPLOY_HOME` 是从服务器上的部署根目录,不是单独的配置文件目录。主、从服务器现在统一使用 `/home/emp-shunfeng`,真正需要的运行文件位于 `/home/emp-shunfeng/runtime`: | 文件 | 主服务器 | 从服务器 | 说明 | | --- | --- | --- | --- | | `runtime/.env` | 必须 | 必须 | 分别复制各自服务器原 `emp_server/.env`,不要用主机文件覆盖从机文件,因为 `HOST_IP` 等配置可能不同 | | `runtime/release.env` | 必须 | 必须 | 主从地址、路径、Compose 项目名;两台可以使用同一份模板 | | `runtime/docker-compose.yml` | 必须 | 必须 | 只定义 Gateway、Auth、Monitor、Data;从机发布时自动排除 Data | | `runtime/deploy-from-url.sh` | 必须 | 可保留 | COS 下载命令只在主服务器执行,从机由主服务器通过 SSH 更新 | 上述文件由 `install-runtime.sh` 自动放到正确位置。根目录 `/home/emp-shunfeng` 下不需要再额外创建 `.env`;`.env` 必须放在 `runtime` 子目录中。 推荐配置主服务器到从服务器的 SSH 密钥登录。若暂时只能使用密码,可在主服务器的 `release.env` 中增加 `DEPLOY_PASSWORD=...`,文件权限应保持 `600`。 ## 三、构建并发布更新 在我方受控构建机执行: ```bash cd /home/git/deploy/isolated DEPLOY_ENV=emp-shunfeng \ COS_UPLOAD=1 \ EMP_ROOT=/home/git \ bash ./build-update.sh admin gateway auth ``` 也可以按需发布: ```bash # 两台服务器都更新 admin DEPLOY_ENV=emp-shunfeng COS_UPLOAD=1 EMP_ROOT=/home/git \ bash ./build-update.sh admin # 两台服务器更新 monitor,data 只更新主服务器 DEPLOY_ENV=emp-shunfeng COS_UPLOAD=1 EMP_ROOT=/home/git \ bash ./build-update.sh monitor data ``` 顺丰环境会继续使用平铺镜像名,例如 `emp-gateway:<版本>` 和 `emp-gateway:latest`,不会改为 `emp-shunfeng/emp-gateway`。`pdf` 和 `ws` 在该环境会被构建脚本直接拒绝。 上传完成后脚本会输出可直接在主服务器执行的命令,目标目录默认为: ```bash cd /home/emp-shunfeng/runtime ``` 发布顺序固定为: 1. 保存主服务器当前镜像作为回滚镜像,但暂不重启主服务。 2. 把共享服务镜像传到从服务器,先更新从服务器并逐项健康检查。 3. 从服务器正常后再更新主服务器并逐项健康检查。 4. 任一节点失败时,自动恢复本次更新前的镜像并重建本次涉及的容器。 健康检查地址与现网端口一致:Admin `/`、Gateway `/api/health`、Auth `/auth/health`、Monitor `/health`、Data `/health`。 ## 四、COS 凭据 COS 密钥不再写入 Git。在我方构建机一次性创建 `deploy/isolated/.cos.env`: ```bash cd /home/git/deploy/isolated cp .cos.env.example .cos.env chmod 600 .cos.env vi .cos.env ``` `.cos.env` 已被 Git 忽略。配置完成后,日常仍可使用上面的简短构建命令。 ## 五、删除甲方服务器源码 不要在首次迁移前直接删除源码。建议先完成以下闭环: 1. 两台服务器安装并核对 `/home/emp-shunfeng/runtime`。 2. 用新链路发布一个低风险服务,确认主从更新、健康检查和自动回滚均正常。 3. 备份两台服务器现有 `.env`、旧 Compose 文件和 PM2 配置。 4. 确认 `emp-pdf`、`emp-ws` 的 PM2 启动目录不在准备删除的目录内;它们仍按原方式运行和维护。 5. 再删除甲方服务器上的 `emp_server`、`emp_admin` Git 工作区,仅保留运行配置、日志和 PM2 所需代码。 源码删除后,Java 和 Admin 的后续更新只需要在主服务器执行 COS 下载命令;主服务器会自动协调从服务器,无需在从服务器手工重复发布。