# 生产加固覆盖层 —— 与 base 叠加使用(base 保持 dev 便利,本文件收紧安全): # docker compose -f docker-compose.yml -f docker-compose.prod.yml build # docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d # # 需在宿主机 .env(chmod 600,勿入库)或环境变量提供以下必填项(缺失即拒绝 up / config 报错): # POSTGRES_PASSWORD —— pg 强随机口令(替换 base 的弱口令 writer/writer) # CREDENTIAL_ENC_KEY —— Fernet key(生产新生成,勿用 .env.example 占位值) # CORS_ORIGINS —— 前端真实来源,逗号分隔,禁通配 * # NEXT_PUBLIC_API_BASE—— 浏览器可达的公网 API 基址(构建期内联进 web bundle) services: pg: environment: POSTGRES_USER: writer POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD 必填(生产强口令,勿用 base 弱口令)} POSTGRES_DB: writer # 不对公网暴露:仅绑本机回环(供宿主机跑迁移)。彻底隔离可整段删掉只走 compose 内网。 ports: - "127.0.0.1:5432:5432" restart: unless-stopped api: environment: DATABASE_URL: postgresql+asyncpg://writer:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD 必填}@pg:5432/writer DATABASE_URL_SYNC: postgresql+psycopg://writer:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD 必填}@pg:5432/writer APP_ENV: prod LOG_JSON: "true" CREDENTIAL_ENC_KEY: ${CREDENTIAL_ENC_KEY:?CREDENTIAL_ENC_KEY 必填(生产 Fernet key,勿用占位值)} CORS_ORIGINS: ${CORS_ORIGINS:?CORS_ORIGINS 必填(前端真实来源,逗号分隔,禁通配)} restart: unless-stopped web: build: context: ./apps/web args: # 构建期内联:生产须指向浏览器可达的公网 API(通常反代后的 https 域名)。 NEXT_PUBLIC_API_BASE: ${NEXT_PUBLIC_API_BASE:?NEXT_PUBLIC_API_BASE 必填(浏览器可达的公网 API 基址)} environment: NEXT_PUBLIC_API_BASE: ${NEXT_PUBLIC_API_BASE:?NEXT_PUBLIC_API_BASE 必填} API_BASE_INTERNAL: http://api:8000 restart: unless-stopped