51 lines
2.9 KiB
YAML
51 lines
2.9 KiB
YAML
# 生产加固覆盖层 —— 与 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 内网(`run --rm api alembic`)直连 pg 服务名,
|
||
# 且宿主已有别的 pg 占用 127.0.0.1:5432。!reset 清掉 base 的 "5432:5432"——否则 compose
|
||
# 会「拼接」两份端口(base 的 0.0.0.0:5432 + 本层),既暴露公网又与宿主 pg 冲突。
|
||
ports: !reset []
|
||
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 必填(前端真实来源,逗号分隔,禁通配)}
|
||
# base 发布 0.0.0.0:8000(dev 便利);生产只绑回环——nginx 是唯一公网入口,basic auth 不可绕过。
|
||
# !override 整体替换 base 的端口列表(否则拼接会残留 0.0.0.0:8000)。
|
||
ports: !override
|
||
- "127.0.0.1:8000:8000"
|
||
restart: unless-stopped
|
||
|
||
web:
|
||
build:
|
||
context: ./apps/web
|
||
args:
|
||
# 构建期内联:生产须指向浏览器可达的公网 API(通常反代后的 https 域名)。
|
||
NEXT_PUBLIC_API_BASE: ${NEXT_PUBLIC_API_BASE:?NEXT_PUBLIC_API_BASE 必填(浏览器可达的公网 API 基址)}
|
||
# 本机所在区域 registry.npmjs.org 不可达,构建走 npmmirror 镜像(可用 env NPM_REGISTRY 覆盖)。
|
||
NPM_REGISTRY: ${NPM_REGISTRY:-https://registry.npmmirror.com}
|
||
environment:
|
||
NEXT_PUBLIC_API_BASE: ${NEXT_PUBLIC_API_BASE:?NEXT_PUBLIC_API_BASE 必填}
|
||
API_BASE_INTERNAL: http://api:8000
|
||
# 只绑回环(同 api):nginx 反代 127.0.0.1:3000 是唯一公网入口。!override 替换 base 的 3000:3000。
|
||
ports: !override
|
||
- "127.0.0.1:3000:3000"
|
||
restart: unless-stopped
|