services: db: image: postgres:15-alpine container_name: ctms_db restart: always environment: POSTGRES_USER: ctms_user POSTGRES_PASSWORD: secret_password POSTGRES_DB: ctms_db volumes: # 持久化数据到 Linux 本地,防止重启丢失 - ./pg_data:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ctms_user -d ctms_db"] interval: 5s timeout: 5s retries: 5 networks: - ctms_net backend: build: context: ./backend dockerfile: Dockerfile container_name: ctms_backend restart: always ports: - "8000:8000" environment: DATABASE_URL: postgresql+asyncpg://ctms_user:secret_password@db/ctms_db depends_on: db: condition: service_healthy networks: - ctms_net backend-init: build: context: ./backend dockerfile: Dockerfile command: python scripts/init_production.py environment: DATABASE_URL: postgresql+asyncpg://ctms_user:secret_password@db/ctms_db depends_on: db: condition: service_healthy profiles: ["init"] networks: - ctms_net nginx: build: context: . dockerfile: nginx/Dockerfile container_name: ctms_nginx restart: always ports: - "8888:80" volumes: - ./nginx/certs:/etc/nginx/certs:ro - ./frontend/public/favicon.ico:/usr/share/nginx/html/favicon.ico:ro depends_on: - backend networks: - ctms_net networks: ctms_net: driver: bridge