|
- x-app-env: &app-env
- env_file:
- - .env
- restart: unless-stopped
- networks:
- - emp-net
-
- # Java 服务 logback 文件滚动策略(合并自 ops/runtime-logs/docker-compose.logs.yml)
- x-java-file-log: &java-file-log
- LOGGING_LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE: ${SPRING_LOG_MAX_FILE_SIZE:-100MB}
- LOGGING_LOGBACK_ROLLINGPOLICY_MAX_HISTORY: ${SPRING_LOG_MAX_HISTORY:-30}
- LOGGING_LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP: ${SPRING_LOG_TOTAL_SIZE_CAP:-5GB}
-
- x-java-depends: &java-depends
- nacos:
- condition: service_healthy
- mysql:
- condition: service_healthy
- redis:
- condition: service_healthy
-
- services:
- mysql:
- image: ${MYSQL_IMAGE:-mysql:8.0}
- restart: unless-stopped
- ports:
- - "0.0.0.0:${MYSQL_HOST_PORT:-23306}:3306"
- environment:
- TZ: Asia/Shanghai
- MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE: ${MYSQL_DATABASE:-emp}
- command:
- # 字符集/时区
- - --character-set-server=utf8mb4
- - --collation-server=utf8mb4_0900_ai_ci
- - --default-time-zone=+08:00
- # InnoDB 核心
- - --innodb_buffer_pool_size=16G
- - --innodb_buffer_pool_instances=8
- - --innodb_log_file_size=2G
- - --innodb_log_buffer_size=64M
- - --innodb_flush_log_at_trx_commit=2
- - --innodb_flush_method=O_DIRECT
- - --innodb_io_capacity=2000
- - --innodb_io_capacity_max=4000
- - --innodb_thread_concurrency=0
- # 连接/表缓存/文件句柄
- - --max_connections=1000
- - --table_open_cache=4000
- - --table_open_cache_instances=16
- - --open_files_limit=65535
- # 会话级缓冲
- - --tmp_table_size=256M
- - --max_heap_table_size=256M
- - --sort_buffer_size=4M
- - --join_buffer_size=4M
- - --read_rnd_buffer_size=4M
- # 慢查询日志
- - --slow_query_log=ON
- - --long_query_time=0.5
- - --log_output=TABLE
- ulimits:
- nofile:
- soft: 65535
- hard: 65535
- volumes:
- - mysql_data:/var/lib/mysql
- healthcheck:
- test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p\"$${MYSQL_ROOT_PASSWORD}\" --silent"]
- interval: 10s
- timeout: 5s
- retries: 30
- networks:
- - emp-net
-
- redis:
- image: ${REDIS_IMAGE:-redis:7-alpine}
- restart: unless-stopped
- environment:
- REDIS_PASSWORD: ${REDIS_PASSWORD}
- command: ["sh", "-c", "redis-server --appendonly yes --requirepass \"$${REDIS_PASSWORD}\""]
- volumes:
- - redis_data:/data
- healthcheck:
- test: ["CMD-SHELL", "redis-cli -a \"$${REDIS_PASSWORD}\" ping | grep -q PONG"]
- interval: 10s
- timeout: 5s
- retries: 30
- networks:
- - emp-net
-
- kafka:
- image: ${KAFKA_IMAGE:-bitnami/kafka:3.7.0}
- profiles:
- - local-kafka
- restart: unless-stopped
- ports:
- - "0.0.0.0:${KAFKA_HOST_PORT:-29362}:9094"
- environment:
- ALLOW_PLAINTEXT_LISTENER: "yes"
- KAFKA_CFG_NODE_ID: 1
- KAFKA_CFG_PROCESS_ROLES: controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093
- KAFKA_CFG_LISTENERS: INTERNAL://:9092,CONTROLLER://:9093,EXTERNAL://:9094
- KAFKA_CFG_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,EXTERNAL://${PUBLIC_HOST}:${KAFKA_HOST_PORT:-29362}
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME: INTERNAL
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: "true"
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR: 1
- volumes:
- - kafka_data:/bitnami/kafka
- - /data/emp/logs/${IMAGE_NAMESPACE:-emp}/kafka:/opt/bitnami/kafka/logs
- healthcheck:
- test: ["CMD-SHELL", "/opt/bitnami/kafka/bin/kafka-topics.sh --bootstrap-server 127.0.0.1:9092 --list >/dev/null 2>&1"]
- interval: 10s
- timeout: 5s
- retries: 30
- networks:
- - emp-net
-
- kafka-init:
- image: ${KAFKA_IMAGE:-bitnami/kafka:3.7.0}
- profiles:
- - local-kafka
- restart: "no"
- depends_on:
- kafka:
- condition: service_healthy
- entrypoint: ["/bin/bash", "-ec"]
- environment:
- KAFKA_TOPIC: ${KAFKA_TOPIC:-vehicle-data}
- command: |
- echo "create kafka topic: $${KAFKA_TOPIC}"
- /opt/bitnami/kafka/bin/kafka-topics.sh \
- --bootstrap-server kafka:9092 \
- --create \
- --if-not-exists \
- --topic "$${KAFKA_TOPIC}" \
- --partitions 3 \
- --replication-factor 1
- /opt/bitnami/kafka/bin/kafka-topics.sh \
- --bootstrap-server kafka:9092 \
- --describe \
- --topic "$${KAFKA_TOPIC}"
- networks:
- - emp-net
-
- tdengine:
- image: ${TDENGINE_IMAGE:-tdengine/tdengine:3.3.6.0}
- hostname: tdengine
- privileged: true
- restart: unless-stopped
- ports:
- - "0.0.0.0:${TDENGINE_UI_HOST_PORT:-${TDENGINE_REST_HOST_PORT:-37363}}:6060"
- environment:
- TZ: Asia/Shanghai
- TAOS_FQDN: tdengine
- TDENGINE_DATABASE: ${TDENGINE_DATABASE:-emp}
- volumes:
- - tdengine_data:/var/lib/taos
- - /data/emp/logs/${IMAGE_NAMESPACE:-emp}/tdengine:/var/log/taos
- healthcheck:
- test: ["CMD-SHELL", "taos -s \"create database if not exists $${TDENGINE_DATABASE}; show databases;\" >/dev/null 2>&1"]
- interval: 10s
- timeout: 5s
- retries: 30
- networks:
- - emp-net
-
- nacos:
- image: ${NACOS_IMAGE:-nacos/nacos-server:v2.3.2-slim}
- restart: unless-stopped
- mem_limit: ${NACOS_MEM_LIMIT:-3g}
- environment:
- MODE: standalone
- SPRING_DATASOURCE_PLATFORM: ""
- JVM_XMS: ${NACOS_JVM_XMS:-2g}
- JVM_XMX: ${NACOS_JVM_XMX:-2g}
- JVM_XMN: ${NACOS_JVM_XMN:-1g}
- NACOS_AUTH_ENABLE: ${NACOS_AUTH_ENABLE:-true}
- NACOS_AUTH_IDENTITY_KEY: ${NACOS_AUTH_IDENTITY_KEY:-emp}
- NACOS_AUTH_IDENTITY_VALUE: ${NACOS_AUTH_IDENTITY_VALUE:-emp2026}
- NACOS_AUTH_TOKEN: ${NACOS_AUTH_TOKEN}
- volumes:
- - nacos_data:/home/nacos/data
- - /data/emp/logs/${IMAGE_NAMESPACE:-emp}/nacos:/home/nacos/logs
- healthcheck:
- test: ["CMD-SHELL", "curl -sf http://127.0.0.1:8848/nacos/actuator/health || exit 1"]
- interval: 10s
- timeout: 5s
- retries: 30
- networks:
- - emp-net
-
- emp-gateway:
- <<: *app-env
- image: ${IMAGE_NAMESPACE:-emp-test}/emp-gateway:${IMAGE_TAG:-latest}
- mem_limit: ${EMP_GATEWAY_MEM_LIMIT:-3g}
- volumes:
- - /data/emp/logs/${IMAGE_NAMESPACE:-emp}/emp-gateway:/logs
- environment:
- <<: *java-file-log
- JAVA_TOOL_OPTIONS: "${EMP_GATEWAY_JAVA_TOOL_OPTIONS:--Xms1g -Xmx2g}"
- LOGGING_FILE_NAME: /logs/emp-gateway.log
- LOGGING_LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN: /logs/emp-gateway-%d{yyyy-MM-dd}.%i.log
- depends_on:
- <<: *java-depends
-
- emp-auth:
- <<: *app-env
- image: ${IMAGE_NAMESPACE:-emp-test}/emp-auth:${IMAGE_TAG:-latest}
- mem_limit: ${EMP_AUTH_MEM_LIMIT:-3g}
- volumes:
- - /data/emp/logs/${IMAGE_NAMESPACE:-emp}/emp-auth:/logs
- environment:
- <<: *java-file-log
- JAVA_TOOL_OPTIONS: "${EMP_AUTH_JAVA_TOOL_OPTIONS:--Xms1g -Xmx2g}"
- LOGGING_FILE_NAME: /logs/emp-auth.log
- LOGGING_LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN: /logs/emp-auth-%d{yyyy-MM-dd}.%i.log
- depends_on:
- <<: *java-depends
-
- emp-monitor:
- <<: *app-env
- image: ${IMAGE_NAMESPACE:-emp-test}/emp-monitor:${IMAGE_TAG:-latest}
- mem_limit: ${EMP_MONITOR_MEM_LIMIT:-5g}
- volumes:
- - /data/emp/logs/${IMAGE_NAMESPACE:-emp}/emp-monitor:/logs
- environment:
- <<: *java-file-log
- JAVA_TOOL_OPTIONS: "${EMP_MONITOR_JAVA_TOOL_OPTIONS:--Xms2g -Xmx4g}"
- LOGGING_FILE_NAME: /logs/emp-monitor.log
- LOGGING_LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN: /logs/emp-monitor-%d{yyyy-MM-dd}.%i.log
- depends_on:
- <<: *java-depends
- tdengine:
- condition: service_healthy
- emp-pdf:
- condition: service_healthy
-
- emp-data:
- <<: *app-env
- image: ${IMAGE_NAMESPACE:-emp-test}/emp-data:${IMAGE_TAG:-latest}
- mem_limit: ${EMP_DATA_MEM_LIMIT:-5g}
- volumes:
- - /data/emp/logs/${IMAGE_NAMESPACE:-emp}/emp-data:/logs
- environment:
- <<: *java-file-log
- JAVA_TOOL_OPTIONS: "${EMP_DATA_JAVA_TOOL_OPTIONS:--Xms2g -Xmx4g}"
- LOGGING_FILE_NAME: /logs/emp-data.log
- LOGGING_LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN: /logs/emp-data-%d{yyyy-MM-dd}.%i.log
- depends_on:
- <<: *java-depends
- tdengine:
- condition: service_healthy
- emp-ws:
- condition: service_started
-
- emp-pdf:
- <<: *app-env
- image: ${IMAGE_NAMESPACE:-emp-test}/emp-pdf:${IMAGE_TAG:-latest}
- environment:
- PORT: 3100
- volumes:
- - /data/emp/logs/${IMAGE_NAMESPACE:-emp}/emp-pdf:/logs
- command: ["/bin/sh", "-c", "exec node server.js >> /logs/emp-pdf.log 2>&1"]
- healthcheck:
- test: ["CMD-SHELL", "node -e \"require('http').get('http://127.0.0.1:3100/pdf', r => { r.resume(); process.exit(r.statusCode < 500 ? 0 : 1) }).on('error', () => process.exit(1))\""]
- interval: 10s
- timeout: 5s
- retries: 30
-
- emp-ws:
- <<: *app-env
- image: ${IMAGE_NAMESPACE:-emp-test}/emp-ws:${IMAGE_TAG:-latest}
- ports:
- - "0.0.0.0:${WS_HOST_PORT:-37362}:3000"
- volumes:
- - /data/emp/logs/${IMAGE_NAMESPACE:-emp}/emp-ws:/logs
- command: ["/bin/sh", "-c", "exec node server.js >> /logs/emp-ws.log 2>&1"]
- depends_on:
- mysql:
- condition: service_healthy
- redis:
- condition: service_healthy
-
- emp-admin:
- image: ${IMAGE_NAMESPACE:-emp-test}/emp-admin:${IMAGE_TAG:-latest}
- restart: unless-stopped
- ports:
- - "0.0.0.0:${ADMIN_HOST_PORT:-37361}:80"
- volumes:
- - /data/emp/logs/${IMAGE_NAMESPACE:-emp}/emp-admin:/var/log/nginx
- depends_on:
- emp-gateway:
- condition: service_started
- emp-ws:
- condition: service_started
- networks:
- - emp-net
-
- networks:
- emp-net:
- driver: bridge
-
- volumes:
- mysql_data:
- redis_data:
- kafka_data:
- tdengine_data:
- nacos_data:
|