version: '3.8' services: # PostgreSQL 数据库 postgres: image: postgres:16-alpine container_name: acg_blog_db restart: unless-stopped environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: acg_blog volumes: - postgres_data:/var/lib/postgresql/data - ./backend/schema.sql:/docker-entrypoint-initdb.d/schema.sql:ro ports: - "5432:5432" networks: - acg_blog_network # Redis 缓存 redis: image: redis:7-alpine container_name: acg_blog_redis restart: unless-stopped ports: - "6379:6379" volumes: - redis_data:/data networks: - acg_blog_network # 后端 API backend: build: context: ./backend dockerfile: Dockerfile container_name: acg_blog_backend restart: unless-stopped environment: - DB_HOST=postgres - DB_PORT=5432 - DB_USER=postgres - DB_PASSWORD=postgres - DB_NAME=acg_blog - REDIS_HOST=redis - REDIS_PORT=6379 - SECRET_KEY=your-secret-key-change-in-production - DEBUG=false ports: - "8000:8000" depends_on: - postgres - redis networks: - acg_blog_network # 前端 Nginx frontend: build: context: ./frontend dockerfile: Dockerfile container_name: acg_blog_frontend restart: unless-stopped ports: - "80:80" depends_on: - backend networks: - acg_blog_network volumes: postgres_data: redis_data: networks: acg_blog_network: driver: bridge