version: "3.8" services: # PostgreSQL 数据库 (生产环境) postgres: image: postgres:16.9 container_name: tyapi-postgres-prod environment: TZ: Asia/Shanghai PGTZ: Asia/Shanghai POSTGRES_DB: tyapi POSTGRES_USER: tyapi_user POSTGRES_PASSWORD: Pg9mX4kL8nW2rT5y POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --lc-collate=C --lc-ctype=C" # 性能优化配置 POSTGRES_SHARED_PRELOAD_LIBRARIES: pg_stat_statements volumes: - postgres_data:/var/lib/postgresql/data - ./scripts/init.sql:/docker-entrypoint-initdb.d/init.sql networks: - tyapi-network healthcheck: test: ["CMD-SHELL", "pg_isready -U tyapi_user -d tyapi -h localhost"] interval: 30s timeout: 10s retries: 5 start_period: 120s restart: unless-stopped deploy: resources: limits: memory: 2G cpus: "1.0" reservations: memory: 512M cpus: "0.5" # 生产环境暴露数据库端口到主机 ports: - "25010:5432" # Redis 缓存 (生产环境) redis: image: redis:8.0.2 container_name: tyapi-redis-prod environment: TZ: Asia/Shanghai REDIS_PASSWORD: "" volumes: - redis_data:/data - ./deployments/docker/redis.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.conf networks: - tyapi-network healthcheck: test: redis-cli ping interval: 30s timeout: 10s retries: 5 restart: unless-stopped deploy: resources: limits: memory: 1G cpus: "0.5" reservations: memory: 256M cpus: "0.2" # 生产环境不暴露端口到主机 # ports: # - "6379:6379" # TYAPI 应用程序 tyapi-app: build: context: . dockerfile: Dockerfile args: VERSION: 1.0.0 COMMIT: dev BUILD_TIME: "" container_name: tyapi-app-prod environment: # 时区配置 TZ: Asia/Shanghai # 环境设置 ENV: production ports: - "25000:8080" volumes: - ./logs:/app/logs # user: "1001:1001" # 注释掉,使用root权限运行 networks: - tyapi-network depends_on: postgres: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 5 start_period: 60s restart: unless-stopped deploy: resources: limits: memory: 1G cpus: "1.0" reservations: memory: 256M cpus: "0.3" # TYAPI Worker 服务 tyapi-worker: build: context: . dockerfile: Dockerfile.worker args: VERSION: 1.0.0 COMMIT: dev BUILD_TIME: "" container_name: tyapi-worker-prod environment: # 时区配置 TZ: Asia/Shanghai # 环境设置 ENV: production volumes: - ./logs:/root/logs # user: "1001:1001" # 注释掉,使用root权限运行 networks: - tyapi-network depends_on: postgres: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "ps", "aux", "|", "grep", "worker"] interval: 30s timeout: 10s retries: 5 start_period: 60s restart: unless-stopped deploy: resources: limits: memory: 512M cpus: "0.5" reservations: memory: 128M cpus: "0.1" # Asynq 任务监控 (生产环境) asynq-monitor: image: hibiken/asynqmon:latest container_name: tyapi-asynq-monitor-prod environment: TZ: Asia/Shanghai ports: - "25080:8080" command: --redis-addr=tyapi-redis-prod:6379 networks: - tyapi-network depends_on: redis: condition: service_healthy healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 5 start_period: 30s restart: unless-stopped deploy: resources: limits: memory: 256M cpus: "0.3" reservations: memory: 64M cpus: "0.1" volumes: postgres_data: driver: local redis_data: driver: local networks: tyapi-network: driver: bridge