#!/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)