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 frontend: build: context: ./frontend dockerfile: Dockerfile args: VITE_API_BASE_URL: ${VITE_API_BASE_URL:-} container_name: ctms_frontend restart: always ports: - "4173:4173" networks: - ctms_net networks: ctms_net: driver: bridge