| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 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
|