44e77dcb0e
**重构前**(旧编号 02-11): - docs/02-产品需求/ → 00 产品规划/PRD - docs/03-技术架构/ → 01-05 子目录散落 - docs/04-原型设计/ → 01-02 产品设计(HTML 原型) - docs/05-原型设计/ → screens/ - docs/06-测试素材/ → 02-E2E / 03-功能 / 04-版本测试 - docs/07-项目管理/ → 任务说明书/日报/计划 - docs/08-安全审计/ → 审计报告 - docs/09-堡垒运维/ → toolbox / deploy - docs/10-项目管理/ → 任务说明书(重复) - docs/11-历史归档/ → deploy-nas-archived **重构后**(新编号 00-07,语义化): - docs/00-产品开发流程与文档管理规范.md - docs/00-版本迭代总览.md - docs/01-产品文档/ (PRD/原型/认证/会话/AI 服务/坐席/集成) - docs/02-技术文档/ (技术方案/架构图/重构记录/前端改造/实现配置) - docs/03-测试文档/ (E2E/功能用例/版本报告/缺陷单) - docs/04-运维文档/ (部署运维/运维指南) - docs/05-运营文档/ (品牌推广/用户手册) - docs/06-安全审计/ (审计报告) - docs/07-项目管理/ (任务说明书/日报/计划/看板) **净收益**: - 目录编号与产品文档管理规范对齐(按文档阶段 01-07 编号) - 消除 02-产品需求 与 10-项目管理 的编号重叠 - 子目录按文档类型分组(如 01-产品文档/00-产品规划、01-产品文档/01-认证与登录) - 把运维/安全/项目管理从 0X 散落改为 04/06/07 合计 494 文件 + 78495 行 / - 14076 行
55 lines
2.2 KiB
Python
55 lines
2.2 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
修复 docker-compose.yml 中 REDIS_URL 默认值的 URL-encode 问题。
|
|
|
|
背景:
|
|
- 2026-06-15 故障:REDIS_URL 里的密码 R3d!s@2026#Secure 含 @ # 两个 URL 保留字符,
|
|
Python redis 库解析时密码被截断成 R3d!s,导致鉴权失败 → Redis 连接超时
|
|
- 修复:把密码 URL-encode(@→%40, #→%23, !→%21)
|
|
- ⚠️ 关键: 只 URL-encode REDIS_URL 那行的密码,redis-server --requirepass
|
|
和 healthcheck 的 redis-cli -a 都必须保持**明文**(否则 Redis 容器启动失败/鉴权失败)
|
|
|
|
用法:
|
|
sudo python3 /tmp/patch-redis-url.py
|
|
"""
|
|
fp = '/opt/wecom-it-desk/docker-compose.yml'
|
|
|
|
# 读取当前内容
|
|
with open(fp, encoding='utf-8') as f:
|
|
c = f.read()
|
|
|
|
# 旧值(精确匹配 REDIS_URL 那一行,带 redis://://@ 上下文,避免误改 --requirepass)
|
|
old = 'REDIS_URL=redis://:${REDIS_PASSWORD:-R3d!s@2026#Secure}@redis:6379/0'
|
|
|
|
# 新值:URL-encode 后的密码(!→%21, @→%40, #→%23),仅 REDIS_URL 这一行
|
|
new = 'REDIS_URL=redis://:${REDIS_PASSWORD:-R3d%21s%402026%23Secure}@redis:6379/0'
|
|
|
|
# 检查是否已经修复过(幂等性)
|
|
if old in c:
|
|
print('[OK] 检测到未编码版本,准备修复...')
|
|
c2 = c.replace(old, new, 1) # 只替换第一次出现(更安全)
|
|
with open(fp, 'w', encoding='utf-8') as f:
|
|
f.write(c2)
|
|
delta = len(c2) - len(c)
|
|
print('[OK] 已修复:REDIS_URL 行的密码已 URL-encode')
|
|
print(f'[OK] 文件长度变化:{delta:+d} 字节')
|
|
elif new in c:
|
|
print('[OK] 已经修复过,跳过(幂等性 OK)')
|
|
else:
|
|
print('[ERROR] 既没找到旧值也没找到新值,请人工检查 docker-compose.yml')
|
|
print('---')
|
|
print('当前 REDIS_URL 相关配置:')
|
|
import subprocess
|
|
result = subprocess.run(['grep', '-n', 'REDIS_URL\\|REDIS_PASSWORD\\|--requirepass\\|redis-cli', fp],
|
|
capture_output=True, text=True)
|
|
print(result.stdout)
|
|
exit(1)
|
|
|
|
# 验证:确保 --requirepass 和 redis-cli 仍然是明文(没被误改)
|
|
import subprocess
|
|
result = subprocess.run(['grep', '-nE', 'REDIS_URL|--requirepass|redis-cli.*-a', fp],
|
|
capture_output=True, text=True)
|
|
print('---')
|
|
print('当前所有密码相关行(应只有 REDIS_URL 一行是 URL-encoded,其他保持明文):')
|
|
print(result.stdout)
|