name: news-aggregator services: postgres: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} TZ: ${TZ} volumes: - pg_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 # 不暴露到宿主机 expose: - "5432" logging: driver: json-file options: max-size: "10m" max-file: "3" redis: image: redis:7-alpine restart: unless-stopped command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}", "--maxmemory", "256mb", "--maxmemory-policy", "allkeys-lru"] volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"] interval: 10s timeout: 3s retries: 5 expose: - "6379" logging: driver: json-file options: max-size: "10m" max-file: "3" api: build: context: ./backend dockerfile: Dockerfile restart: unless-stopped env_file: .env depends_on: postgres: condition: service_healthy redis: condition: service_healthy expose: - "8000" volumes: - ./backend/app:/app/app command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] logging: driver: json-file options: max-size: "10m" max-file: "3" worker: build: context: ./backend dockerfile: Dockerfile restart: unless-stopped env_file: .env depends_on: postgres: condition: service_healthy redis: condition: service_healthy volumes: - ./backend/app:/app/app command: ["python", "-m", "app.workers"] logging: driver: json-file options: max-size: "10m" max-file: "3" caddy: image: caddy:2-alpine restart: unless-stopped env_file: .env ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config depends_on: - api logging: driver: json-file options: max-size: "10m" max-file: "3" frontend: build: context: ./frontend dockerfile: Dockerfile args: VITE_API_BASE: ${VITE_API_BASE:-/api/v1} restart: unless-stopped expose: - "80" depends_on: - api logging: driver: json-file options: max-size: "10m" max-file: "3" volumes: pg_data: redis_data: caddy_data: caddy_config: