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 serverpackage.jsonvite-plugin-with-nitroserver/apisrc/routes
运行形态Node 20 服务,默认监听 4444Dockerfile 设置 HOST=0.0.0.0 PORT=4444,运行 node output/server/index.mjs
数据better-sqlite3 本地库或 Cloudflare D1nitro.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、调试、固定 commitNode/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 psnewsnow 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. 二期增强

9. 执行前注意