From 602217274c0027d7a5d3e6deb72ae4949a44fda8 Mon Sep 17 00:00:00 2001 From: lzh Date: Tue, 28 Apr 2026 16:37:27 +0800 Subject: [PATCH] =?UTF-8?q?build(ci):=20docker-compose=20=E5=A4=9A?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=8F=82=E6=95=B0=E5=8C=96=20+=20staging=20?= =?UTF-8?q?=E4=B8=AD=E9=97=B4=E4=BB=B6=E9=85=8D=E7=BD=AE=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: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 后缀 --- Jenkinsfile | 33 +- docker-compose.core.yml | 206 ++++------- env/.gitignore | 3 + env/prod.env.example | 61 ++++ env/staging.env.example | 69 ++++ .../src/main/resources/application.yaml | 344 +++++++++--------- .../src/main/resources/application-prod.yaml | 2 +- .../src/main/resources/application.yaml | 2 +- .../src/main/resources/application.yaml | 2 +- .../src/main/resources/application.yaml | 2 +- .../src/main/resources/application.yaml | 2 +- 11 files changed, 416 insertions(+), 310 deletions(-) create mode 100644 env/.gitignore create mode 100644 env/prod.env.example create mode 100644 env/staging.env.example diff --git a/Jenkinsfile b/Jenkinsfile index 087c0c64..6de47f49 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -298,6 +298,9 @@ pipeline { checkRemoteDiskOrFail(env.DEPLOY_HOST, 'Deploy') checkRemoteDiskOrFail(env.REGISTRY_HOST, 'Registry') + // 检查部署机上 .env 文件是否存在(多环境配置隔离,缺失时直接 fail,避免连错 DB) + checkRemoteEnvFileOrFail(env.DEPLOY_HOST, env.DEPLOY_PATH) + recordStageMetrics('Pre-deploy Check', stageStartTime) } } @@ -730,7 +733,7 @@ def getPreviousImageTag() { script: """ ssh ${sshOpts} root@${env.DEPLOY_HOST} ' cd ${env.DEPLOY_PATH} - docker compose -f docker-compose.core.yml images --format json | \ + docker compose --env-file .env -f docker-compose.core.yml images --format json | \ jq -r ".[0].Tag" | head -1 ' 2>/dev/null || echo "latest" """, @@ -759,7 +762,7 @@ def backupCurrentDeployment(def services) { cp docker-compose.core.yml docker-compose.core.yml.backup-${env.BUILD_NUMBER} # 记录当前运行的镜像 - docker compose -f docker-compose.core.yml images > deployment-state-${env.BUILD_NUMBER}.txt + docker compose --env-file .env -f docker-compose.core.yml images > deployment-state-${env.BUILD_NUMBER}.txt echo "✅ Backup completed: deployment-state-${env.BUILD_NUMBER}.txt" ' @@ -796,10 +799,10 @@ def rollbackDeployment(def services) { export IMAGE_TAG=${env.PREVIOUS_IMAGE_TAG} # 拉取旧版本镜像 - docker compose -f docker-compose.core.yml pull ${service} + docker compose --env-file .env -f docker-compose.core.yml pull ${service} # 重启服务 - docker compose -f docker-compose.core.yml up -d ${service} + docker compose --env-file .env -f docker-compose.core.yml up -d ${service} echo "✅ ${service} rolled back to ${env.PREVIOUS_IMAGE_TAG}" ' @@ -934,10 +937,10 @@ def deployService(String service) { cd ${env.DEPLOY_PATH} echo "📥 Pulling ${service}..." - docker compose -f docker-compose.core.yml pull ${service} + docker compose --env-file .env -f docker-compose.core.yml pull ${service} echo "🔄 Restarting ${service}..." - docker compose -f docker-compose.core.yml up -d ${service} + docker compose --env-file .env -f docker-compose.core.yml up -d ${service} echo "⏳ Waiting for container to start..." sleep 5 @@ -1162,6 +1165,24 @@ def checkRemoteDiskOrFail(String host, String role) { } } +// 检查部署机上 .env 文件是否存在(多环境配置必须由运维手工放置,缺失时拒绝部署避免连错中间件) +def checkRemoteEnvFileOrFail(String host, String deployPath) { + def sshOpts = "-o StrictHostKeyChecking=no -o ConnectTimeout=10 -i ${env.SSH_KEY}" + def envExists = sh( + script: "ssh ${sshOpts} root@${host} 'test -f ${deployPath}/.env && echo yes || echo no'", + returnStdout: true + ).trim() + + if (envExists != 'yes') { + error("""❌ ${host}:${deployPath}/.env 不存在! +请先在部署机上手工放置环境变量文件(敏感凭据不进 git): + - prod 模板:env/prod.env.example + - staging 模板:env/staging.env.example +拷贝模板到 ${deployPath}/.env 并填好密码、CTSDB 凭据等占位符后再触发部署。""") + } + echo " ✅ ${host}:${deployPath}/.env 存在" +} + // Prod/Staging 本地清理:调用仓库内的 cleanup.sh def cleanupDeployHost(String host, String keep) { def sshOpts = "-o StrictHostKeyChecking=no -o ConnectTimeout=10 -i ${env.SSH_KEY}" diff --git a/docker-compose.core.yml b/docker-compose.core.yml index 5abe4cda..c4fa61fe 100644 --- a/docker-compose.core.yml +++ b/docker-compose.core.yml @@ -1,3 +1,11 @@ +# ============================================ +# 后端核心服务 - 多环境通用 Compose +# ============================================ +# 部署机调用: +# docker compose --env-file .env -f docker-compose.core.yml up -d +# 不传 --env-file 时,所有 ${VAR:-default} 落到 prod 默认值,行为与历史一致。 +# 部署机的 .env 由运维手工维护,不进 git(敏感凭据)。 +# ============================================ version: '3.8' networks: @@ -8,6 +16,42 @@ networks: volumes: app-logs: +# ============================================ +# 公共环境变量片段(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/staging 在同一 admin 下的执行器组 + # (后端 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} @@ -16,25 +60,8 @@ services: ports: - "48080:48080" environment: - # ===== 基础配置 ===== - TZ: Asia/Shanghai - SPRING_PROFILES_ACTIVE: prod - - # ===== JVM 配置 ===== + <<: *common-env JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs" - - # ===== Nacos 配置 ===== - NACOS_USERNAME: nacos - NACOS_PASSWORD: 9oDxX~}e7DeP - NACOS_ADDR: 172.17.16.7:8848 - NACOS_DISCOVERY_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" - NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" - - # ===== Redis 配置 ===== - SPRING_DATA_REDIS_HOST: 172.17.16.13 - SPRING_DATA_REDIS_PORT: 6379 - SPRING_DATA_REDIS_PASSWORD: "HkVZkVnn1" - volumes: - app-logs:/app/logs deploy: @@ -57,37 +84,16 @@ services: - "48081:48081" - "9901:9901" environment: - TZ: Asia/Shanghai - SPRING_PROFILES_ACTIVE: prod + <<: *common-env JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs" - - # ===== Nacos 配置 ===== - NACOS_USERNAME: nacos - NACOS_PASSWORD: 9oDxX~}e7DeP - NACOS_ADDR: 172.17.16.7:8848 - NACOS_DISCOVERY_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" - NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" - - # 数据库 - SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_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: root # TODO: 填入数据库用户名 - SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: "tKi8rfUJjVrf@" # TODO: 填入数据库密码 - - # Redis - SPRING_DATA_REDIS_HOST: 172.17.16.13 - SPRING_DATA_REDIS_PASSWORD: "HkVZkVnn1" # TODO: 填入 Redis 密码 - - # 微信配置 (解决 appid 不能为 null) - WX_MP_APP_ID: "wx5b23ba7a5589ecbb" - WX_MP_SECRET: "2a7b3b20c537e52e74afd395eb85f61f" - WX_MINIAPP_APPID: "wxc4598c446f8a9cb3" - WX_MINIAPP_SECRET: "4a1a04e07f6a4a0751b39c3064a92c8b" - - # XXL-Job 调度中心地址 - XXL_JOB_ADMIN_ADDRESSES: http://172.17.16.7:19090/xxl-job-admin - XXL_JOB_EXECUTOR_IP: 172.17.16.14 - XXL_JOB_EXECUTOR_PORT: 9901 + # 微信配置(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: @@ -113,28 +119,9 @@ services: - "48082:48082" - "9902:9902" environment: - TZ: Asia/Shanghai - SPRING_PROFILES_ACTIVE: prod + <<: *common-env JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs" - - NACOS_USERNAME: nacos - NACOS_PASSWORD: 9oDxX~}e7DeP - NACOS_ADDR: 172.17.16.7:8848 - NACOS_DISCOVERY_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" - NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" - - SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_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: root - SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: "tKi8rfUJjVrf@" - - SPRING_DATA_REDIS_HOST: 172.17.16.13 - SPRING_DATA_REDIS_PASSWORD: "HkVZkVnn1" - - # XXL-Job 调度中心地址 - XXL_JOB_ADMIN_ADDRESSES: http://172.17.16.7:19090/xxl-job-admin - XXL_JOB_EXECUTOR_IP: 172.17.16.14 XXL_JOB_EXECUTOR_PORT: 9902 - volumes: - app-logs:/app/logs healthcheck: @@ -155,38 +142,24 @@ services: - "48091:48091" - "9903:9903" environment: - TZ: Asia/Shanghai - SPRING_PROFILES_ACTIVE: prod + <<: *common-env JAVA_OPTS: "-Xms1024m -Xmx2048m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs" - NACOS_USERNAME: nacos - NACOS_PASSWORD: 9oDxX~}e7DeP - NACOS_ADDR: 172.17.16.7:8848 - NACOS_DISCOVERY_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" - NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" - - SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_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: root - SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: "tKi8rfUJjVrf@" - - SPRING_DATA_REDIS_HOST: 172.17.16.13 - SPRING_DATA_REDIS_PASSWORD: "HkVZkVnn1" - - ROCKETMQ_NAMESRV_ADDR: rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080 - ROCKETMQ_ACCESS_KEY: ak4wd73bxpv55331e7c5b80 - ROCKETMQ_SECRET_KEY: sk82108944bc0997f7 + # ===== 时序库(iot-server 独有)===== + # prod 用 TDengine(172.17.16.7:6041),staging 用腾讯云 CTSDB(InfluxDB 兼容) + # 通过 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:-} - # TDengine - TDENGINE_HOST: 172.17.16.7 - TDENGINE_PORT: 6041 - TDENGINE_USERNAME: root - TDENGINE_PASSWORD: taosdata - - # XXL-Job 调度中心地址 - XXL_JOB_ADMIN_ADDRESSES: http://172.17.16.7:19090/xxl-job-admin - XXL_JOB_EXECUTOR_IP: 172.17.16.14 XXL_JOB_EXECUTOR_PORT: 9903 - volumes: - app-logs:/app/logs deploy: @@ -215,15 +188,17 @@ services: environment: IOT_TCP_ENABLED: "true" TZ: Asia/Shanghai - SPRING_PROFILES_ACTIVE: prod + SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-prod} JAVA_OPTS: "-Xms1024m -Xmx2048m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs" - - SPRING_DATA_REDIS_HOST: 172.17.16.13 - SPRING_DATA_REDIS_PASSWORD: "HkVZkVnn1" - - ROCKETMQ_NAMESRV_ADDR: rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080 - ROCKETMQ_ACCESS_KEY: ak4wd73bxpv55331e7c5b80 - ROCKETMQ_SECRET_KEY: sk82108944bc0997f7 + + 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 @@ -243,32 +218,9 @@ services: - "48092:48092" - "9904:9904" environment: - TZ: Asia/Shanghai - SPRING_PROFILES_ACTIVE: prod + <<: *common-env JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs" - - NACOS_USERNAME: nacos - NACOS_PASSWORD: 9oDxX~}e7DeP - NACOS_ADDR: 172.17.16.7:8848 - NACOS_DISCOVERY_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" - NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" - - SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_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: root - SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: "tKi8rfUJjVrf@" - - SPRING_DATA_REDIS_HOST: 172.17.16.13 - SPRING_DATA_REDIS_PASSWORD: "HkVZkVnn1" - - ROCKETMQ_NAMESRV_ADDR: rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080 - ROCKETMQ_ACCESS_KEY: ak4wd73bxpv55331e7c5b80 - ROCKETMQ_SECRET_KEY: sk82108944bc0997f7 - - # XXL-Job 调度中心地址 - XXL_JOB_ADMIN_ADDRESSES: http://172.17.16.7:19090/xxl-job-admin - XXL_JOB_EXECUTOR_IP: 172.17.16.14 XXL_JOB_EXECUTOR_PORT: 9904 - volumes: - app-logs:/app/logs healthcheck: diff --git a/env/.gitignore b/env/.gitignore new file mode 100644 index 00000000..40028a6b --- /dev/null +++ b/env/.gitignore @@ -0,0 +1,3 @@ +# env 目录里只允许 .example 模板进 git,真实 .env 一律忽略 +*.env +!*.env.example diff --git a/env/prod.env.example b/env/prod.env.example new file mode 100644 index 00000000..b1270a0f --- /dev/null +++ b/env/prod.env.example @@ -0,0 +1,61 @@ +# ============================================ +# 生产环境(PROD)环境变量模板 +# ============================================ +# 部署机使用方式: +# 1) 拷贝到 /opt/aiot-platform-cloud/.env +# 2) 把 等占位符填成真实值(千万别 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_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= + +# ===== Redis ===== +REDIS_HOST=172.17.16.13 +REDIS_PORT=6379 +REDIS_PASSWORD= + +# ===== RocketMQ(腾讯云外网 endpoint)===== +ROCKETMQ_NAMESRV_ADDR=rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080 +ROCKETMQ_ACCESS_KEY= +ROCKETMQ_SECRET_KEY= + +# ===== 时序库(prod 用 TDengine)===== +TSDB_TYPE=tdengine +TDENGINE_HOST=172.17.16.7 +TDENGINE_PORT=6041 +TDENGINE_USERNAME=root +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_MINIAPP_APPID=wxc4598c446f8a9cb3 +WX_MINIAPP_SECRET= + +# ===== 镜像 ===== +REGISTRY_HOST=172.17.16.7:5000 +# IMAGE_TAG 由 CI 在 docker compose 命令前 export,无需在 .env 里固定 diff --git a/env/staging.env.example b/env/staging.env.example new file mode 100644 index 00000000..7d3e050e --- /dev/null +++ b/env/staging.env.example @@ -0,0 +1,69 @@ +# ============================================ +# 预发布环境(STAGING)环境变量模板 +# ============================================ +# 部署机使用方式: +# 1) 拷贝到 172.17.16.7 的 /opt/aiot-platform-cloud/.env +# 2) 把 等占位符填成真实值(千万别 commit) +# 3) Jenkins/手工部署:docker compose --env-file .env -f docker-compose.core.yml up -d +# ============================================ + +# ===== Spring ===== +SPRING_PROFILES_ACTIVE=prod + +# ===== Nacos(独立 namespace,与 prod 隔离)===== +NACOS_USERNAME=nacos +NACOS_PASSWORD= +NACOS_ADDR=172.17.16.7:8848 +NACOS_DISCOVERY_NAMESPACE=e635b215-913e-4bc8-8867-2fbf7d5134aa +NACOS_CONFIG_NAMESPACE=e635b215-913e-4bc8-8867-2fbf7d5134aa + +# ===== MySQL(同实例,独立库)===== +# 库名从 aiot-platform-test 改为 aiot-platform-release +MYSQL_URL=jdbc:mysql://172.17.16.8:3306/aiot-platform-release?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true +MYSQL_USERNAME=root +MYSQL_PASSWORD= + +# ===== Redis(同 prod 实例,注意 key 前缀靠应用层隔离)===== +REDIS_HOST=172.17.16.13 +REDIS_PORT=6379 +REDIS_PASSWORD= + +# ===== RocketMQ(用 staging 服务器本地部署的 1Panel-rocketmq-ZQQi 实例,内网地址)===== +# 1Panel 上 namesrv 容器对外端口(请按实际 1Panel 暴露端口校正,默认 9876) +ROCKETMQ_NAMESRV_ADDR=172.17.16.7:9876 +# 自部署 RocketMQ 通常无 ACL,留空即可;如启用了 ACL 再填 +ROCKETMQ_ACCESS_KEY= +ROCKETMQ_SECRET_KEY= + +# ===== 时序库 ===== +# TODO: staging 计划用腾讯云 CTSDB(InfluxDB 兼容),但当前后端 application-prod.yaml 仍写死 +# TDengine 的 jdbc:TAOS-RS 协议;切到 CTSDB 需要后端代码层改造(双引擎抽象在 +# framework/tsdb/ 已有但 yaml 未启用切换)。短期方案:staging 共享 prod 的 TDengine +# 实例(172.17.16.7:6041),通过独立 database 名隔离。 +TSDB_TYPE=tdengine +TDENGINE_HOST=172.17.16.7 +TDENGINE_PORT=6041 +TDENGINE_USERNAME=root +TDENGINE_PASSWORD= +TDENGINE_DATABASE=aiot_platform_staging +# CTSDB 切换 follow-up(暂留空) +CTSDB_URL= +CTSDB_USERNAME= +CTSDB_PASSWORD= +CTSDB_DATABASE= + +# ===== XXL-Job ===== +# 共用 prod 的 admin(http://172.17.16.7:19090),但用 -staging 后缀区分执行器组 +# 否则 admin 调度任务会同时打到 prod 和 staging(同 appname 串台) +XXL_JOB_ADMIN_ADDRESSES=http://172.17.16.7:19090/xxl-job-admin +XXL_JOB_EXECUTOR_IP=172.17.16.7 +XXL_JOB_EXECUTOR_APPNAME_SUFFIX=-staging + +# ===== 微信(建议 staging 用沙箱号;先沿用 prod)===== +WX_MP_APP_ID=wx5b23ba7a5589ecbb +WX_MP_SECRET= +WX_MINIAPP_APPID=wxc4598c446f8a9cb3 +WX_MINIAPP_SECRET= + +# ===== 镜像 ===== +REGISTRY_HOST=172.17.16.7:5000 diff --git a/viewsh-module-infra/viewsh-module-infra-server/src/main/resources/application.yaml b/viewsh-module-infra/viewsh-module-infra-server/src/main/resources/application.yaml index ded36d0a..9beec4d7 100644 --- a/viewsh-module-infra/viewsh-module-infra-server/src/main/resources/application.yaml +++ b/viewsh-module-infra/viewsh-module-infra-server/src/main/resources/application.yaml @@ -1,172 +1,172 @@ -spring: - application: - name: infra-server - - profiles: - active: local - - main: - allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。 - allow-bean-definition-overriding: true # 允许 Bean 覆盖,例如说 Feign 等会存在重复定义的服务 - - config: - import: - - optional:classpath:application-${spring.profiles.active}.yaml # 加载【本地】配置 - - optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml # 加载【Nacos】的配置 - - # Servlet 配置 - servlet: - # 文件上传相关配置项 - multipart: - max-file-size: 16MB # 单个文件大小 - max-request-size: 32MB # 设置总上传的文件大小 - - # Jackson 配置项 - jackson: - serialization: - write-dates-as-timestamps: true # 设置 LocalDateTime 的格式,使用时间戳 - write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 - write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 - fail-on-empty-beans: false # 允许序列化无属性的 Bean - - # Cache 配置项 - cache: - type: REDIS - redis: - time-to-live: 1h # 设置过期时间为 1 小时 - -server: - port: 48082 - -logging: - file: - name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 - ---- #################### 接口文档配置 #################### - -springdoc: - api-docs: - enabled: true # 1. 是否开启 Swagger 接文档的元数据 - path: /v3/api-docs - swagger-ui: - enabled: true # 2.1 是否开启 Swagger 文档的官方 UI 界面 - path: /swagger-ui - default-flat-param-object: true # 参见 https://doc.xiaominfo.com/docs/faq/v4/knife4j-parameterobject-flat-param 文档 - -knife4j: - enable: true - setting: - language: zh_cn - -# MyBatis Plus 的配置项 -mybatis-plus: - configuration: - map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 - global-config: - db-config: - id-type: NONE # “智能”模式,基于 IdTypeEnvironmentPostProcessor + 数据源的类型,自动适配成 AUTO、INPUT 模式。 - # id-type: AUTO # 自增 ID,适合 MySQL 等直接自增的数据库 - # id-type: INPUT # 用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库 - # id-type: ASSIGN_ID # 分配 ID,默认使用雪花算法。注意,Oracle、PostgreSQL、Kingbase、DB2、H2 数据库时,需要去除实体类上的 @KeySequence 注解 - logic-delete-value: 1 # 逻辑已删除值(默认为 1) - logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) - banner: false # 关闭控制台的 Banner 打印 - type-aliases-package: ${viewsh.info.base-package}.dal.dataobject - encryptor: - password: XDV71a+xqStEA3WH # 加解密的秘钥,可使用 https://www.imaegoo.com/2020/aes-key-generator/ 网站生成 - -mybatis-plus-join: - banner: false # 关闭控制台的 Banner 打印 - -# Spring Data Redis 配置 -spring: - data: - redis: - repositories: - enabled: false # 项目未使用到 Spring Data Redis 的 Repository,所以直接禁用,保证启动速度 - -# VO 转换(数据翻译)相关 -easy-trans: - is-enable-global: false # 【默认禁用,对性能确认压力大】启用全局翻译(拦截所有 SpringMVC ResponseBody 进行自动翻译 )。如果对于性能要求很高可关闭此配置,或通过 @IgnoreTrans 忽略某个接口 - ---- #################### RPC 远程调用相关配置 #################### - ---- #################### 消息队列相关 #################### - -# rocketmq 配置项,对应 RocketMQProperties 配置类 -rocketmq: - # Producer 配置项 - producer: - group: ${spring.application.name}_PRODUCER # 生产者分组 - -spring: - # Kafka 配置项,对应 KafkaProperties 配置类 - kafka: - # Kafka Producer 配置项 - producer: - acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。 - retries: 3 # 发送失败时,重试发送的次数 - value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化 - # Kafka Consumer 配置项 - consumer: - auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解 - value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer - properties: - spring.json.trusted.packages: '*' - # Kafka Consumer Listener 监听器配置 - listener: - missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错 - ---- #################### 定时任务相关配置 #################### - -xxl: - job: - executor: - appname: ${spring.application.name} # 执行器 AppName - logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 - accessToken: default_token # 执行器通讯TOKEN - ---- #################### 芋道相关配置 #################### - -viewsh: - info: - version: 1.0.0 - base-package: com.viewsh.module.infra - web: - admin-ui: - url: http://dashboard.viewsh.iocoder.cn # Admin 管理后台 UI 的地址 - xss: - enable: false - exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 - - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 - - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 - websocket: - enable: true # websocket的开关 - path: /infra/ws # 路径 - sender-type: local # 消息发送的类型,可选值为 local、redis、rocketmq、kafka、rabbitmq - sender-rocketmq: - topic: ${spring.application.name}-websocket # 消息发送的 RocketMQ Topic - consumer-group: ${spring.application.name}-websocket-consumer # 消息发送的 RocketMQ Consumer Group - sender-rabbitmq: - exchange: ${spring.application.name}-websocket-exchange # 消息发送的 RabbitMQ Exchange - queue: ${spring.application.name}-websocket-queue # 消息发送的 RabbitMQ Queue - sender-kafka: - topic: ${spring.application.name}-websocket # 消息发送的 Kafka Topic - consumer-group: ${spring.application.name}-websocket-consumer # 消息发送的 Kafka Consumer Group - swagger: - title: 管理后台 - description: 提供管理员管理的所有功能 - version: ${viewsh.info.version} - codegen: - base-package: com.viewsh - db-schemas: ${spring.datasource.dynamic.datasource.master.name} - front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类 - vo-type: 10 # VO 的类型,参见 CodegenVOTypeEnum 枚举类 - delete-batch-enable: true # 是否生成批量删除接口 - unit-test-enable: false # 是否生成单元测试 - tenant: # 多租户相关配置项 - enable: true - ignore-urls: - ignore-tables: - -debug: false +spring: + application: + name: infra-server + + profiles: + active: local + + main: + allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。 + allow-bean-definition-overriding: true # 允许 Bean 覆盖,例如说 Feign 等会存在重复定义的服务 + + config: + import: + - optional:classpath:application-${spring.profiles.active}.yaml # 加载【本地】配置 + - optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml # 加载【Nacos】的配置 + + # Servlet 配置 + servlet: + # 文件上传相关配置项 + multipart: + max-file-size: 16MB # 单个文件大小 + max-request-size: 32MB # 设置总上传的文件大小 + + # Jackson 配置项 + jackson: + serialization: + write-dates-as-timestamps: true # 设置 LocalDateTime 的格式,使用时间戳 + write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 + write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 + fail-on-empty-beans: false # 允许序列化无属性的 Bean + + # Cache 配置项 + cache: + type: REDIS + redis: + time-to-live: 1h # 设置过期时间为 1 小时 + +server: + port: 48082 + +logging: + file: + name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 + +--- #################### 接口文档配置 #################### + +springdoc: + api-docs: + enabled: true # 1. 是否开启 Swagger 接文档的元数据 + path: /v3/api-docs + swagger-ui: + enabled: true # 2.1 是否开启 Swagger 文档的官方 UI 界面 + path: /swagger-ui + default-flat-param-object: true # 参见 https://doc.xiaominfo.com/docs/faq/v4/knife4j-parameterobject-flat-param 文档 + +knife4j: + enable: true + setting: + language: zh_cn + +# MyBatis Plus 的配置项 +mybatis-plus: + configuration: + map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 + global-config: + db-config: + id-type: NONE # “智能”模式,基于 IdTypeEnvironmentPostProcessor + 数据源的类型,自动适配成 AUTO、INPUT 模式。 + # id-type: AUTO # 自增 ID,适合 MySQL 等直接自增的数据库 + # id-type: INPUT # 用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库 + # id-type: ASSIGN_ID # 分配 ID,默认使用雪花算法。注意,Oracle、PostgreSQL、Kingbase、DB2、H2 数据库时,需要去除实体类上的 @KeySequence 注解 + logic-delete-value: 1 # 逻辑已删除值(默认为 1) + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) + banner: false # 关闭控制台的 Banner 打印 + type-aliases-package: ${viewsh.info.base-package}.dal.dataobject + encryptor: + password: XDV71a+xqStEA3WH # 加解密的秘钥,可使用 https://www.imaegoo.com/2020/aes-key-generator/ 网站生成 + +mybatis-plus-join: + banner: false # 关闭控制台的 Banner 打印 + +# Spring Data Redis 配置 +spring: + data: + redis: + repositories: + enabled: false # 项目未使用到 Spring Data Redis 的 Repository,所以直接禁用,保证启动速度 + +# VO 转换(数据翻译)相关 +easy-trans: + is-enable-global: false # 【默认禁用,对性能确认压力大】启用全局翻译(拦截所有 SpringMVC ResponseBody 进行自动翻译 )。如果对于性能要求很高可关闭此配置,或通过 @IgnoreTrans 忽略某个接口 + +--- #################### RPC 远程调用相关配置 #################### + +--- #################### 消息队列相关 #################### + +# rocketmq 配置项,对应 RocketMQProperties 配置类 +rocketmq: + # Producer 配置项 + producer: + group: ${spring.application.name}_PRODUCER # 生产者分组 + +spring: + # Kafka 配置项,对应 KafkaProperties 配置类 + kafka: + # Kafka Producer 配置项 + producer: + acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。 + retries: 3 # 发送失败时,重试发送的次数 + value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化 + # Kafka Consumer 配置项 + consumer: + auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解 + value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer + properties: + spring.json.trusted.packages: '*' + # Kafka Consumer Listener 监听器配置 + listener: + missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错 + +--- #################### 定时任务相关配置 #################### + +xxl: + job: + executor: + appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 staging 设为 -staging,prod 留空) + logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 + accessToken: default_token # 执行器通讯TOKEN + +--- #################### 芋道相关配置 #################### + +viewsh: + info: + version: 1.0.0 + base-package: com.viewsh.module.infra + web: + admin-ui: + url: http://dashboard.viewsh.iocoder.cn # Admin 管理后台 UI 的地址 + xss: + enable: false + exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 + - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 + - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 + websocket: + enable: true # websocket的开关 + path: /infra/ws # 路径 + sender-type: local # 消息发送的类型,可选值为 local、redis、rocketmq、kafka、rabbitmq + sender-rocketmq: + topic: ${spring.application.name}-websocket # 消息发送的 RocketMQ Topic + consumer-group: ${spring.application.name}-websocket-consumer # 消息发送的 RocketMQ Consumer Group + sender-rabbitmq: + exchange: ${spring.application.name}-websocket-exchange # 消息发送的 RabbitMQ Exchange + queue: ${spring.application.name}-websocket-queue # 消息发送的 RabbitMQ Queue + sender-kafka: + topic: ${spring.application.name}-websocket # 消息发送的 Kafka Topic + consumer-group: ${spring.application.name}-websocket-consumer # 消息发送的 Kafka Consumer Group + swagger: + title: 管理后台 + description: 提供管理员管理的所有功能 + version: ${viewsh.info.version} + codegen: + base-package: com.viewsh + db-schemas: ${spring.datasource.dynamic.datasource.master.name} + front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类 + vo-type: 10 # VO 的类型,参见 CodegenVOTypeEnum 枚举类 + delete-batch-enable: true # 是否生成批量删除接口 + unit-test-enable: false # 是否生成单元测试 + tenant: # 多租户相关配置项 + enable: true + ignore-urls: + ignore-tables: + +debug: false diff --git a/viewsh-module-iot/viewsh-module-iot-server/src/main/resources/application-prod.yaml b/viewsh-module-iot/viewsh-module-iot-server/src/main/resources/application-prod.yaml index 2bc6688f..cdfc6a84 100644 --- a/viewsh-module-iot/viewsh-module-iot-server/src/main/resources/application-prod.yaml +++ b/viewsh-module-iot/viewsh-module-iot-server/src/main/resources/application-prod.yaml @@ -64,7 +64,7 @@ spring: username: ${MYSQL_SLAVE_USER:${MYSQL_USER:root}} password: ${MYSQL_SLAVE_PASSWORD:${MYSQL_PASSWORD:}} tdengine: - url: jdbc:TAOS-RS://${TDENGINE_HOST:172.17.16.7}:${TDENGINE_PORT:6041}/aiot_platform + url: jdbc:TAOS-RS://${TDENGINE_HOST:172.17.16.7}:${TDENGINE_PORT:6041}/${TDENGINE_DATABASE:aiot_platform} driver-class-name: com.taosdata.jdbc.rs.RestfulDriver username: ${TDENGINE_USERNAME:root} password: ${TDENGINE_PASSWORD:taosdata} diff --git a/viewsh-module-iot/viewsh-module-iot-server/src/main/resources/application.yaml b/viewsh-module-iot/viewsh-module-iot-server/src/main/resources/application.yaml index c8ac4931..a914c49a 100644 --- a/viewsh-module-iot/viewsh-module-iot-server/src/main/resources/application.yaml +++ b/viewsh-module-iot/viewsh-module-iot-server/src/main/resources/application.yaml @@ -122,7 +122,7 @@ spring: xxl: job: executor: - appname: ${spring.application.name} # 执行器 AppName + appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 staging 设为 -staging,prod 留空) logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 accessToken: default_token # 执行器通讯TOKEN diff --git a/viewsh-module-ops/viewsh-module-ops-server/src/main/resources/application.yaml b/viewsh-module-ops/viewsh-module-ops-server/src/main/resources/application.yaml index b72e80c4..5a2cb65b 100644 --- a/viewsh-module-ops/viewsh-module-ops-server/src/main/resources/application.yaml +++ b/viewsh-module-ops/viewsh-module-ops-server/src/main/resources/application.yaml @@ -115,7 +115,7 @@ spring: xxl: job: executor: - appname: ${spring.application.name} # 执行器 AppName + appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 staging 设为 -staging,prod 留空) logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 accessToken: default_token # 执行器通讯TOKEN diff --git a/viewsh-module-system/viewsh-module-system-server/src/main/resources/application.yaml b/viewsh-module-system/viewsh-module-system-server/src/main/resources/application.yaml index e53f4b8b..3f995190 100644 --- a/viewsh-module-system/viewsh-module-system-server/src/main/resources/application.yaml +++ b/viewsh-module-system/viewsh-module-system-server/src/main/resources/application.yaml @@ -122,7 +122,7 @@ spring: xxl: job: executor: - appname: ${spring.application.name} # 执行器 AppName + appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 staging 设为 -staging,prod 留空) logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 accessToken: default_token # 执行器通讯TOKEN diff --git a/viewsh-server/src/main/resources/application.yaml b/viewsh-server/src/main/resources/application.yaml index 9200da5d..a13c764a 100644 --- a/viewsh-server/src/main/resources/application.yaml +++ b/viewsh-server/src/main/resources/application.yaml @@ -104,7 +104,7 @@ easy-trans: xxl: job: executor: - appname: ${spring.application.name} # 执行器 AppName + appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 staging 设为 -staging,prod 留空) logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 accessToken: default_token # 执行器通讯TOKEN