5.1 KiB
5.1 KiB
部署 / 运维 — content-harvester
敏感值(token、MinIO 凭据、服务器登录信息)不写进本文件 —— 放本地工作目录里被
.gitignore排除的文件:.env.dev(env 变量,docker run --env-file直接用)、SERVERS.local.md(各环境服务器登录方式、目录、容器、注意事项)。下面命令里凡是--env-file .env.dev就会带上 token/凭据。
部署形态
- 跑一个容器
content-harvester,--restart unless-stopped,挂在跟主站 backend 同一个 docker 网络上(主站用http://content-harvester:8000访问),host 端口任选(仅供本机直接调试),挂卷content-harvester-profile:/data/browser_profile,--memory=2g --cpus=2,MinIO 配置走容器 env。 - 代码:
git clone -b dev https://git.aidfxn.com/admin/content-harvester.git,以后git pull origin dev。 - 对接的主站 Skill:「内容网站采集(content-harvester)」(
executor_type=lobster,lobster_api_url=http://content-harvester:8000,lobster_api_key=.env.dev里的HARVESTER_TOKEN)。
重新部署 / 更新(改了代码、push 了 dev 之后)
本仓库没有自动部署 workflow,要手动:
cd /opt/content-harvester
git pull -q origin dev
docker build -t content-harvester .
docker rm -f content-harvester
docker run -d --name content-harvester \
--restart unless-stopped \
--network <主站 backend 所在的 docker 网络> \
-p 8019:8000 \
--env-file /opt/content-harvester/.env.dev \ # 这个文件要先放到服务器上(本地 scp 过去,或在服务器上照样写一份)
-v content-harvester-profile:/data/browser_profile \
--memory=2g --cpus=2 \
content-harvester
sleep 6 && curl -s localhost:8019/healthz # 期望 {"ok":true,"headless":false,...}
注:
.env.dev被.gitignore排除,git pull不会带它过去。第一次在服务器上部署时手动把它放到/opt/content-harvester/.env.dev(从本地 scp,或照本地内容写一份)。或者也可以不用 env-file、把那几个-e KEY=VALUE直接展开写在docker run里(但 token/凭据就会出现在 shell history /docker inspect)。
如果一时没法在服务器上 build,也可以本地 docker build 后 docker save content-harvester | gzip | ssh ... 'gunzip | docker load' —— 但注意 CPU 架构:Mac 一般是 arm64,服务器多是 x86_64,本地构建的 arm64 镜像在服务器跑不了。所以一般还是在服务器上 build。
在一台新服务器上首次部署
- 装 Docker。
git clone -b dev https://git.aidfxn.com/admin/content-harvester.git(私有仓库,需要 git.aidfxn.com 的凭据)。- 在工程目录放一份
.env.dev(从本地拷,或照.env.dev注释里的字段写;至少要HARVESTER_TOKEN+ 4 个MINIO_*+HEADLESS=0)。 docker build -t content-harvester .(base 镜像 ~1GB+,首次几分钟)。docker run -d ...(同上面那串;--network改成跟主站 backend 同一个 docker 网络的名字,这样主站能用http://content-harvester:8000访问)。- 主站侧:确认采集 Skill 的
lobster_api_url指向http://content-harvester:8000、lobster_api_key跟HARVESTER_TOKEN一致;agent-system-backend已含配套的 5 处改动(见 README 第 6 节)。 - x86_64 服务器想用真实 Chrome 过 Cloudflare 更稳:Dockerfile 里把
playwright install chromium改成playwright install chromium chrome,.env.dev里加BROWSER_CHANNEL=chrome,重 build。
本地跑(开发调试)
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt && python -m playwright install chromium
set -a; . ./.env.dev; set +a # 加载 HARVESTER_TOKEN / MINIO_* 等
HEADLESS=1 uvicorn server.app:app --reload # 本机没 Xvfb 用 HEADLESS=1,但那样过不了 xchina 详情页的 Cloudflare,只能验证接口/列表页
# 真要本地完整测(过 Cloudflare),用 Docker 跑(镜像里有 xvfb):docker build -t content-harvester . && docker run --rm -p 8019:8000 --env-file .env.dev content-harvester
排查
curl -s localhost:8019/healthz—— 服务活着吗。- 从主站网络内看:
docker run --rm --network <主站网络> curlimages/curl -s http://content-harvester:8000/healthz—— 主站 backend 能不能访问到。 - 提一个作业看日志:
curl -X POST localhost:8019/agents/xchina/invoke -H "Authorization: Bearer $HARVESTER_TOKEN" -H 'Content-Type: application/json' -d '{"source_kind":"website","content_url":"https://xchina.co/video/id-XXXX.html"}'→ 拿 task_id →curl localhost:8019/tasks/<id>(返回里log_tail是最近作业日志)。docker logs content-harvester看服务日志。 - 主站那头任务一直 RUNNING:看主站 backend 容器日志,
call_lobster_agent在轮询;crawl 类超时是CRAWL_LOBSTER_TIMEOUT(默认 7200s)。任务 SUCCEEDED 但资源库没东西:多半是content为空被 ingest 拒收(reason:"正文为空")——本服务已兜底用 title,理论上不会再发生,真发生了查 scraper 的_extract_description。 - 容器抽风/吃内存:
--memory=2g --cpus=2已经限了,真有问题重启容器即可(状态都在内存,重启即丢,主站会把那次任务标失败,重试就行)。