fix(infra): 切换 Redis 至火山引擎实例 + 修复 channels 不支持 ACL username + .env 取消跟踪
All checks were successful
Build and Deploy LTY / build-and-deploy (push) Successful in 8m34s

- 阿里云 Redis 实例 10054 RST 导致 /api/v1/admin/login/ 等接口全线 500,切到火山实例 (db /3, user zyc)
- CHANNEL_LAYERS hosts 由手工拼接 redis://:{pwd}@{host} 改为直接消费 REDIS_LOCATION,支持 ACL username
- .gitignore 恢复 qy_lty/.env 忽略,git rm --cached 移除跟踪;历史中旧密钥仍在,需另行 rotate
- 详见 qy_lty/docs/修改记录.md 2026-05-18 条目

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
pmc 2026-05-18 13:48:14 +08:00
parent cc8ffee168
commit a9d00a49f9
4 changed files with 24 additions and 110 deletions

4
.gitignore vendored
View File

@ -36,8 +36,8 @@ qy-lty-admin/next-env.d.ts
__pycache__/
*.py[cod]
*.pyo
# env files
# qy_lty/.env
# env files(含密钥,禁止入库)
qy_lty/.env
# logs
qy_lty/logs/
# static files collected

View File

@ -1,107 +0,0 @@
SECRET_KEY=django-insecure-j63ZGygyiLWGqhZ-e3ZGH_HGfNVQgBkq*jjpYMz-QYqE46cuuA
DEBUG=True
MYSQL_DATABASE_NAME=lty
MYSQL_DATABASE_USER=root
MYSQL_DATABASE_PASSWORD=123456
MYSQL_DATABASE_HOST=localhost
MYSQL_DATABASE_PORT=3306
# POSTGRESQL_DATABASE_NAME=lty
# POSTGRESQL_DATABASE_USER=postgres
# POSTGRESQL_DATABASE_PASSWORD=123456
# POSTGRESQL_DATABASE_HOST=localhost
# POSTGRESQL_DATABASE_PORT=5432
# 气元pg
POSTGRESQL_DATABASE_NAME=qy_lty
POSTGRESQL_DATABASE_USER=qy_lty
POSTGRESQL_DATABASE_PASSWORD=NfAfCvkad8L2
POSTGRESQL_DATABASE_HOST=pgm-7xv4811oj11j86htzo.pg.rds.aliyuncs.com
POSTGRESQL_DATABASE_PORT=5432
# REDIS_LOCATION=redis://localhost:6379/0
# REDIS_PASSWORD=
# 气元redis
REDIS_LOCATION=redis://r-7xvat0vez5clwbzk5vpd.redis.rds.aliyuncs.com:6379/0
REDIS_PASSWORD=vAhRnAA6VMco
ALIYUN_SMS_ACCESS_KEY_ID=LTAI5t6ZXMo3SbKUg7YrK89m
ALIYUN_SMS_ACCESS_KEY_SECRET=ygDVmjIIAcFgXcaJP7hbiSwOr8hYur
ALIYUN_SMS_SIGN_NAME=广州气元科技
ALIYUN_SMS_TEMPLATE_CODE=SMS_317100048
# 实际是火山的
KIMI_API_KEY=846b6981-9954-4c58-bb39-63079393bdb8
KIMI_BASE_URL=https://ark.cn-beijing.volces.com/api/v3/
# 阿里云日志配置(气元账户)
ALIYUN_LOG_PROJECT=lty
ALIYUN_LOG_STORE=lty-backend
ALIYUN_LOG_ENDPOINT=cn-guangzhou.log.aliyuncs.com
ALIYUN_LOG_ACCESS_KEY_ID=LTAI5tFYGrgcAhscCdEUB9Te
ALIYUN_LOG_ACCESS_KEY_SECRET=YO7Bf3QDH4ErYCNvSssFkHseNsh8PP
# 阿里云语音配置(气元账户)
ALIYUN_NLS_ACCESS_KEY_ID=LTAI5t6tnLjBK9edseDVH849
ALIYUN_NLS_ACCESS_KEY_SECRET=DmiZyjnfQo03KalxYmELOfcDQUIrTX
ALIYUN_NLS_APP_ID=Gxf9gwGYOvUTjzYC
# 阿里云oss配置(气元账户)
ALIYUN_OSS_ACCESS_KEY_ID=LTAI5tL2aUarUR99h2kdKTss
ALIYUN_OSS_ACCESS_KEY_SECRET=62OUrzdty2oQPiPLLt0XTAbKvMT1sO
ALIYUN_OSS_BUCKET=lty-storage
ALIYUN_OSS_ENDPOINT=https://oss-cn-guangzhou.aliyuncs.com
ALIYUN_OSS_HOST=https://lty-storage.airlabs.art
ALIYUN_OSS_AUDIO_BASE_DIR=audio
# 火山语音配置(风也账户,洛天依声音克隆)
AUDIO_SERVICE_HUOSHAN_APPID=5801394478
AUDIO_SERVICE_HUOSHAN_ACCESS_TOKEN=8pNMhvG4H6VWecnYOBmzyLnribeHVhoj
AUDIO_SERVICE_HUOSHAN_CLUSTER=volcano_icl
AUDIO_SERVICE_HUOSHAN_VOICE_TYPE=S_PHQ1AVPl1
AUDIO_SERVICE_HUOSHAN_STORAGE_DIR=audio
AUDIO_SERVICE_HUOSHAN_BASE_URL=https://lty-storage.airlabs.art
AUDIO_SERVICE_ALIYUN_API_KEY=
AUDIO_SERVICE_ALIYUN_API_SECRET=
AUDIO_SERVICE_TENCENT_API_KEY=
AUDIO_SERVICE_TENCENT_API_SECRET=
# 阿里云VI配置
ALIYUN_VI_ACCESS_KEY_ID=LTAI5tHXQGNyAws4eXB7ytYu
ALIYUN_VI_ACCESS_KEY_SECRET=EouZq22js1pmMwMmGep4PWXqJEy9DA
ALIYUN_VI_ENDPOINT=facebody.cn-shanghai.aliyuncs.com
ALIYUN_VI_REGION=cn-shanghai
# # 火山引擎配置(风也账户)
# VOLCENGINE_APP_ID=67b59a4586198401ec980bf9
# VOLCENGINE_APP_KEY=285a4b02b91f425eac74605e6f42178f
# VOLCENGINE_TOKEN_EXPIRE_TIME=2592000
# # 火山引擎RTC ak和sk配置(风也账户)
# VOLCENGINE_ACCESS_KEY=AKLTMGZmMGIxNTU4MjBlNDU2OWE0M2VmMmY2MjBlODkxNzQ
# VOLCENGINE_SECRET_KEY=WldJeU9XSXlNVFprWWpNd05HTmtNVGczTkdNMll6QXpNakEwTm1JM05qSQ==
## 火山引擎配置(气元账户)
#VOLCENGINE_APP_ID=67f3951852477d017d1254d5
#VOLCENGINE_APP_KEY=27d3197d38764205a4cd257df086325d
#VOLCENGINE_TOKEN_EXPIRE_TIME=2592000
## 火山引擎RTC ak和sk配置(气元账户)
#VOLCENGINE_ACCESS_KEY=AKLTNmVmNTU4NmEzNzFjNDYyYTk2OTZjMjMwYTljZGEwMjE
#VOLCENGINE_SECRET_KEY=TnpReFlqQTBaalUwT1RZNU5HSXhaamt3WlRBME5EQmtNVGc1WXpOallqYw==
## 火山引擎RTC ak和sk配置(气元账户)
VOLCENGINE_ACCESS_KEY=AKLTNmVmNTU4NmEzNzFjNDYyYTk2OTZjMjMwYTljZGEwMjE
VOLCENGINE_SECRET_KEY=TnpReFlqQTBaalUwT1RZNU5HSXhaamt3WlRBME5EQmtNVGc1WXpOallqYw==
## 火山引擎配置(气元账户)
VOLCENGINE_APP_ID=68eb092fb8f0ac0173afe8c7
VOLCENGINE_APP_KEY=8b43a113b59c47f3abd65bcd5ce8692d
VOLCENGINE_TOKEN_EXPIRE_TIME=2592000

