services: backend: build: ./server container_name: email-backend restart: unless-stopped env_file: - compose.full.env ports: - "25:25" depends_on: mysql: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-fsS", "http://localhost:3000/health"] interval: 10s timeout: 3s retries: 10 networks: - email-network mysql: image: mysql:8.0 container_name: email-mysql restart: unless-stopped env_file: - compose.full.env environment: TZ: Asia/Shanghai volumes: - mysql-data:/var/lib/mysql healthcheck: test: [ "CMD-SHELL", "mysqladmin ping -h localhost -p$${MYSQL_ROOT_PASSWORD} --silent", ] interval: 10s timeout: 5s retries: 10 networks: - email-network redis: image: redis:7.4-alpine container_name: email-redis restart: unless-stopped command: ["redis-server", "--appendonly", "yes"] volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 10 networks: - email-network frontend: build: ./frontend container_name: email-frontend restart: unless-stopped depends_on: backend: condition: service_healthy networks: - email-network admin: build: ./admin container_name: email-admin restart: unless-stopped ports: - "8081:80" depends_on: backend: condition: service_healthy networks: - email-network nginx: image: nginx:1.27-alpine container_name: email-nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./nginx.full.conf:/etc/nginx/nginx.conf:ro - ./certs:/etc/nginx/certs:ro depends_on: frontend: condition: service_started admin: condition: service_started backend: condition: service_healthy networks: - email-network networks: email-network: driver: bridge volumes: mysql-data: {} redis-data: {}