Files
aiot-platform-cloud/docker-compose.core.yml

235 lines
8.2 KiB
YAML
Raw Normal View History

build(ci): docker-compose 多环境参数化 + staging 中间件配置隔离 问题: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 后缀
2026-04-28 16:37:27 +08:00
# ============================================
# 后端核心服务 - 多环境通用 Compose
# ============================================
# 部署机调用:
# docker compose --env-file .env -f docker-compose.core.yml up -d
# 不传 --env-file 时,所有 ${VAR:-default} 落到 prod 默认值,行为与历史一致。
# 部署机的 .env 由运维手工维护,不进 git敏感凭据
# ============================================
version: '3.8'
networks:
default:
name: 1panel-network
external: true
volumes:
app-logs:
build(ci): docker-compose 多环境参数化 + staging 中间件配置隔离 问题: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 后缀
2026-04-28 16:37:27 +08:00
# ============================================
# 公共环境变量片段YAML anchor
# ============================================
x-common-env: &common-env
TZ: Asia/Shanghai
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-prod}
# ===== Nacos =====
NACOS_USERNAME: ${NACOS_USERNAME:-nacos}
NACOS_PASSWORD: ${NACOS_PASSWORD:-9oDxX~}e7DeP}
NACOS_ADDR: ${NACOS_ADDR:-172.17.16.7:8848}
NACOS_DISCOVERY_NAMESPACE: ${NACOS_DISCOVERY_NAMESPACE:-8efd6d96-de7f-4664-b28e-c2788ffa1395}
NACOS_CONFIG_NAMESPACE: ${NACOS_CONFIG_NAMESPACE:-8efd6d96-de7f-4664-b28e-c2788ffa1395}
# ===== MySQL =====
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: ${MYSQL_URL:-jdbc:mysql://172.17.16.8:3306/aiot-platform-test?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true}
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: ${MYSQL_USERNAME:-root}
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: ${MYSQL_PASSWORD:-tKi8rfUJjVrf@}
# ===== Redis =====
SPRING_DATA_REDIS_HOST: ${REDIS_HOST:-172.17.16.13}
SPRING_DATA_REDIS_PORT: ${REDIS_PORT:-6379}
SPRING_DATA_REDIS_PASSWORD: ${REDIS_PASSWORD:-HkVZkVnn1}
# ===== RocketMQ =====
ROCKETMQ_NAMESRV_ADDR: ${ROCKETMQ_NAMESRV_ADDR:-rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080}
ROCKETMQ_ACCESS_KEY: ${ROCKETMQ_ACCESS_KEY:-ak4wd73bxpv55331e7c5b80}
ROCKETMQ_SECRET_KEY: ${ROCKETMQ_SECRET_KEY:-sk82108944bc0997f7}
# ===== XXL-Job =====
# 注意XXL_JOB_EXECUTOR_APPNAME 用来区分 prod/release 在同一 admin 下的执行器组
build(ci): docker-compose 多环境参数化 + staging 中间件配置隔离 问题: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 后缀
2026-04-28 16:37:27 +08:00
# (后端 application.yaml 需要支持 ${XXL_JOB_EXECUTOR_APPNAME:${spring.application.name}}
XXL_JOB_ADMIN_ADDRESSES: ${XXL_JOB_ADMIN_ADDRESSES:-http://172.17.16.7:19090/xxl-job-admin}
XXL_JOB_EXECUTOR_IP: ${XXL_JOB_EXECUTOR_IP:-172.17.16.14}
XXL_JOB_EXECUTOR_APPNAME_SUFFIX: ${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:-}
services:
viewsh-gateway:
image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-gateway:${IMAGE_TAG:-latest}
container_name: aiot-gateway
2026-01-13 22:04:33 +08:00
restart: on-failure:5
ports:
- "48080:48080"
environment:
build(ci): docker-compose 多环境参数化 + staging 中间件配置隔离 问题: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 后缀
2026-04-28 16:37:27 +08:00
<<: *common-env
JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs"
volumes:
- app-logs:/app/logs
deploy:
resources:
limits:
memory: 1536m
cpus: '1.0'
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:48080/actuator/health"]
interval: 10s
timeout: 5s
retries: 12
start_period: 120s
viewsh-module-system-server:
image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-system-server:${IMAGE_TAG:-latest}
container_name: aiot-system-server
2026-01-13 22:04:33 +08:00
restart: on-failure:5
ports:
- "48081:48081"
- "9901:9901"
environment:
build(ci): docker-compose 多环境参数化 + staging 中间件配置隔离 问题: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 后缀
2026-04-28 16:37:27 +08:00
<<: *common-env
JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs"
build(ci): docker-compose 多环境参数化 + staging 中间件配置隔离 问题: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 后缀
2026-04-28 16:37:27 +08:00
# 微信配置system-server 独有)
WX_MP_APP_ID: ${WX_MP_APP_ID:-wx5b23ba7a5589ecbb}
WX_MP_SECRET: ${WX_MP_SECRET:-2a7b3b20c537e52e74afd395eb85f61f}
WX_MINIAPP_APPID: ${WX_MINIAPP_APPID:-wxc4598c446f8a9cb3}
WX_MINIAPP_SECRET: ${WX_MINIAPP_SECRET:-4a1a04e07f6a4a0751b39c3064a92c8b}
XXL_JOB_EXECUTOR_PORT: 9901
volumes:
- app-logs:/app/logs
deploy:
resources:
limits:
memory: 1536m
cpus: '1.0'
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:48081/actuator/health"]
interval: 10s
timeout: 5s
retries: 12
start_period: 120s
depends_on:
viewsh-gateway:
condition: service_healthy
viewsh-module-infra-server:
image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-infra-server:${IMAGE_TAG:-latest}
container_name: aiot-infra-server
2026-01-13 22:04:33 +08:00
restart: on-failure:5
ports:
- "48082:48082"
- "9902:9902"
environment:
build(ci): docker-compose 多环境参数化 + staging 中间件配置隔离 问题: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 后缀
2026-04-28 16:37:27 +08:00
<<: *common-env
JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs"
XXL_JOB_EXECUTOR_PORT: 9902
volumes:
- app-logs:/app/logs
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:48082/actuator/health"]
interval: 10s
timeout: 5s
retries: 12
start_period: 120s
depends_on:
viewsh-module-system-server:
condition: service_healthy
viewsh-module-iot-server:
image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-iot-server:${IMAGE_TAG:-latest}
container_name: aiot-iot-server
2026-01-13 22:04:33 +08:00
restart: on-failure:5
ports:
2026-01-14 21:49:35 +08:00
- "48091:48091"
- "9903:9903"
environment:
build(ci): docker-compose 多环境参数化 + staging 中间件配置隔离 问题: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 后缀
2026-04-28 16:37:27 +08:00
<<: *common-env
JAVA_OPTS: "-Xms1024m -Xmx2048m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs"
2026-01-14 11:12:28 +08:00
build(ci): docker-compose 多环境参数化 + staging 中间件配置隔离 问题: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 后缀
2026-04-28 16:37:27 +08:00
# ===== 时序库iot-server 独有)=====
# prod 用 TDengine172.17.16.7:6041release 用腾讯云 CTSDBInfluxDB 兼容)
build(ci): docker-compose 多环境参数化 + staging 中间件配置隔离 问题: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 后缀
2026-04-28 16:37:27 +08:00
# 通过 TSDB_TYPE 切换tdengine | ctsdb
TSDB_TYPE: ${TSDB_TYPE:-tdengine}
TDENGINE_HOST: ${TDENGINE_HOST:-172.17.16.7}
TDENGINE_PORT: ${TDENGINE_PORT:-6041}
TDENGINE_USERNAME: ${TDENGINE_USERNAME:-root}
TDENGINE_PASSWORD: ${TDENGINE_PASSWORD:-taosdata}
TDENGINE_DATABASE: ${TDENGINE_DATABASE:-aiot_platform}
CTSDB_URL: ${CTSDB_URL:-}
CTSDB_USERNAME: ${CTSDB_USERNAME:-}
CTSDB_PASSWORD: ${CTSDB_PASSWORD:-}
CTSDB_DATABASE: ${CTSDB_DATABASE:-}
XXL_JOB_EXECUTOR_PORT: 9903
volumes:
- app-logs:/app/logs
deploy:
resources:
limits:
memory: 2560m
cpus: '1.5'
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:48091/actuator/health"]
interval: 10s
timeout: 5s
retries: 12
start_period: 120s
depends_on:
viewsh-module-infra-server:
condition: service_healthy
viewsh-module-iot-gateway:
image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-iot-gateway:${IMAGE_TAG:-latest}
container_name: aiot-iot-gateway
2026-01-13 22:04:33 +08:00
restart: on-failure:5
ports:
- "1883:1883"
- "8092:8092"
- "8091:8091"
environment:
IOT_TCP_ENABLED: "true"
TZ: Asia/Shanghai
build(ci): docker-compose 多环境参数化 + staging 中间件配置隔离 问题: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 后缀
2026-04-28 16:37:27 +08:00
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-prod}
JAVA_OPTS: "-Xms1024m -Xmx2048m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs"
build(ci): docker-compose 多环境参数化 + staging 中间件配置隔离 问题: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 后缀
2026-04-28 16:37:27 +08:00
SPRING_DATA_REDIS_HOST: ${REDIS_HOST:-172.17.16.13}
SPRING_DATA_REDIS_PORT: ${REDIS_PORT:-6379}
SPRING_DATA_REDIS_PASSWORD: ${REDIS_PASSWORD:-HkVZkVnn1}
ROCKETMQ_NAMESRV_ADDR: ${ROCKETMQ_NAMESRV_ADDR:-rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080}
ROCKETMQ_ACCESS_KEY: ${ROCKETMQ_ACCESS_KEY:-ak4wd73bxpv55331e7c5b80}
ROCKETMQ_SECRET_KEY: ${ROCKETMQ_SECRET_KEY:-sk82108944bc0997f7}
VIEWSH_IOT_GATEWAY_RPC_URL: "http://aiot-iot-server:48091"
volumes:
- app-logs:/app/logs
deploy:
resources:
limits:
memory: 2560m
cpus: '1.5'
depends_on:
- viewsh-module-iot-server
viewsh-module-ops-server:
image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-ops-server:${IMAGE_TAG:-latest}
container_name: aiot-ops-server
restart: on-failure:5
ports:
- "48092:48092"
- "9904:9904"
environment:
build(ci): docker-compose 多环境参数化 + staging 中间件配置隔离 问题: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 后缀
2026-04-28 16:37:27 +08:00
<<: *common-env
JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs"
XXL_JOB_EXECUTOR_PORT: 9904
volumes:
- app-logs:/app/logs
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:48092/actuator/health"]
interval: 10s
timeout: 5s
retries: 12
start_period: 120s
depends_on:
viewsh-module-iot-server:
condition: service_healthy