From a6a8d64fd44e0b686e1266abc2fb58b1a094fbdf Mon Sep 17 00:00:00 2001 From: zyc <1439655764@qq.com> Date: Mon, 18 May 2026 15:15:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(settings):=20tencent=20audio=20config=20?= =?UTF-8?q?=E7=BC=BA=20default=20=E5=AF=BC=E8=87=B4=20Pod=20CrashLoopBackO?= =?UTF-8?q?ff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AUDIO_SERVICE_CONFIG 顶层求值,即使 provider='huoshan' 不走 tencent, config() 缺 default 也会让 settings 整体 import 失败。本地 .env 有空值 兜底所以本地正常;a9d00a4 取消跟踪 .env 后 CI 镜像无兜底,新 Pod 全崩, 老 Pod 因新 Pod 不 ready 未被滚动替换,外部观感即"仍连旧阿里云 Redis"。 Co-Authored-By: Claude Opus 4.7 (1M context) --- qy_lty/docs/修改记录.md | 19 +++++++++++++++++++ qy_lty/qy_lty/settings.py | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/qy_lty/docs/修改记录.md b/qy_lty/docs/修改记录.md index afb818d..574cb89 100644 --- a/qy_lty/docs/修改记录.md +++ b/qy_lty/docs/修改记录.md @@ -23,6 +23,25 @@ +### [2026-05-18] 修复线上 Pod CrashLoopBackOff — settings.py 中 tencent audio key 缺 default 导致 Django 启动炸 + +通过 SSH 登测试服 k3s 排查发现 deploy 后新 Pod 全部 CrashLoopBackOff,老 Pod(4 天前镜像,env 仍是阿里云 Redis)因新 Pod 不 ready 未被替换,外部观感即"推到远端仍连阿里云 Redis"。Pod 日志显示 Django settings import 阶段抛 `decouple.UndefinedValueError: AUDIO_SERVICE_TENCENT_API_KEY not found`。 + +- **文件路径**: + - `qy_lty/settings.py`(**修改** — 第 441/442 行) +- **修改类型**: 修复Bug +- **修改内容**: + - `config('AUDIO_SERVICE_TENCENT_API_KEY')` → `config('AUDIO_SERVICE_TENCENT_API_KEY', default='')` + - `config('AUDIO_SERVICE_TENCENT_API_SECRET')` → `config('AUDIO_SERVICE_TENCENT_API_SECRET', default='')` +- **修改原因**: + - `AUDIO_SERVICE_CONFIG` 是顶层求值的 dict,即使 `AUDIO_SERVICE_PROVIDER='huoshan'` 不走 tencent 分支,`config()` 没 default 时缺环境变量也会让整个 settings 模块 import 失败 + - 本地 `qy_lty/.env` 里有空值 `AUDIO_SERVICE_TENCENT_API_KEY=` 兜底,所以本地正常;commit a9d00a4 把 `.env` 从 Git 取消跟踪后 CI 构建出的镜像里没有 `.env`,K8s yaml 又没声明这两个 key,差异第一次被放大 +- **根因链**: 新 Pod 因缺 env 崩 → readiness 失败 → 老 Pod 未被滚动替换 → 老 Pod 的 REDIS_LOCATION 还是阿里云旧值(验证:`kubectl get pod -o jsonpath='{.spec.containers[0].env...}'` 显示 `redis://r-7xvat0vez5clwbzk5vpd...aliyuncs.com`,新 Pod 显示火山 URL 已正确注入) +- **验证**: push 触发 CI 后 `kubectl get pods -l app=lty-backend` 应只剩新 Pod 且 Running,老 `lty-backend-664c5d6888-*` 自动下线 +- **后续防护建议(未做)**: 把 `AUDIO_SERVICE_CONFIG` 改为 lazy 求值(按 provider 解析),或所有非 active provider 的 `config()` 全部加 default,避免同类问题再现 + +--- + ### [2026-05-18] k8s yaml 与 deploy.yaml sed 源串同步为火山 Redis(消除"yaml 与实际部署不一致") 承接同日 CI deploy.yaml 切换条目,原 k8s/backend-deployment-prod.yaml 里 REDIS_LOCATION/REDIS_PASSWORD 仍是阿里云旧值(作为 sed 的"被替换源占位"),导致直接读 yaml 容易误以为线上跑的是阿里云。本次把 k8s yaml 字面值与 deploy.yaml sed 源串**同步**切到火山,使 yaml 静态读起来即真实部署状态。 diff --git a/qy_lty/qy_lty/settings.py b/qy_lty/qy_lty/settings.py index c8129e1..055cfd6 100644 --- a/qy_lty/qy_lty/settings.py +++ b/qy_lty/qy_lty/settings.py @@ -438,8 +438,8 @@ AUDIO_SERVICE_CONFIG = { 'oss_audio_base_dir': config('ALIYUN_OSS_AUDIO_BASE_DIR') }, 'tencent': { - 'api_key': config('AUDIO_SERVICE_TENCENT_API_KEY'), - 'api_secret': config('AUDIO_SERVICE_TENCENT_API_SECRET') + 'api_key': config('AUDIO_SERVICE_TENCENT_API_KEY', default=''), + 'api_secret': config('AUDIO_SERVICE_TENCENT_API_SECRET', default='') }, 'huoshan': { 'appid': config('AUDIO_SERVICE_HUOSHAN_APPID'),