Adds a lightweight way to pre-seed a Lingma workDir with an existing logged-in session: - New module session_bundle.py packs/unpacks only the four cache files that make up a Lingma login (id, user, quota, config.json). Everything else (db, logs, index, diagnosis) stays local so bundles stay tiny and never leak session-specific artefacts. - Safety: path-traversal/symlink members are rejected; size is capped; refuses to export from a workDir that isn't actually logged in; sensitive cache/user is chmod'd 0600 on restore. - LingmaAccount gains optional session_bundle_b64 / session_bundle_file; LINGMA_SESSION_BUNDLE[_FILE] env provide the singleton fallback. Credentials become optional when a bundle is supplied. - LingmaPool.start() restores the bundle into each instance workDir only if it isn't already logged in, so persistent volumes aren't clobbered and a corrupt bundle falls back to Playwright gracefully. - POST /internal/session/export returns the bundle as base64; ?instance= selects a specific pool instance. Requires an authed, already-logged-in instance to prevent exporting empties. - README + .env.example document the end-to-end flow. Made-with: Cursor
95 lines
3.5 KiB
Plaintext
95 lines
3.5 KiB
Plaintext
# 网关监听地址
|
||
HOST=0.0.0.0
|
||
# 网关监听端口
|
||
PORT=8317
|
||
# API Key,可配置多个(逗号分隔)
|
||
API_KEYS=sk-your-api-key
|
||
# 独立的 /metrics 鉴权 token(留空则退化为 API_KEYS 也可访问;若连 API_KEYS 都没配,/metrics 为公开)
|
||
METRICS_TOKEN=
|
||
# 日志级别(DEBUG / INFO / WARNING / ERROR)
|
||
LOG_LEVEL=INFO
|
||
|
||
# /v1/chat/completions 并发上限(<=0 表示不限流)
|
||
GATEWAY_MAX_IN_FLIGHT=4
|
||
# 排队等待超时秒数,超过后返回 429 + Retry-After
|
||
GATEWAY_QUEUE_TIMEOUT_SEC=30
|
||
|
||
# 容器内 Lingma 二进制路径
|
||
LINGMA_BIN=/app/data/bin/Lingma
|
||
# Lingma 获取方式:marketplace 或 vsix
|
||
LINGMA_SOURCE_TYPE=marketplace
|
||
# Marketplace 发布者
|
||
LINGMA_MARKETPLACE_PUBLISHER=Alibaba-Cloud
|
||
# Marketplace 扩展名
|
||
LINGMA_MARKETPLACE_EXTENSION=tongyi-lingma
|
||
# VSIX 下载地址(最新优先)
|
||
LINGMA_VSIX_URL=https://tongyi-code.oss-cn-hangzhou.aliyuncs.com/vscode/tongyi-lingma-latest.vsix
|
||
# 启动时总是尝试从 VSIX 刷新二进制
|
||
LINGMA_BOOTSTRAP_ALWAYS=true
|
||
# 强制刷新(true 时忽略本地缓存)
|
||
LINGMA_FORCE_REFRESH=false
|
||
# Lingma 工作目录(登录/会话数据)
|
||
LINGMA_WORK_DIR=/app/data/.lingma/vscode/sharedClientCache
|
||
# Lingma WebSocket 端口
|
||
LINGMA_SOCKET_PORT=36510
|
||
# Lingma 启动等待秒数
|
||
LINGMA_STARTUP_TIMEOUT=40
|
||
# 单次 RPC 超时秒数
|
||
LINGMA_RPC_TIMEOUT=30
|
||
|
||
# 默认模型(无法映射时使用)
|
||
DEFAULT_MODEL=org_auto
|
||
# 默认模式:chat 或 agent
|
||
DEFAULT_ASK_MODE=chat
|
||
|
||
# 专属域(可选)
|
||
DEDICATED_DOMAIN_URL=
|
||
|
||
# 未登录时是否自动登录
|
||
AUTO_LOGIN_ENABLED=true
|
||
# 自动登录是否无头浏览器
|
||
AUTO_LOGIN_HEADLESS=true
|
||
# 自动登录超时秒数
|
||
AUTO_LOGIN_TIMEOUT=180
|
||
# 自动登录重试次数
|
||
AUTO_LOGIN_MAX_RETRY=2
|
||
|
||
# Lingma 登录用户名(仅当 LINGMA_ACCOUNTS 为空时生效,单实例模式)
|
||
LINGMA_USERNAME=
|
||
# Lingma 登录密码(仅当 LINGMA_ACCOUNTS 为空时生效)
|
||
LINGMA_PASSWORD=
|
||
|
||
# ==== 多实例池(方案乙:多账号) ====
|
||
# 多账号列表,支持两种格式:
|
||
# CSV: user1:pass1,user2:pass2
|
||
# JSON: [{"username":"u1","password":"p1"},{"username":"u2","password":"p2"}]
|
||
# 配置后每个账号对应一个独立 Lingma 实例(独立 workDir + 独立自动登录)
|
||
LINGMA_ACCOUNTS=
|
||
# 实例数量:默认等于 LINGMA_ACCOUNTS 数;显式指定时账号不足会循环复用并打 warning
|
||
LINGMA_INSTANCE_COUNT=
|
||
|
||
# ==== 登录态注入:跳过 Playwright 自动登录 ====
|
||
# 方式 1:base64 字符串,内容 = tar.gz(workDir/cache/{id,user,quota,config.json})
|
||
# 通过 `POST /internal/session/export` 从另一个已登录实例导出得到。
|
||
# 配了这个就可以不填 LINGMA_USERNAME / LINGMA_PASSWORD。
|
||
# LINGMA_SESSION_BUNDLE=
|
||
|
||
# 方式 2:指向宿主机上的 bundle 文件路径(文件内容即 base64 字符串)
|
||
# LINGMA_SESSION_BUNDLE_FILE=/secrets/lingma-session.b64
|
||
|
||
# 多账号时走 JSON 模式,每个账号可以独立带 session_bundle:
|
||
# LINGMA_ACCOUNTS=[
|
||
# {"username":"u1","password":"p1","session_bundle":"H4sI..."},
|
||
# {"username":"u2","password":"p2","session_bundle_file":"/secrets/u2.b64"}
|
||
# ]
|
||
# 注意:一旦 workDir 里已经有登录态(cache/user 非空),bundle 会被跳过,
|
||
# 你手动登录的 / 旧容器的登录态不会被覆盖。
|
||
|
||
# ==== 会话复用(多轮对话命中上游 KV cache,减少首 token 延迟) ====
|
||
# 开关(默认开)
|
||
SESSION_REUSE_ENABLED=true
|
||
# 最多缓存多少条会话 (LRU)
|
||
SESSION_CACHE_MAX_ENTRIES=256
|
||
# 会话 TTL 秒数;超时自动失效,避免 Lingma 侧早已回收还在命中
|
||
SESSION_CACHE_TTL_SEC=1800
|