version: "3.9" services: # API 服务 api: build: context: ./api dockerfile: Dockerfile container_name: api_service ports: - "8080:8080" environment: - APP_ENV=development - APP_PORT=8080 - DB_HOST=postgres - DB_PORT=5432 - DB_USER=${DB_USER:-postgres} - DB_PASSWORD=${DB_PASSWORD:-postgres} - DB_NAME=${DB_NAME:-appdb} - DB_SSL_MODE=disable - REDIS_HOST=redis - REDIS_PORT=6379 - REDIS_PASSWORD=${REDIS_PASSWORD:-} - REDIS_DB=0 depends_on: postgres: condition: service_healthy redis: condition: service_healthy networks: - app-network restart: unless-stopped # PostgreSQL 数据库 postgres: image: postgres:18.3-alpine3.23 container_name: postgres_db ports: - "5432:5432" environment: - POSTGRES_USER=${DB_USER:-postgres} - POSTGRES_PASSWORD=${DB_PASSWORD:-postgres} - POSTGRES_DB=${DB_NAME:-appdb} volumes: - postgres_data:/var/lib/postgresql/data - ./migrations:/docker-entrypoint-initdb.d networks: - app-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres} -d ${DB_NAME:-appdb}"] interval: 5s timeout: 5s retries: 5 restart: unless-stopped # Redis 缓存 redis: image: redis:8.6.2-alpine container_name: redis_cache ports: - "6379:6379" command: redis-server --appendonly yes volumes: - redis_data:/data networks: - app-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 5 restart: unless-stopped volumes: postgres_data: redis_data: networks: app-network: driver: bridge