NewsNow 项目研究与部署方案
研究对象:https://github.com/ourongxing/newsnow;本地研究提交:625bf04;版本:0.0.39
推荐方案:优先采用 Docker Compose + 本机 SQLite 持久化 + Nginx 私有子路径/子域反代;首期关闭 GitHub 登录,只启用缓存,验证稳定后再补 OAuth 与 MCP。
1. 项目判断
| 项目项 | 结论 | 依据 |
| 定位 | 中文实时热点新闻聚合阅读器 | README 标注 Demo 当前仅支持中文,实时热点、GitHub 登录、缓存、MCP server。 |
| 技术栈 | Vite + React 19 + TanStack Router + Nitro server | package.json、vite-plugin-with-nitro、server/api、src/routes。 |
| 运行形态 | Node 20 服务,默认监听 4444 | Dockerfile 设置 HOST=0.0.0.0 PORT=4444,运行 node output/server/index.mjs。 |
| 数据 | better-sqlite3 本地库或 Cloudflare D1 | nitro.config.ts 默认 better-sqlite3;CF_PAGES 时使用 D1。 |
| 数据源规模 | 64 个源;中国 26、财经 17、科技 16、世界 5 | 本地生成并统计 shared/sources.json。 |
| 验证结果 | 构建成功;本地服务可用;知乎源可抓取 | pnpm run build 成功;/api/latest 返回 {"v":"0.0.39"};/api/s?id=zhihu 返回 200 和新闻列表。 |
2. 风险与边界
| 风险 | 影响 | 处理建议 |
| 抓取外站导致 IP 被限 | 部分源失败、接口变慢 | 必须启用缓存;只暴露给私有访问;避免公网开放高频刷新。 |
| 登录/OAuth 配置不完整 | 个性化同步不可用,部分接口返回 506/401 | 首期不配置 OAuth;登录相关功能自然禁用,公共新闻接口仍可用。 |
| ProductHunt Token 缺失 | ProductHunt 源不可用 | 首期可忽略;若需要再单独配置 PRODUCTHUNT_API_TOKEN。 |
| SQLite 持久化路径 | 容器重建后缓存/用户数据丢失 | 挂载 Docker volume 或明确目录 /opt/newsnow/data。 |
| 子路径部署兼容性 | 前端静态资源可能使用根路径 | 推荐独立子域优先;若走子路径,需要浏览器验收并准备 base/path patch。 |
3. 推荐架构
推荐 本机部署,服务仅监听内网,通过 Nginx 私有入口访问。
用户浏览器
↓ HTTPS
Nginx: news.loveason.com 或 /newsnow/
↓ allowlist / 私有路径控制
127.0.0.1:4444
↓
NewsNow Node/Nitro 服务
↓
SQLite cache/user DB + 外部新闻源抓取
4. 部署模式选择
| 方案 | 优点 | 缺点 | 建议 |
| Docker Compose 使用官方镜像 | 最快、隔离好、易回滚 | 依赖 ghcr 镜像更新;自定义 patch 不方便 | 首选 |
| 本地源码构建 + systemd | 方便 patch、调试、固定 commit | Node/pnpm 依赖污染本机;升级流程更复杂 | 需要子路径 patch 或自定义源时使用 |
| Cloudflare Pages + D1 | 边缘部署,公开访问体验好 | 不符合本机私有入口治理;OAuth/D1 配置外部化 | 不作为本机首期方案 |
5. 首期落地配置
5.1 目录
/opt/newsnow/
docker-compose.yml
.env
backups/
README.local.md
5.2 docker-compose.yml 建议
services:
newsnow:
image: ghcr.io/ourongxing/newsnow:latest
container_name: newsnow
restart: unless-stopped
ports:
- "127.0.0.1:4444:4444"
volumes:
- newsnow_data:/usr/app/.data
environment:
HOST: 0.0.0.0
PORT: 4444
NODE_ENV: production
INIT_TABLE: "true"
ENABLE_CACHE: "true"
# 首期不启用登录,保持为空
G_CLIENT_ID: ""
G_CLIENT_SECRET: ""
JWT_SECRET: ""
PRODUCTHUNT_API_TOKEN: ""
volumes:
newsnow_data:
name: newsnow_data
6. Nginx 暴露方式
| 方式 | 推荐度 | 说明 |
独立子域 news.loveason.com | 最高 | 避免前端 base path 问题;OAuth 回调也最简单。 |
主域子路径 /newsnow/ | 可行但需验收 | 可能遇到根路径静态资源、API、PWA 路径问题;需要浏览器逐项验证。 |
子域 Nginx 草案
server {
listen 443 ssl http2;
server_name news.loveason.com;
# 复用现有证书与私有 allowlist 策略
include /etc/nginx/snippets/loveason-private-allowlist.conf;
location / {
proxy_pass http://127.0.0.1:4444;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
7. 验收清单
| 层级 | 命令/动作 | 期望 |
| 容器 | docker compose ps | newsnow healthy/running,端口只绑定 127.0.0.1。 |
| 版本接口 | curl http://127.0.0.1:4444/api/latest | 返回 {"v":"0.0.39"} 或当前版本。 |
| 新闻源 | curl 'http://127.0.0.1:4444/api/s?id=zhihu' | HTTP 200,items 非空;若失败,看是否源站反爬。 |
| 页面 | 浏览器访问入口 | 首页加载、图标和列表正常;无 404 静态资源。 |
| 私有性 | 非白名单 IP 访问 | 403 或被拒绝;不能公网裸露。 |
| 持久化 | 重启容器后访问同一源 | 缓存表存在,服务不丢数据。 |
8. 二期增强
- GitHub OAuth:创建 OAuth App,回调
https://news.loveason.com/api/oauth/github,配置 G_CLIENT_ID、G_CLIENT_SECRET、强随机 JWT_SECRET。
- MCP:若后续要让 Agent 读取 NewsNow,可配置
newsnow-mcp-server,BASE_URL 指向私有域名。
- 源健康监控:每天抽测 5-10 个核心源,失败只提示异常源,不推送全量噪音。
- DR:将
/opt/newsnow/docker-compose.yml 与 volume 备份纳入本机 DR 范围,或记录为可重建低价值缓存。
9. 执行前注意
- 如果实际部署需要改 Nginx 或新建 systemd/Docker 服务,应先备份相关配置。
- 若涉及 Nginx reload,不属于 Hermes gateway restart,但仍应记录变更上下文到 changelog inbox。
- 若采用子路径而不是子域,必须做浏览器验收;该项目有 PWA 和根路径静态资源,子路径风险高于子域。