先 Cloudflare,服务器按需
—— 而"需"的边界已验证清楚

P0 装机的工程化答案:不买服务器,产品主入口(飞书周报 + 日更仪表盘)今天就能用(¥0/月); 服务器只被 X 信号链路 / 运营态持久化 / live API 三件事真正需要,要买也只需 2C2G(~¥100/月级),装机一条命令。

2026-06-11 · 续 33 配套 production-runbook / cloudflare-deployment 519 tests · v0.5.0+

§0结论速览

已在线阶段 A:纯 Cloudflare + Actions

门户 + 真实数据仪表盘日更(data-refresh 云端已验证)+ 飞书周报 serverless 版(配一个 secret 即开)。¥0/月。

按需阶段 B:加一台轻量 ECS

解锁 X 信号 / 运营态(WYHTB·trigger·审计)/ live API 实时模式。阿里云 2C2G 经济型即可,半天装完。

推荐节奏先 A 后 B

用阶段 A 跑通第一批用户反馈闭环 → 值得继续(用户要 X 信号/实时)→ 再买服务器。不为没人用的功能先付钱。

§1阶段 A —— Cloudflare/Actions 已覆盖的部分

能力承载状态
门户 36 页 + live.html 仪表盘Cloudflare Pages(main 自动部署)✅ 在线
数据刷新(RSS → 归档 → 快照)Actions data-refresh.yml 每 6 小时✅ 在线(云端首跑已实抓提交)
实时看板(首页入口)live.html 拉最新快照 + 页面 10 分钟自动轮询✅ 在线(秒级实时需阶段 B API)
飞书投研日报(主入口)Actions daily-feishu.yml 每日北京 08:00 · top-3 事件(配 LLM secret 后中文标题+简介)✅ 在线(已验收)
飞书决策周报Actions weekly-feishu.yml 每周一北京 09:30 · 双视角决策卡(与日报并存)✅ 在线
失败自动告警Actions failure-alert.yml · daily/weekly/data-refresh 任一失败 → 飞书红卡✅ 在线(续 39)
判断质量守护(536 tests)agent-ci(Python 3.9/3.11)✅ 在线

飞书群里加"自定义机器人"

群设置 → 群机器人 → 添加,拿到 webhook URL;建议同时开"签名校验"拿 secret。

GitHub 仓库配 2 个 secret

Settings → Secrets and variables → Actions:SATAGENT_FEISHU_WEBHOOK(必填)、SATAGENT_FEISHU_SECRET(开了校验才填)。

完成,可立即验证

Actions 页 → daily-feishu → Run workflow,飞书群即收日报卡片;之后每日北京 08:00 自动推送 top-3 事件(0 条时发"无新增信号"心跳卡)。

阶段 A 诚实边界(对首批用户明示):周报信号 = SpaceNews RSS + wiki/HarnessFarm/Shock 静态语料,无 X 信号;WYHTB/trigger 等运营态不持久;仪表盘是日更快照,非实时查询。

§2必要性验证 —— 服务器到底解锁什么

逐能力对照,❌ = 只有自托管服务器能做(技术根因在第四列):

能力无服务器有服务器为什么 Actions/Workers 做不了
① X 推文信号入库 rsync 接收端 + x-ingest cronoperator 本机抓取后需要常驻可写目标;runner 无固定地址;x.sqlite3 不宜进 git
② 运营态持久化(WYHTB / trigger / thesis 历史 / job 审计) SQLite 单一真库Actions 每次是新容器;操作员手工状态不应进代码仓库
③ live API 实时模式 FastAPI + TunnelWorkers Python beta + SQLite 无持久化(见 cloudflare-deployment §3)
④ 飞书周报⚠️ 可(降级:无 ①②) 全量信号
⑤ 数据日更 / 快照 / 门户
⑥ LLM 兜底 / 月度验证⚠️ 可(加 secret,单 job 6h 上限够用)
判定:服务器的必要性 = 是否要 X 信号(①)与运营态(②)。X 是差异化输入(8 源之一、95 账号、断供告警体系已建好),中期要上;但第一批用户验证期可先用阶段 A 跑反馈闭环。

