version: '3.8' services: # 1. Frontend Gateway & Static File Server nginx: build: context: ./frontend dockerfile: Dockerfile ports: ["80:80", "443:443"] volumes: - ./configs/nginx/conf.d:/etc/nginx/conf.d depends_on: app-server: condition: service_started # 2. Backend Service (Golang) app-server: build: context: ./backend dockerfile: Dockerfile restart: always healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/ping"] interval: 10s timeout: 5s retries: 5 environment: - DB_DSN=host=postgres user=${POSTGRES_USER} password=${DB_PASSWORD} dbname=${POSTGRES_DB} port=${POSTGRES_PORT} sslmode=disable - TD_DSN=root:taosdata@tcp(${TD_HOST}:${TD_PORT})/power_db - REDIS_ADDR=${REDIS_HOST}:${REDIS_PORT} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${DB_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_HOST=${POSTGRES_HOST} - POSTGRES_PORT=${POSTGRES_PORT} - JWT_SECRET=${JWT_SECRET} - JWT_EXPIRE_HOURS=${JWT_EXPIRE_HOURS} volumes: - ./backend/logs:/app/logs ports: - "${PORT}:8080" depends_on: - postgres - tdengine - redis # 3. Database: PostgreSQL (Relational Data) postgres: image: postgres:15-alpine container_name: ems-postgres restart: always environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - pg_data:/var/lib/postgresql/data ports: - "5433:5432" # 4. Database: TDengine (Time-Series Data) tdengine: image: tdengine/tdengine:3.3.0.0 container_name: ems-tdengine ports: ["6030:6030"] volumes: - ./data/taos/data:/var/lib/taos - ./data/taos/log:/var/log/taos environment: - TAOS_FIRST_EP=tdengine:6030 # 5. Cache: Redis redis: image: redis:7-alpine container_name: ems-redis ports: ["6379:6379"] volumes: - ./data/redis:/data # 6. Message Broker: EMQX (MQTT) emqx: image: emqx/emqx:5.3.0 ports: - "1883:1883" # MQTT TCP - "8083:8083" # MQTT WebSocket - "18083:18083" # Dashboard # volumes: # - ./configs/emqx:/opt/emqx/etc environment: - EMQX_ALLOW_ANONYMOUS=true # For dev only # 7. Backup Service (Sidecar) pg-backup: image: prodrigestivill/postgres-backup-local restart: always environment: - POSTGRES_HOST=postgres - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${DB_PASSWORD} - SCHEDULE=@daily - BACKUP_KEEP_DAYS=7 - BACKUP_DIR=/backups volumes: - ./backups/postgres:/backups depends_on: - postgres volumes: pg_data: driver: local taos_data: driver: local