# EMP 隔离部署说明 本目录用于在打包/测试服务器构建 Docker 镜像包,上传到腾讯云 COS,然后在甲方服务器通过包 URL 下载并部署。 默认环境为 `emp-test`,用于兼容原有流程;UAT 环境使用 `DEPLOY_ENV=emp-uat`。`emp-test` 和 `emp-uat` 都有独立环境变量模板,并共用一份运行用 compose 模板。 ## 目录说明 ```text build-package.sh Linux / WSL 全量打包脚本 build-package.ps1 Windows PowerShell 全量打包脚本 build-update.sh 增量打包脚本 publish-cos.sh 上传 COS 并输出签名 URL deploy-from-url.sh 甲方服务器按 URL 下载并部署 install.sh 甲方服务器全量安装脚本 apply-update.sh 甲方服务器增量更新脚本 profiles/docker-compose.yml emp-test / emp-uat 共用运行模板 profiles/emp-test/.env.example profiles/emp-uat/.env.example docker-compose.runtime.yml 旧默认运行模板,保留兼容 ``` 打包时 compose 选择顺序为: ```text profiles//docker-compose.yml -> profiles/docker-compose.yml -> docker-compose.runtime.yml -> test/docker-compose.yml ``` 正常情况下,`emp-test` 和 `emp-uat` 都使用 `profiles/docker-compose.yml`,差异只来自各自的 `.env.example`。 ## COS 配置 打包服务器启用 `COS_UPLOAD=1` 前,需要设置: ```bash export COS_SECRET_ID=change-me export COS_SECRET_KEY=change-me export COS_REGION=ap-chengdu export COS_BUCKET=emp-example-bucket ``` 可选配置: ```bash export COS_SIGN_EXPIRE=604800 export COS_PREFIX=deploy/emp-uat/runtime/custom export COS_CONFIG_PATH=/path/to/.cos.yaml ``` `publish-cos.sh` 使用腾讯云 `coscli cp` 上传包,并用 `coscli signurl` 生成临时下载 URL。打包服务器需要提前安装 `coscli`。 ## UAT 全量打包并上传 ```bash cd /home/git/emp_test_deploy/isolated DEPLOY_ENV=emp-uat \ COS_UPLOAD=1 \ EMP_ROOT=/home/git \ ./build-package.sh ``` 其中 `/home/git/emp_test_deploy/isolated` 是部署脚本目录,`EMP_ROOT=/home/git` 是业务代码根目录,下面直接包含 `emp_admin`、`emp_server`、`emp_ws`。 Windows PowerShell: ```powershell cd E:\emp\deploy\isolated .\build-package.ps1 -DeployEnv emp-uat -CosUpload ``` 输出示例: ```text Package: .../dist/emp-uat-runtime-20260611120000.tar.gz COS Key: deploy/emp-uat/runtime/20260611120000/emp-uat-runtime-20260611120000.tar.gz SHA256: ... URL: https://... ``` ## 甲方服务器全量部署 先将 `deploy-from-url.sh` 放到甲方服务器。之后执行: ```bash cd /home/admin-x99/emp DEPLOY_ENV=emp-uat \ DEPLOY_HOME=/home/admin-x99/emp/emp-uat \ PACKAGE_SHA256=<打包输出的SHA256> \ bash deploy-from-url.sh "<打包输出的URL>" ``` 脚本会将包下载到: ```text /home/admin-x99/emp/emp-uat/packages/<时间戳>/ ``` 然后把运行文件复制到: ```text /home/admin-x99/emp/emp-uat/runtime/ ``` 并执行 `install.sh`。 如果目标目录下还没有 `.env`,`install.sh` 会先从 `.env.example` 生成 `.env` 并停止。修改密码、`PUBLIC_HOST`、端口和第三方配置后,再执行: ```bash cd /home/admin-x99/emp/emp-uat/runtime DEPLOY_ENV=emp-uat bash install.sh ``` ## 同一台服务器部署 test 和 uat 同一台甲方服务器可以同时部署两套环境。两套环境使用不同 `DEPLOY_ENV`、`DEPLOY_HOME`、compose project 和宿主机端口。 `profiles/docker-compose.yml` 中网关、PDF、Nacos、Redis 默认只在 Docker 内网访问;前端 Nginx 容器会在 Docker 内网代理 `/api/` 和 `/socket.io/`。 | 环境 | 部署目录 | Compose 项目名 | 前端 | WS | MySQL | 本地 Kafka 可选 | TDengine REST | | --- | --- | --- | --- | --- | --- | --- | --- | | emp-test | `/home/admin-x99/emp/emp-test` | `emp-test` | 4750 | 4751 | 4752 | 4753 | 4754 | | emp-uat | `/home/admin-x99/emp/emp-uat` | `emp-uat` | 4755 | 4756 | 4757 | 4758 | 4759 | `4760` 预留备用。当前公共 compose 模板不对外暴露 Gateway、PDF、Nacos、Redis、TDengine RPC;如需额外暴露,再使用 `4760` 或向甲方申请新端口。 甲方服务器系统重装后,`emp-test` 和 `emp-uat` 都按全量部署重新执行一次;不要只打增量包。 Kafka 当前配置: - `emp-test` 模拟器推送:`ip-cld.cn:29362` / `test-vehicle-real-data`。 - `emp-test` 后端消费:`ip-cld.cn:29362` / `YuanJing-test-vehicle-mock-data`。 - `emp-uat` 模拟器推送:`ip-cld.cn:29362` / `uat-vehicle-real-data`。 - `emp-uat` 后端消费:`ip-cld.cn:29362` / `YuanJing-uat-vehicle-mock-data`。 内部 Kafka 镜像仍会打进离线包,但 `profiles/docker-compose.yml` 默认不启动 Kafka。需要本地联调内部 Kafka 时,再显式启用 compose profile:`COMPOSE_PROFILES=local-kafka`。 部署 test: ```bash DEPLOY_ENV=emp-test \ DEPLOY_HOME=/home/admin-x99/emp/emp-test \ PACKAGE_SHA256=<打包输出的SHA256> \ bash deploy-from-url.sh "" ``` 部署 uat: ```bash DEPLOY_ENV=emp-uat \ DEPLOY_HOME=/home/admin-x99/emp/emp-uat \ PACKAGE_SHA256=<打包输出的SHA256> \ bash deploy-from-url.sh "" ``` Docker compose 会按项目名隔离容器、网络和数据卷,所以只要 `PROJECT_NAME` 不同,`emp-test` 和 `emp-uat` 的数据卷不会互相覆盖。 ## TDengine 首次初始化 首次全量部署后,如果 MySQL 数据由外部迁移,只需要在 TDengine 中创建业务库和车辆数据超级表 `s_vehicle_data`。`emp-test` 和 `emp-uat` 是两套独立容器和数据卷,必须分别执行一次。 下面以 `emp-uat` 为例,`CREATE STABLE` 使用 here-doc 方式执行,这是现场验证成功的方式,避免超长单行 SQL 粘贴被截断: ```bash DEPLOY_ENV=emp-uat cd /home/admin-x99/emp/$DEPLOY_ENV/runtime dc() { docker compose --env-file .env -f docker-compose.yml -p "$DEPLOY_ENV" "$@"; } dc exec -T tdengine taos -s "CREATE DATABASE IF NOT EXISTS emp;" dc exec -T tdengine taos -d emp <<'SQL' CREATE STABLE s_vehicle_data ( ts TIMESTAMP, endurance_mile FLOAT, vehicle_status INT, charge_status INT, operation_mode INT, speed INT, total_mile INT, vol INT, cur INT, soc INT, dc_status INT, gear INT, insulation INT, pedal_mile INT, break_status INT, valid BOOL, longitude INT, latitude INT, charge_energy_num INT, charge_energy_no INT, charge_vol INT, charge_cur INT, bat_num INT, bat_start INT, cur_num INT, bats NCHAR(4096), charge_energy_temp_num INT, charge_energy_temp_no INT, temp_num INT, temps NCHAR(2048), version INT, avg_cur_num INT, avg_cur INT, model_code NCHAR(64), byte_num INT, soh INT, ah_num FLOAT, energy_num FLOAT, sn NCHAR(64), can_protocol_detail NCHAR(256), adc_status INT, can_vol FLOAT, adc_vol FLOAT, adc_vol_sample INT, battery_code NCHAR(64), data_time_text NCHAR(32) ) TAGS ( vin_no NCHAR(32) ); SHOW STABLES; DESCRIBE s_vehicle_data; SQL ``` 成功标志: ```text Create OK SHOW STABLES 输出包含 s_vehicle_data DESCRIBE s_vehicle_data 输出 47 行字段 ``` `taos` 在 `docker compose exec -T` 的非交互终端里可能输出 `Fail to reset the terminal properties` 或 `Fail to set terminal properties`,只要 `Create OK`、`SHOW STABLES` 和 `DESCRIBE` 正常,可以忽略。 建完超级表后重启数据服务: ```bash dc restart emp-data ``` 初始化 `emp-test` 时只需要把环境改成: ```bash DEPLOY_ENV=emp-test cd /home/admin-x99/emp/$DEPLOY_ENV/runtime dc() { docker compose --env-file .env -f docker-compose.yml -p "$DEPLOY_ENV" "$@"; } ``` ## 甲方服务器常用命令 ```bash cd /home/admin-x99/emp/emp-uat/runtime docker compose --env-file .env -f docker-compose.yml -p emp-uat ps docker compose --env-file .env -f docker-compose.yml -p emp-uat logs -f emp-gateway docker compose --env-file .env -f docker-compose.yml -p emp-uat down ``` 查看 test 时把目录和项目名改为 `emp-test`: ```bash cd /home/admin-x99/emp/emp-test/runtime docker compose --env-file .env -f docker-compose.yml -p emp-test ps ``` ## 手工兜底部署 如果 COS 不可用,仍然可以通过其他方式把 `dist/` 下的包传到甲方服务器。全量包手工部署示例: ```bash mkdir -p /home/admin-x99/emp/emp-uat/runtime tar -xzf emp-uat-runtime-*.tar.gz -C /home/admin-x99/emp/emp-uat/runtime --strip-components=1 cd /home/admin-x99/emp/emp-uat/runtime DEPLOY_ENV=emp-uat bash install.sh ```