四、网站架构总览
这一块回答:一共有几个站?各自跑在哪、用什么库、怎么鉴权、怎么发布?彼此怎么连?
一、站群全景
┌─────────────── 公网入口 ───────────────┐
https://cag.quest (Cloudflare) https://cag.odn.cc (PassNAT, 443)
│ │
└──────────────► 门户 3000 ◄─────────┘
(portal/server.js)
┌──────────────┼──────────────┐
│ │ │
/vocab 反代 /notes 反代 /c-lab 反代
│ │ │
词汇站 3001 笔记站 3102 C-Lab 3103
(Next, basePath) (Next, /notes) (静态+接口)
│ │ │
vocab.db notes.db 题目库
| 站 | 端口 | 技术 | 数据库 | 入口 |
|---|---|---|---|---|
| 门户 portal | 3000 | 静态页 + Node server.js | portal.db(会话/用户) | / |
| 词汇站 kaoyan-vocab | 3001(实测) | Next.js(basePath /vocab) | vocab.db | /vocab/ |
| 笔记站 notes | 3102(实测) | Next.js(basePath /notes) | notes.db | /notes/ |
| C-Lab | 3103(实测) | 静态 + 轻接口 | c-lab.db(8 表) | /c-lab/ |
端口以实际
Get-NetTCPConnection为准;2026-10-21 定版为 3000/3001/3102,C-Lab 后续并入。
二、共享层(四站共性)
| 层 | 做法 | 关键文件 |
|---|---|---|
| 身份 | 门户校验 pf_sid → 注入 X-User-* + x-portal-secret | portal/server.js、notes/lib/identity.ts |
| 反向代理 | 门户按 basePath 转发,保留路径前缀 | portal/server.js |
| 进程守护 | Windows 计划任务 + 开机自启 | ops/launch.ps1、Kaoyan* 任务 |
| 隧道 | Cloudflare(cag.quest)+ PassNAT(cag.odn.cc)双通道 | ~/.cloudflared、PassNAT frpc |
| 运行时 | 统一 Node 22.22.2(WorkBuddy 内置) | .workbuddy/binaries/node |
三、站间六条耦合关系
- 鉴权单点:所有站的身份都来自门户会话,门户挂了全站匿名。
- 路由前缀:各站的 basePath 与门户反代必须严格一致,改一个要改两处。
- 共享密钥:
portal-secret.txt是门户与笔记站的信任凭证,轮换要热生效。 - 隧道指向:两条隧道的回源都是 3000,即「先到门户,再分发」。
- 静态资源:门户负责全站 favicon/字体,各站不重复维护。
- 数据不共享:四站各自独立库,跨站数据靠接口或人工同步(这是当前最大架构债)。
四、本块子篇
- 门户 portal:统一入口与身份中枢
- 词汇站 kaoyan-vocab:单词记忆与复习算法
- 笔记站 notes:检索、白皮书、表格与版本
- C-Lab 与题目制作台:题库与代码练习
- (本篇即站群总览与联系)