# ============================================ # 后端核心服务 - 多环境通用 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: # ============================================ # 公共环境变量片段(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 下的执行器组 # (后端 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 restart: on-failure:5 ports: - "48080:48080" environment: <<: *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 restart: on-failure:5 ports: - "48081:48081" - "9901:9901" environment: <<: *common-env JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs" # 微信配置(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 restart: on-failure:5 ports: - "48082:48082" - "9902:9902" environment: <<: *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 restart: on-failure:5 ports: - "48091:48091" - "9903:9903" environment: <<: *common-env JAVA_OPTS: "-Xms1024m -Xmx2048m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs" # ===== 时序库(iot-server 独有)===== # prod 用 TDengine(172.17.16.7:6041),release 用腾讯云 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:-} 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 restart: on-failure:5 ports: - "1883:1883" - "8092:8092" - "8091:8091" environment: IOT_TCP_ENABLED: "true" TZ: Asia/Shanghai SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-prod} JAVA_OPTS: "-Xms1024m -Xmx2048m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs" 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: <<: *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