fix(settings): tencent audio config 缺 default 导致 Pod CrashLoopBackOff
All checks were successful
Build and Deploy LTY / build-and-deploy (push) Successful in 8m49s

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) <noreply@anthropic.com>
This commit is contained in:
zyc 2026-05-18 15:15:40 +08:00
parent 94f31ad699
commit a6a8d64fd4
2 changed files with 21 additions and 2 deletions

View File

@ -23,6 +23,25 @@
<!-- 新的修改记录添加在此处下方,最新的在最前面 --> <!-- 新的修改记录添加在此处下方,最新的在最前面 -->
### [2026-05-18] 修复线上 Pod CrashLoopBackOff — settings.py 中 tencent audio key 缺 default 导致 Django 启动炸
通过 SSH 登测试服 k3s 排查发现 deploy 后新 Pod 全部 CrashLoopBackOff老 Pod4 天前镜像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 <old-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 与实际部署不一致" ### [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 静态读起来即真实部署状态。 承接同日 CI deploy.yaml 切换条目,原 k8s/backend-deployment-prod.yaml 里 REDIS_LOCATION/REDIS_PASSWORD 仍是阿里云旧值(作为 sed 的"被替换源占位"),导致直接读 yaml 容易误以为线上跑的是阿里云。本次把 k8s yaml 字面值与 deploy.yaml sed 源串**同步**切到火山,使 yaml 静态读起来即真实部署状态。

View File

@ -438,8 +438,8 @@ AUDIO_SERVICE_CONFIG = {
'oss_audio_base_dir': config('ALIYUN_OSS_AUDIO_BASE_DIR') 'oss_audio_base_dir': config('ALIYUN_OSS_AUDIO_BASE_DIR')
}, },
'tencent': { 'tencent': {
'api_key': config('AUDIO_SERVICE_TENCENT_API_KEY'), 'api_key': config('AUDIO_SERVICE_TENCENT_API_KEY', default=''),
'api_secret': config('AUDIO_SERVICE_TENCENT_API_SECRET') 'api_secret': config('AUDIO_SERVICE_TENCENT_API_SECRET', default='')
}, },
'huoshan': { 'huoshan': {
'appid': config('AUDIO_SERVICE_HUOSHAN_APPID'), 'appid': config('AUDIO_SERVICE_HUOSHAN_APPID'),