x-app-env: &app-env env_file: - .env restart: unless-stopped networks: - emp-net 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 - --max-connections=1000 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 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_REST_HOST_PORT:-37363}:6041" environment: TZ: Asia/Shanghai TAOS_FQDN: tdengine TDENGINE_DATABASE: ${TDENGINE_DATABASE:-emp} volumes: - tdengine_data:/var/lib/taos - tdengine_log:/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 environment: MODE: standalone JVM_XMS: 256m JVM_XMX: 512m SPRING_DATASOURCE_PLATFORM: "" 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 - nacos_logs:/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} depends_on: <<: *java-depends emp-auth: <<: *app-env image: ${IMAGE_NAMESPACE:-emp-test}/emp-auth:${IMAGE_TAG:-latest} depends_on: <<: *java-depends emp-monitor: <<: *app-env image: ${IMAGE_NAMESPACE:-emp-test}/emp-monitor:${IMAGE_TAG:-latest} 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} 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 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" 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" 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: tdengine_log: nacos_data: nacos_logs: