graph TB
subgraph "数据采集层"
A[罕见病新闻网站] -->|爬取| B[rare_disease_bot Python 爬虫]
B -->|Playwright| C[浏览器自动化]
C -->|LangChain + Qwen3-max| D[智能分析 & 翻译]
D -->|生成 Markdown| E[server/articles/ YYYYMMDD/域名/]
E -->|专业版| F[markdown_professional/]
E -->|小白版| G[markdown_simplified/]
end
subgraph "构建与导入"
H[GitHub Actions] -->|pnpm build + prebuild| I[import-articles.js]
I -->|读取当天 Markdown| E
I -->|REST API| K[Supabase PostgreSQL]
H -->|产出 .output| J[Nuxt 构建产物]
end
subgraph "应用服务层"
K -->|查询| L[Nuxt Server API]
L -->|/api/notes| M[文章列表 API]
L -->|/api/notes/:id| N[文章详情 API]
end
subgraph "前端展示层"
M -->|SSR| P[Nuxt 3 应用]
N -->|SSR| P
P --> Q[文章列表 / 搜索 / 详情]
end
subgraph "部署层"
T[push main] --> H
H -->|SCP + Docker| U[腾讯云轻量服务器 info_platform :3000]
V[nginx-ssl 容器] -->|HTTPS :443| W[公网用户]
V -->|proxy_pass| U
end
style K fill:#e1ffe1
style P fill:#f0e1ff
style U fill:#ffe1e1
style V fill:#e1f5ff
Rare Disease Info Platform
一个基于 Nuxt 3 的罕见病文章平台,集成了智能新闻爬虫系统,用于收集、翻译和展示罕见病相关的新闻文章。
🌐 在线访问:fshdyouth.com(HTTPS 由服务器
nginx-ssl终结)🏗️ 架构图
graph TB subgraph "数据采集层" A[罕见病新闻网站] -->|爬取| B[rare_disease_botPython 爬虫] B -->|Playwright| C[浏览器自动化] C -->|LangChain + Qwen3-max| D[智能分析 & 翻译] D -->|生成 Markdown| E[server/articles/
YYYYMMDD/域名/] E -->|专业版| F[markdown_professional/] E -->|小白版| G[markdown_simplified/] end subgraph "构建与导入" H[GitHub Actions] -->|pnpm build + prebuild| I[import-articles.js] I -->|读取当天 Markdown| E I -->|REST API| K[Supabase
PostgreSQL] H -->|产出 .output| J[Nuxt 构建产物] end subgraph "应用服务层" K -->|查询| L[Nuxt Server API] L -->|/api/notes| M[文章列表 API] L -->|/api/notes/:id| N[文章详情 API] end subgraph "前端展示层" M -->|SSR| P[Nuxt 3 应用] N -->|SSR| P P --> Q[文章列表 / 搜索 / 详情] end subgraph "部署层" T[push main] --> H H -->|SCP + Docker| U[腾讯云轻量服务器
info_platform :3000] V[nginx-ssl 容器] -->|HTTPS :443| W[公网用户] V -->|proxy_pass| U end style K fill:#e1ffe1 style P fill:#f0e1ff style U fill:#ffe1e1 style V fill:#e1f5ff
✨ 功能特性
prebuild将当天爬取文章写入 Supabase🛠️ 技术栈
前端
后端与数据
爬虫子项目
rare_disease_bot部署
nginx-ssl(80/443,证书与反代配置在服务器上维护)📁 项目结构
🚀 快速开始
环境要求
1. 安装依赖
2. 环境变量(本地)
复制并填写
.env(勿提交 Git)。字段与云端一致,详见下方 云端环境变量:3. 本地开发
访问 http://localhost:3000
4. 本地构建
pnpm build会先执行prebuild(import-articles.js),导入server/articles/下当天目录中的专业版 Markdown。📝 使用 rare_disease_bot 爬虫
爬虫需在本地手动运行。流程概览:
rare_disease_bot/配置.env并安装依赖(见 rare_disease_bot/README.md)python main.py --url ... --max-articles Nserver/articles/下新文章提交到仓库main后,GitHub Actions 在构建阶段执行prebuild导入数据库并部署🚢 生产部署
生产环境由 GitHub Actions 构建并部署到腾讯云,不使用 Vercel。
push到main(非 PR)pnpm lint·pnpm testpnpm build(含 prebuild).output+Dockerfile到服务器 →docker build/docker runnginx-ssl提供 HTTPS,反代到应用:3000服务器防火墙、Nginx、证书路径见 **docs/deploy-cloud.md**。Workflow 说明见 .github/workflows/README.md。
云端环境变量
在 GitHub 仓库(
OpenRareDisease/info_platform)配置:Settings → Secrets and variables → Actions。部署时 CI 会把 Secrets 写入服务器
/home/info_platform/.env,供 Docker 容器运行时读取。本地
.env应与下列变量保持一致(便于对照与调试),但不要把.env提交到 Git。GitHub Variables(非敏感)
DEPLOY_HOST119.29.130.172DEPLOY_PORT2222APP_PORT30003000DOCKER_NETWORKnginx-ssl同 Docker 网络时使用APP_CONTAINER_IPproxy_pass目标 IP 一致时填写10.1.0.10NGINX_SSL_CONTAINERnginx-sslnginx-sslGitHub Secrets(敏感)
SSH 部署
DEPLOY_KEYDEPLOY_USERroot构建阶段(
pnpm build与prebuild/import-articles.js)SUPABASE_URLSUPABASE_KEYSUPABASE_SERVICE_KEYSUPABASE_SERVICE_ROLE_KEYNEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEY运行时(写入服务器
.env,容器--env-file加载)除上述外,部署流程还会写入:
SUPABASE_JWT_SECRETPOSTGRES_URLPOSTGRES_URL_NON_POOLINGPOSTGRES_PRISMA_URLPOSTGRES_HOSTPOSTGRES_USERPOSTGRES_PASSWORDPOSTGRES_DATABASE容器内还会固定写入:
NODE_ENV=production、HOST=0.0.0.0、PORT=3000(无需在 GitHub 单独配置)。配置检查清单
SUPABASE_URL+SUPABASE_SERVICE_KEY(或SUPABASE_KEY)+NEXT_PUBLIC_SUPABASE_*。DEPLOY_HOST(Variables)+DEPLOY_KEY+DEPLOY_USER。.env一致,且 Supabase / Postgres 允许服务器出口访问。/home/ssl/...,由nginx-ssl挂载,不需要放进本仓库。若新增功能依赖其他环境变量(如搜索用的 Embedding API),需在
ci-cd.yml的 build /.env写入步骤中一并加入对应 Secret。🔄 开发流程
本仓库为唯一生产仓库(OpenRareDisease/info_platform),无 fork、无上游同步、无 Vercel。
📚 开发指南
提交前 Husky 会运行 lint-staged 与测试。测试说明见 TEST_SETUP.md。
🔧 数据与 API
server/scripts/import-articles.js→ Supabasenotes表GET/POST /api/notes、GET/PATCH /api/notes/:id等📖 相关文档
📄 License
MIT License