Commit 09211dc4 by luoqi

chore(deploy): 预置托管 DB/Redis 切换(compose override + COMPOSE_MANAGED 开关)

走阿里云 RDS/Redis 时应用代码零改动,只需:
- docker-compose.managed.yml:profile 排除自带 postgres/redis,pac-service/migrate 的
  DATABASE_URL/REDIS_URL 走 .env 托管端点,!reset/!override 清掉对自带 DB 的 depends_on。
- deploy-prod.sh:COMPOSE_MANAGED=1 自动叠加该 override(默认自带模式不受影响)。
- README:托管用法 + 两个坑(Redis 用标准版非集群、RDS 与应用同 VPC/同可用区)。
compose config 已验证:托管模式服务清单无 postgres/redis,依赖/URL 均正确。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
parent dda05086
Pipeline #3362 failed in 0 seconds
......@@ -94,6 +94,23 @@ server {
```
TLS 证书自备(Let's Encrypt / 云证书);域名要和 `.env``PAC_DOMAIN` 一致。
### 托管 DB/Redis(阿里云 RDS + Redis,可选)
默认自带 PG/Redis(compose 内置)。要走托管:①gen-env 时传托管连接串,②部署时加 `COMPOSE_MANAGED=1`。应用代码零改动。
```bash
# ① 生成 env 时指向托管端点(不启自带 PG/Redis)
DATABASE_URL='postgresql://pac:<pwd>@<rds-host>:5432/pac?schema=public' \
REDIS_URL='redis://:<pwd>@<redis-host>:6379' \
PAC_DOMAIN=... DW_CLICKHOUSE_URL=... DEEPSEEK_API_KEY=... QWEN_API_KEY=... ALERT_WEBHOOK_URL=... \
bash deploy/gen-env.sh
# ② 部署叠加托管 override(docker-compose.managed.yml:不启自带 PG/Redis)
COMPOSE_MANAGED=1 bash deploy/deploy-prod.sh
# 同理增量/首灌等 compose 命令要托管时都加 -f docker-compose.managed.yml
```
⚠️ Redis 用**标准版(单机/主从)**,别用集群版(集群要改代码)。⚠️ RDS 与应用**同 VPC / 同可用区**(重算含大量 DB 往返,跨网络会明显变慢)。
**必须换成生产值**:`PAC_DOMAIN``DATABASE_URL`/`POSTGRES_PASSWORD``REDIS_URL``DW_CLICKHOUSE_*``DEEPSEEK_API_KEY``ALERT_WEBHOOK_URL`
**红线**:JWT 两把密钥切勿复用其他环境(gen-env 已随机);生产 `PAC_ENABLE_MOCK_LOGIN=false`(gen-env 已设,开着=任何人可假冒登录)。PG 密码含 `@:/?#&` 会破坏 `DATABASE_URL`,用 URL 安全字符或直接传完整 `DATABASE_URL=`
......
......@@ -22,8 +22,10 @@ die() { printf '\033[1;31mFAIL: %s\033[0m\n' "$*" >&2; exit 1; }
main() {
cd "$(dirname "$0")/.."
local COMPOSE=(docker compose -f docker-compose.prod.yml
--env-file apps/pac-service/.env --env-file apps/pac-web/.env)
# 托管 DB/Redis:COMPOSE_MANAGED=1 叠加 override(不启自带 PG/Redis,URL 走 .env 的托管端点)
local COMPOSE=(docker compose -f docker-compose.prod.yml)
[[ "${COMPOSE_MANAGED:-0}" == "1" ]] && COMPOSE+=(-f docker-compose.managed.yml)
COMPOSE+=(--env-file apps/pac-service/.env --env-file apps/pac-web/.env)
local SERVICES=(pac-migrate pac-service pac-web)
# 语音 ASR 可选(compose profile=asr),默认不部署;要语音助手用 WITH_ASR=1 bash deploy/deploy-prod.sh
[[ "${WITH_ASR:-0}" == "1" ]] && SERVICES+=(pac-asr)
......
# ─── 托管 DB/Redis override(阿里云 RDS + Redis 标准版)──────────────────
# 默认(自带 PG/Redis)不受影响;走托管时叠加本 override 即可,应用代码零改动。
#
# 用法(二选一):
# COMPOSE_MANAGED=1 bash deploy/deploy-prod.sh
# docker compose -f docker-compose.prod.yml -f docker-compose.managed.yml \
# --env-file apps/pac-service/.env --env-file apps/pac-web/.env <cmd>
#
# 前提:.env 的 DATABASE_URL / REDIS_URL 指向托管端点
# gen-env 生成时传 DATABASE_URL='postgresql://user:pwd@<rds-host>:5432/pac?schema=public' \
# REDIS_URL='redis://:<pwd>@<redis-host>:6379' 即可(见 deploy/gen-env.sh)。
#
# ⚠️ Redis 用【标准版(单机/主从)】,别用集群版 —— 集群要 hash-tag + 集群客户端 = 改代码。
# ⚠️ RDS 与应用【同 VPC / 同可用区】—— 重算含大量 DB 往返,跨网络延迟会显著拖慢。
services:
# 自带 PG/Redis 挪到未激活 profile → 本 override 下不启动(托管接管)
postgres:
profiles: ["bundled-db-off"]
redis:
profiles: ["bundled-db-off"]
# 迁移容器:去掉对自带 postgres 的依赖,DB 指向托管
pac-migrate:
depends_on: !reset null
environment:
DATABASE_URL: ${DATABASE_URL:?托管模式需在 .env 设 DATABASE_URL(指向 RDS)}
# 后端:只依赖迁移完成;DB/Redis 指向托管(覆盖自带内网地址)
pac-service:
depends_on: !override
pac-migrate:
condition: service_completed_successfully
environment:
DATABASE_URL: ${DATABASE_URL:?托管模式需在 .env 设 DATABASE_URL(指向 RDS)}
REDIS_URL: ${REDIS_URL:?托管模式需在 .env 设 REDIS_URL(指向托管 Redis)}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment