fafcf6e732
新镜像 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。
115 lines
5.4 KiB
YAML
115 lines
5.4 KiB
YAML
services:
|
||
litellm:
|
||
mem_limit: 2048m
|
||
image: ghcr.io/berriai/litellm:main-latest # 注意:1.82.7,1.82.8被投毒
|
||
#image: ghcr.io/berriai/litellm@sha256:7c311546c25e7bb6e8cafede9fcd3d0d622ac636b5c9418befaa32e85dfb0186
|
||
container_name: litellm
|
||
restart: unless-stopped
|
||
volumes:
|
||
- ./config.yaml:/app/config.yaml
|
||
# 【关键】挂载自定义脚本到容器根目录
|
||
- ./volc_limit_sync.py:/app/volc_limit_sync.py
|
||
# 自动消耗任务(每日 23:20 由 volc_limit_sync 调度触发)
|
||
- ./volc_consume.py:/app/volc_consume.py
|
||
# 消耗任务语料:宿主真实系统日志(只读)
|
||
- /var/log:/host-var-log:ro
|
||
command:
|
||
- "--config=/app/config.yaml"
|
||
ports:
|
||
- "23003:4000"
|
||
environment:
|
||
TZ: Asia/Shanghai
|
||
# ⚠️ 必须设置这个环境变量,否则 Python 找不到你的脚本
|
||
PYTHONPATH: "/app"
|
||
# ⚠️ 必须保留 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"
|
||
# -------------------------------
|
||
env_file:
|
||
- .env
|
||
depends_on:
|
||
# - db
|
||
- redis # --- New: 依赖 redis 启动 ---
|
||
healthcheck:
|
||
test:
|
||
- CMD-SHELL
|
||
- python3 -c "import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')"
|
||
interval: 300s
|
||
timeout: 10s
|
||
retries: 3
|
||
start_period: 40s
|
||
|
||
# --- New: 添加 Redis 服务 ---
|
||
redis:
|
||
image: redis:alpine # 使用 alpine 版本,体积非常小
|
||
container_name: litellm_redis
|
||
restart: unless-stopped
|
||
# --maxmemory 512mb : 限制 Redis 最多使用 512MB 内存
|
||
# --maxmemory-policy allkeys-lru : 内存满了之后,自动删除最久未使用的缓存(无论是否过期)
|
||
# --save "" : 如果你不需要持久化缓存到硬盘(重启后清空),可以把 save 设为空,减少磁盘IO
|
||
# command: redis-server --save 60 1 --maxmemory 128mb --maxmemory-policy allkeys-lru --loglevel warning
|
||
# --appendonly yes: 开启 AOF,防止 Redis 崩溃/重启丢失快照与用量 key →
|
||
# 避免"额度未同步"fallback 窗口(首次同步前)被大请求烧穿免费额度
|
||
command: redis-server --maxmemory 32mb --maxmemory-policy allkeys-lru --save 300 1 --appendonly yes --appendfsync everysec --loglevel warning
|
||
environment:
|
||
TZ: Asia/Shanghai
|
||
# 配置详解:
|
||
# --maxmemory 32mb: 严格限制内存使用 32MB
|
||
# --maxmemory-policy allkeys-lru: 内存满时挤掉旧数据(安全兜底)
|
||
# --save 300 1: 每300秒(5分钟)如果至少有1个key变化,就保存快照到磁盘 (降低IO)
|
||
volumes:
|
||
# 映射数据目录:不挂载则 down/up 重建容器时 RDB+AOF 随容器删除,
|
||
# 当日用量统计与快照全丢(此前每次重启都丢)。挂载后 down 不删卷,
|
||
# 数据跨重启保留。
|
||
- redis_data:/data
|
||
# ---------------------------
|
||
|
||
# db:
|
||
# image: postgres:16
|
||
# restart: unless-stopped
|
||
# container_name: litellm_db
|
||
# environment:
|
||
# TZ: Asia/Shanghai
|
||
# POSTGRES_DB: litellm
|
||
# POSTGRES_USER: llmproxy
|
||
# POSTGRES_PASSWORD: dbpassword9090
|
||
# volumes:
|
||
# - postgres_data:/var/lib/postgresql/data
|
||
# healthcheck:
|
||
# test: ["CMD-SHELL", "pg_isready -d litellm -U llmproxy"]
|
||
# interval: 5s
|
||
# timeout: 5s
|
||
# retries: 10
|
||
|
||
volumes:
|
||
postgres_data:
|
||
driver: local
|
||
name: litellm_postgres_data
|
||
redis_data: # 如果开启了 redis 持久化,这里也要打开
|
||
driver: local
|
||
# 固定卷名:卷名不再由 compose 项目名(目录名)派生,
|
||
# 目录改名/迁移后 up 不会新建空卷导致数据"丢失"
|
||
name: litellm_redis_data
|