P0 装机的工程化答案:不买服务器,产品主入口(飞书周报 + 日更仪表盘)今天就能用(¥0/月); 服务器只被 X 信号链路 / 运营态持久化 / live API 三件事真正需要,要买也只需 2C2G(~¥100/月级),装机一条命令。
门户 + 真实数据仪表盘日更(data-refresh 云端已验证)+ 飞书周报 serverless 版(配一个 secret 即开)。¥0/月。
解锁 X 信号 / 运营态(WYHTB·trigger·审计)/ live API 实时模式。阿里云 2C2G 经济型即可,半天装完。
用阶段 A 跑通第一批用户反馈闭环 → 值得继续(用户要 X 信号/实时)→ 再买服务器。不为没人用的功能先付钱。
| 能力 | 承载 | 状态 |
|---|---|---|
| 门户 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。
Settings → Secrets and variables → Actions:SATAGENT_FEISHU_WEBHOOK(必填)、SATAGENT_FEISHU_SECRET(开了校验才填)。
Actions 页 → daily-feishu → Run workflow,飞书群即收日报卡片;之后每日北京 08:00 自动推送 top-3 事件(0 条时发"无新增信号"心跳卡)。
逐能力对照,❌ = 只有自托管服务器能做(技术根因在第四列):
| 能力 | 无服务器 | 有服务器 | 为什么 Actions/Workers 做不了 |
|---|---|---|---|
| ① X 推文信号入库 | ❌ | ✅ rsync 接收端 + x-ingest cron | operator 本机抓取后需要常驻可写目标;runner 无固定地址;x.sqlite3 不宜进 git |
| ② 运营态持久化(WYHTB / trigger / thesis 历史 / job 审计) | ❌ | ✅ SQLite 单一真库 | Actions 每次是新容器;操作员手工状态不应进代码仓库 |
| ③ live API 实时模式 | ❌ | ✅ FastAPI + Tunnel | Workers Python beta + SQLite 无持久化(见 cloudflare-deployment §3) |
| ④ 飞书周报 | ⚠️ 可(降级:无 ①②) | ✅ 全量信号 | — |
| ⑤ 数据日更 / 快照 / 门户 | ✅ | ✅ | — |
| ⑥ LLM 兜底 / 月度验证 | ⚠️ 可(加 secret,单 job 6h 上限够用) | ✅ | — |
| 项 | 要求 | 说明 |
|---|---|---|
| 实例 | ECS 2 vCPU / 2 GiB(经济型 e / 突发型 t6) | 负载 = cron 串行 + 只读 API;1C1G 能跑但跑批紧 |
| 系统盘 | 40 GB ESSD Entry | 代码+venv ~1.5G,DB 百 MB 级,备份 14 天滚动 |
| OS | Ubuntu 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 元/年活动机也满足 | 成本上限清晰 |
# 私有仓库: 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)。
SATAGENT_ENV=production / SATAGENT_API_TOKEN / LLM 三件套 + SATAGENT_LLM_TIMEOUT=120 / 飞书 webhook+secret。必填项细则见 runbook §2。key 只进 .env,永不进 git。
sudo -u satagent /opt/InvesResearch/agent/scripts/bootstrap_production_jobs.sh
sudo -u satagent crontab -e # 粘 runbook §5 的 6 行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 收到卡片
twikit 抓 X(风控原因不上云)→ rsync x.sqlite3 → 服务器
cron 5 jobs · SQLite 真库 · FastAPI 127.0.0.1:8000 · cloudflared 纯出站
Tunnel 发布 api.域名(HTTPS 边缘签发,可叠 Access SSO)· Pages 托管门户
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 后者,否则每天收两份 |
| 症状 | 第一刀 |
|---|---|
| job 全红 | run_job.sh <name> 手跑看 stderr;多半 .env 漏配或出网被拦 |
| LLM applied=0 | SATAGENT_LLM_TIMEOUT=120 没配(glm-4.6 思考输出 ~65s) |
| API 503 | production 模式没配 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 版)。