§3服务器要求(阶段 B · 阿里云选型)

要求说明
实例ECS 2 vCPU / 2 GiB(经济型 e / 突发型 t6)负载 = cron 串行 + 只读 API;1C1G 能跑但跑批紧
系统盘40 GB ESSD Entry代码+venv ~1.5G,DB 百 MB 级,备份 14 天滚动
OSUbuntu 24.04 LTS / Alibaba Cloud Linux 3脚本 apt/dnf/yum 自适应;Python ≥3.9(CI 口径)
出网spacenews.com / open.bigmodel.cn / open.feishu.cn / github.com流量极小,按量 1-3 Mbps 足够
安全组只开 22(限源 IP);不开 80/443公网入口全走 Tunnel 出站连接,源站零暴露
价格档~¥100/月;新用户 99 元/年活动机也满足成本上限清晰

§4安装部署过程

一键装机(root,幂等,重复跑 = 升级)

# 私有仓库: REPO_URL 带 PAT, 或先配部署密钥
sudo REPO_URL="https://<PAT>@github.com/zhanglunet/InvesResearch.git" \
  bash agent/scripts/setup_server.sh

装依赖 → 建 satagent 用户 → clone 到 /opt/InvesResearch → venv 安装 → satagent init → 铺 .env 模板(绝不覆盖已有,chmod 600)。

配置 .env(必做)

SATAGENT_ENV=production / SATAGENT_API_TOKEN / LLM 三件套 + SATAGENT_LLM_TIMEOUT=120 / 飞书 webhook+secret。必填项细则见 runbook §2。key 只进 .env,永不进 git。

注册 5 标准 job + crontab

sudo -u satagent /opt/InvesResearch/agent/scripts/bootstrap_production_jobs.sh
sudo -u satagent crontab -e   # 粘 runbook §5 的 6 行

(可选)live API systemd + 验收

sudo cp agent/scripts/systemd/satagent-api.service /etc/systemd/system/
sudo systemctl enable --now satagent-api
curl -s http://127.0.0.1:8000/health   # {"status":"ok",...}
# 验收: pytest 519 passed · run_job.sh daily-rss exit=0 · notify-test 收到卡片

§5与 Cloudflare 前端连接

operator 本机

twikit 抓 X(风控原因不上云)→ rsync x.sqlite3 → 服务器

阿里云 ECS

cron 5 jobs · SQLite 真库 · FastAPI 127.0.0.1:8000 · cloudflared 纯出站

Cloudflare

Tunnel 发布 api.域名(HTTPS 边缘签发,可叠 Access SSO)· Pages 托管门户

GitHub Actions

data-refresh 日更快照 → 提交 main → Pages 自动部署(与服务器并行不冲突)

连接关系说明
静态快照模式(默认)Pages 仪表盘吃 Actions 日更快照,与服务器零连接
实时模式(可选)cloudflared 把 127.0.0.1:8000 发布为 https://api.你的域名;.env 配 SATAGENT_CORS_ORIGINS=Pages 域名;live.html API 框填地址即切实时(token 走 Bearer 头)
推送双轨互斥服务器侧飞书推送 job 与 Actions daily-feishu.yml 二选一,上服务器后 disable 后者,否则每天收两份

§6-§8运维 · X 链路 · 安全

症状第一刀
job 全红run_job.sh <name> 手跑看 stderr;多半 .env 漏配或出网被拦
LLM applied=0SATAGENT_LLM_TIMEOUT=120 没配(glm-4.6 思考输出 ~65s)
API 503production 模式没配 token(设计如此)
周报收到两份§5 双轨没互斥,disable 一边
X 断供红卡去 operator 本机看抓取(48h 阈值自动告警)

每周巡检 2 分钟:satagent job list 看 last_status / fails / last_run 三列。备份:backup_db.sh 每日在线 .backup,14 天滚动。升级 = 重跑 setup_server.sh。X 链路:operator 本机 crontab 一行 rsync(§7,MD 版)。