文件
csp/docs/Docker部署.md
2026-02-23 20:02:46 +08:00

4.9 KiB

Docker Compose 部署指南

1. 启动

docker compose up -d --build

查看状态:

docker compose ps
docker compose logs --tail=100 backend
docker compose logs --tail=100 frontend

2. 访问地址

  • 前端:http://<服务器IP>:7888/
  • 后端健康检查(反代):http://<服务器IP>:7888/admin139/api/health

示例:

  • http://caddns.pandoras.work:7888/
  • http://caddns.pandoras.work:7888/admin139/api/health

3. 端口与持久化

  • 7888:3000frontend 对外)
  • backend 默认不直接暴露端口(经 frontend 反代)
  • 数据卷:csp_data -> /data/csp.db

4. 常用运维命令

docker compose down
docker compose up -d --build
docker compose restart frontend backend

4.1 初始化大规模题库winterant/oi

set -a; source .env; set +a
python3 scripts/import_winterant_oi.py \
  --db-path /var/lib/docker/volumes/csp_csp_data/_data/csp.db \
  --workers 3 \
  --clear-all-problems

当前导入流程为:下载 PDF -> LLM 识别 -> 固定 JSON 落库 + 任务状态落库(内置 500/502/503/504 自动重试)。

仅下载导入、跳过 LLM

python3 scripts/import_winterant_oi.py --skip-llm --workers 3

前端可通过 /imports 查看导入进度与明细结果。

请在 .env 中配置:

OI_LLM_API_URL=https://one.hao.work/v1/chat/completions
OI_LLM_API_KEY=<your_key>
OI_LLM_MODEL=qwen3-max
OI_LLM_STREAM=true
OI_LLM_RETRY_MAX=5
OI_LLM_RETRY_SLEEP_SEC=1.5
OI_PDF_RETRY_MAX=5
OI_PDF_RETRY_SLEEP_SEC=1.5
OI_IMPORT_DIRECT_FALLBACK=true
OI_IMPORT_PREFER_DIRECT=true
OI_IMPORT_AUTO_RUN=true
OI_IMPORT_WORKERS=3
OI_IMPORT_CLEAR_EXISTING=true
OI_IMPORT_CLEAR_SOURCE_PREFIX=winterant/oi
OI_IMPORT_CLEAR_ALL_PROBLEMS=false

# SQLite 锁守护(定时探测 + 自愈)
CSP_SQLITE_BUSY_TIMEOUT_MS=15000
CSP_DB_LOCK_GUARD_ENABLED=true
CSP_DB_LOCK_GUARD_INTERVAL_SEC=20
CSP_DB_LOCK_GUARD_PROBE_TIMEOUT_MS=2000
CSP_DB_LOCK_GUARD_BUSY_STREAK=3

# Lark 机器人(事件回调 + 对话)
CSP_LARK_BOT_ENABLED=false
CSP_LARK_VERIFICATION_TOKEN=
CSP_LARK_APP_ID=
CSP_LARK_APP_SECRET=
CSP_LARK_OPEN_BASE_URL=https://open.feishu.cn
CSP_LARK_LLM_API_URL=
CSP_LARK_LLM_API_KEY=
CSP_LARK_LLM_MODEL=qwen3-max
CSP_LARK_LLM_SYSTEM_PROMPT=你是 CSP Quest World 的编程助教。请用简洁中文回答,先给结论,再给步骤。
CSP_LARK_LLM_TIMEOUT_SEC=30
CSP_LARK_API_TIMEOUT_SEC=15
CSP_LARK_MEMORY_TURNS=6
CSP_LARK_MAX_REPLY_CHARS=1200

# 网站爬虫守护URL 入库后自动:生成规则 -> 测试 -> 运行)
CSP_CRAWLER_ENABLED=true
CSP_CRAWLER_INTERVAL_SEC=15
CSP_CRAWLER_REQUEUE_INTERVAL_SEC=43200
CSP_CRAWLER_FETCH_TIMEOUT_SEC=20
CSP_CRAWLER_SCRIPT_DIR=/data/crawlers
CSP_CRAWLER_LLM_API_URL=https://one.hao.work/v1/chat/completions
CSP_CRAWLER_LLM_API_KEY=替换为你的Key
CSP_CRAWLER_LLM_MODEL=qwen3-max
CSP_CRAWLER_LLM_TIMEOUT_SEC=30

说明:

  • CSP_SQLITE_BUSY_TIMEOUT_MS:主连接遇到锁时的等待时间(毫秒)。
  • CSP_DB_LOCK_GUARD_ENABLED:是否启用定时守护。
  • CSP_DB_LOCK_GUARD_INTERVAL_SEC:守护探测间隔(秒)。
  • CSP_DB_LOCK_GUARD_PROBE_TIMEOUT_MS:守护探测连接的 busy timeout毫秒
  • CSP_DB_LOCK_GUARD_BUSY_STREAK:连续探测到 busy/locked 达到阈值后触发一次自愈WAL checkpoint + optimize
  • CSP_LARK_BOT_ENABLED:是否启用 Lark 对话机器人回调处理。
  • CSP_LARK_VERIFICATION_TOKENLark 事件回调 token建议配置
  • CSP_LARK_APP_ID/CSP_LARK_APP_SECRETLark 应用凭据。
  • CSP_LARK_LLM_*:机器人对话调用的模型配置。
  • CSP_CRAWLER_*网站爬虫守护配置URL 入库后自动生成规则/测试/运行)。
  • CSP_CRAWLER_REQUEUE_INTERVAL_SEC:已激活目标再次入队执行的周期(秒,43200=12小时,0=关闭周期重跑)。

5. 故障排查

5.1 无法访问 7888

  1. 检查监听:
ss -ltnp | rg 7888
  1. 检查容器端口映射:
docker compose ps
  1. 本机探活:
curl -i http://127.0.0.1:7888/
curl -i http://127.0.0.1:7888/admin139/api/health

5.2 检查是否被 Clash 拦截

通常 inbound 到 7888 不会被 Clash 代理规则拦截,但可按下列方式确认:

ps -ef | rg clash
cat /opt/clash/runtime.yaml | rg "allow-lan|port|socks-port|redir-port"
iptables -t nat -S
nft list ruleset

若你希望 Clash 自身也允许局域网访问(与本项目 7888 端口不是同一件事),可设置:

  • /opt/clash/runtime.yamlallow-lan: true
  • 重启 Clash 服务/进程

5.3 Docker 拉取慢/失败

可为 Docker 配置镜像加速,例如:

/etc/docker/daemon.json

{
  "registry-mirrors": ["https://docker.m.daocloud.io"]
}

然后:

systemctl daemon-reload
systemctl restart docker

6. 安全建议

  • 生产环境建议在 Nginx/Caddy 前加 TLS。
  • 在线编译运行属于高风险能力,建议部署到隔离沙箱执行。