View File

@ -23,6 +23,27 @@
<!-- 新的修改记录添加在此处下方,最新的在最前面 -->
### [2026-05-18] Redis 切换为火山引擎实例 + 修复 CHANNEL_LAYERS 不支持 ACL username
原阿里云 Redis 实例(`r-7xvat0vez5clwbzk5vpd.redis.rds.aliyuncs.com:6379`)连接被远端 RST10054导致 `/api/v1/admin/login/` 等所有依赖 token / 缓存的接口报 `ConnectionError`。改用火山引擎 Redis 实例(`redis-shzlsczo52dft8mia.redis.volces.com:6379/3`,用户 `zyc`)。
切换过程中发现 `CHANNEL_LAYERS` 配置硬拼 URL 时只放了 password、没有 username导致带 ACL username 的 Redis如本次的火山实例会拼出畸形 URL`redis://:pwd@host` 缺 user。改为直接消费完整 `REDIS_LOCATION`(已含 `zyc:Zyc188208@`),后续切换实例只改 .env 即可。
- **文件路径**:
- `.env`**修改** — 旧 REDIS_LOCATION/PASSWORD 注释保留作为回滚参考;新 REDIS_LOCATION 含完整 `zyc:Zyc188208@` 凭据REDIS_PASSWORD 仍保留 `Zyc188208` 以兼容 `django-redis` OPTIONS.PASSWORD
- `qy_lty/settings.py`**修改** — 第 519 行 CHANNEL_LAYERS hosts 由 `f"redis://:{config('REDIS_PASSWORD')}@{config('REDIS_LOCATION').replace('redis://', '')}"` 改为 `[config('REDIS_LOCATION')]`
- **修改类型**: 配置切换 + 修复Bug
- **修改内容**:
1. Redis 实例 URL 切换到火山引擎,库号由 `/0` 改为 `/3`
2. CHANNEL_LAYERS hosts 不再二次拼接,直接读取完整 URL不再丢失 ACL username
- **修改原因**:
- 阿里云 Redis 不可用(白名单 / 实例状态 / 网络出口任一原因均会触发 10054 RST登录 / token / 缓存全线 500
- channels_redis 接受标准 redis URL`user:pass@`),原硬拼方式只能表达 password-only遇到 ACL 模式实例无法登录通道层
- **验证**: 重启 daphne 后启动日志 `Cache Status: OK`,延迟 296.67msHTTP 8000 监听正常
- **回滚**: 取消 `.env` 中两行火山配置注释 → 取消阿里云两行注释CHANNEL_LAYERS 改回原拼接(若回到不带 username 的实例可保留新写法,更通用)
---
### [2026-05-13] 好感度系统 P2 阶段 — Service 层 + 管理端 API 落地
配套设计文档:[../../docs/好感度系统功能与规则设计.md](../../docs/好感度系统功能与规则设计.md)

View File

@ -516,7 +516,7 @@ CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [f"redis://:{config('REDIS_PASSWORD')}@{config('REDIS_LOCATION').replace('redis://', '')}"],
"hosts": [config('REDIS_LOCATION')],
},
},
}