问题:docker-compose.core.yml 把 MySQL/Redis/Nacos/RocketMQ/TDengine 等连接信息
全写死成 prod 值,无论 master→PROD 还是 release/next→STAGING 都用同一份,
staging 容器会直接连 prod 数据库写脏数据。
改动:
- docker-compose.core.yml 全参数化(${VAR:-prod_default}),用 YAML anchor
抽公共 env,未注入 .env 时行为与历史一致(不破坏 prod 当前部署)
- 新增 env/prod.env.example、env/staging.env.example 模板(占位密码进 git)
和 env/.gitignore(真实 .env 不进 git,由部署机手工维护)
- Jenkinsfile:所有 docker compose 命令加 --env-file .env,并在 Pre-deploy
Check 阶段验证部署机 .env 文件存在性,缺失直接 fail(防止连错中间件)
- 5 个核心服务 application.yaml 的 xxl-job appname 加 SUFFIX 变量:
appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:}
staging 设为 -staging,prod 留空。否则 staging 与 prod 注册到同一个执行器
组,admin 调度任务会随机打到任一边
- iot-server application-prod.yaml TDengine database 参数化:
/aiot_platform → /${TDENGINE_DATABASE:aiot_platform}
staging 用独立 database aiot_platform_staging,避免共享 prod 时序数据
staging 中间件方案:
- MySQL 同实例(172.17.16.8)独立库 aiot-platform-release
- Nacos 同实例独立 namespace e635b215-913e-4bc8-8867-2fbf7d5134aa
- Redis 同 prod 实例(短期,靠 application 层 key 前缀隔离)
- RocketMQ 改用 staging 服务器本地实例 172.17.16.7:9876(内网)
- TDengine 同 prod 实例独立 database(CTSDB 切换为 follow-up)
- XXL-Job admin 共用,executor IP=.7、appname 加 -staging 后缀
62 lines
2.0 KiB
Plaintext
62 lines
2.0 KiB
Plaintext
# ============================================
|
||
# 生产环境(PROD)环境变量模板
|
||
# ============================================
|
||
# 部署机使用方式:
|
||
# 1) 拷贝到 /opt/aiot-platform-cloud/.env
|
||
# 2) 把 <PASSWORD>、<KEY> 等占位符填成真实值(千万别 commit)
|
||
# 3) Jenkins/手工部署:docker compose --env-file .env -f docker-compose.core.yml up -d
|
||
# ============================================
|
||
|
||
# ===== Spring =====
|
||
SPRING_PROFILES_ACTIVE=prod
|
||
|
||
# ===== Nacos =====
|
||
NACOS_USERNAME=nacos
|
||
NACOS_PASSWORD=<NACOS_PASSWORD>
|
||
NACOS_ADDR=172.17.16.7:8848
|
||
NACOS_DISCOVERY_NAMESPACE=8efd6d96-de7f-4664-b28e-c2788ffa1395
|
||
NACOS_CONFIG_NAMESPACE=8efd6d96-de7f-4664-b28e-c2788ffa1395
|
||
|
||
# ===== MySQL =====
|
||
MYSQL_URL=jdbc:mysql://172.17.16.8:3306/aiot-platform-test?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
|
||
MYSQL_USERNAME=root
|
||
MYSQL_PASSWORD=<MYSQL_PASSWORD>
|
||
|
||
# ===== Redis =====
|
||
REDIS_HOST=172.17.16.13
|
||
REDIS_PORT=6379
|
||
REDIS_PASSWORD=<REDIS_PASSWORD>
|
||
|
||
# ===== RocketMQ(腾讯云外网 endpoint)=====
|
||
ROCKETMQ_NAMESRV_ADDR=rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080
|
||
ROCKETMQ_ACCESS_KEY=<ROCKETMQ_ACCESS_KEY>
|
||
ROCKETMQ_SECRET_KEY=<ROCKETMQ_SECRET_KEY>
|
||
|
||
# ===== 时序库(prod 用 TDengine)=====
|
||
TSDB_TYPE=tdengine
|
||
TDENGINE_HOST=172.17.16.7
|
||
TDENGINE_PORT=6041
|
||
TDENGINE_USERNAME=root
|
||
TDENGINE_PASSWORD=<TDENGINE_PASSWORD>
|
||
# CTSDB 不用,留空
|
||
CTSDB_URL=
|
||
CTSDB_USERNAME=
|
||
CTSDB_PASSWORD=
|
||
CTSDB_DATABASE=
|
||
|
||
# ===== XXL-Job =====
|
||
XXL_JOB_ADMIN_ADDRESSES=http://172.17.16.7:19090/xxl-job-admin
|
||
XXL_JOB_EXECUTOR_IP=172.17.16.14
|
||
# prod 不加后缀(保持现有 admin 上的执行器组名不变)
|
||
XXL_JOB_EXECUTOR_APPNAME_SUFFIX=
|
||
|
||
# ===== 微信(生产 AppId/Secret)=====
|
||
WX_MP_APP_ID=wx5b23ba7a5589ecbb
|
||
WX_MP_SECRET=<WX_MP_SECRET>
|
||
WX_MINIAPP_APPID=wxc4598c446f8a9cb3
|
||
WX_MINIAPP_SECRET=<WX_MINIAPP_SECRET>
|
||
|
||
# ===== 镜像 =====
|
||
REGISTRY_HOST=172.17.16.7:5000
|
||
# IMAGE_TAG 由 CI 在 docker compose 命令前 export,无需在 .env 里固定
|