From fafcf6e732901d7bc452a425743045da92e37523 Mon Sep 17 00:00:00 2001 From: vibe-code Date: Thu, 24 Sep 2026 12:53:19 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20DATABASE=5FURL=20=E5=8A=A0=20client=5Fen?= =?UTF-8?q?coding=3DUTF8,=E4=BF=AE=E5=A4=8D=20SQL=5FASCII=20=E5=BA=93?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新镜像 main-latest 自 2026-09-20 起默认启用 v2 migration resolver (上游 fac518dbf7),v2 启动时调用 _warn_if_db_ahead_of_head() 读 _prisma_migrations。本库 litellm 为 SQL_ASCII(server/client_encoding 均 SQL_ASCII,datcollate=C),psycopg 的 TextLoader 对此直接返回 bytes 而非 str(psycopg/types/string.py:110-120),导致 utils.py:174 的 _MIGRATION_TS_RE.match(bytes) 抛 TypeError,容器启动即崩。 同一缺陷还潜伏在 repair_invalid_indexes/_index_repair (utils.py:760,_TRANSIENT_INDEX_SUFFIX_RE.search(index.name))与 _failed_migration_logs(utils.py:1023,str in bytes),二者 v1/v2 双路径 均会经过,只在对应数据非空时触发(CREATE INDEX CONCURRENTLY 中断或 迁移死锁)。 根因修复:DATABASE_URL 追加 client_encoding=UTF8。libpq 将其作为 启动参数下发(fe-protocol3.c:2503),psycopg 按服务端确认值决定解码 (pq_ctypes.py:229-232),恢复返回 str。Prisma 侧无影响:quaint 丢弃 未知参数(url.rs:459),其驱动 tokio-postgres 本就固定发 client_encoding=UTF8。已全库校验 450 个文本列/43548 行/14.5MB 全部 为合法 UTF-8,无解码失败风险。 另保留 USE_V2_MIGRATION_RESOLVER=false 作独立兜底,沿用更新前的 v1 路径;根因已除后该项可移除以启用 v2。 --- docker-compose.yml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index a9fc779..7860470 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,8 +21,28 @@ services: TZ: Asia/Shanghai # ⚠️ 必须设置这个环境变量,否则 Python 找不到你的脚本 PYTHONPATH: "/app" - DATABASE_URL: "postgresql://litellm_app:shriek-sixfold-ethanol@192.168.1.34:5432/litellm" + # ⚠️ 必须保留 client_encoding=UTF8。 + # 本库 litellm 是 SQL_ASCII 编码(server/client_encoding 均为 SQL_ASCII, + # datcollate=C)。psycopg 对 SQL_ASCII 连接的 TextLoader 直接返回 bytes + # 而非 str(psycopg/types/string.py:110-120),于是 litellm_proxy_extras + # 里 _MIGRATION_TS_RE.match(migration_name)、 + # _TRANSIENT_INDEX_SUFFIX_RE.search(index.name) 等对 bytes 用字符串正则, + # 抛 TypeError: cannot use a string pattern on a bytes-like object。 + # 该参数经 libpq 作为启动参数下发(fe-protocol3.c:2503),使连接按 UTF8 + # 协商;psycopg 读服务端确认值决定解码(pq_ctypes.py:229-232), + # 从而正常返回 str。Prisma 侧无影响:quaint 丢弃未知参数 + # (prisma-engines quaint/src/connector/postgres/url.rs:459), + # 且其驱动 tokio-postgres 本就固定发送 client_encoding=UTF8。 + # 已全库校验:450 个文本列 / 43548 行 / 14.5MB 全部是合法 UTF-8, + # 不存在解码失败风险。 + DATABASE_URL: "postgresql://litellm_app:shriek-sixfold-ethanol@192.168.1.34:5432/litellm?client_encoding=UTF8" STORE_MODEL_IN_DB: "True" + # v2 migration resolver 的额外兜底(可去掉以启用 v2): + # main-latest 自 2026-09-20 起默认启用 v2(上游 commit fac518dbf7), + # v2 会在启动时调用 _warn_if_db_ahead_of_head() —— 即上面那个 TypeError + # 的触发点。上面的 client_encoding 修复已从根因上解除该崩溃, + # 但 v2 还引入迁移协调锁等新机制;保守起见先沿用更新前的 v1 路径。 + USE_V2_MIGRATION_RESOLVER: "false" # --- Modified: 添加 Redis 配置 --- REDIS_HOST: "redis" # 对应下方 redis 服务的名字 REDIS_PORT: "6379"