docs: 同步文档至当前生产架构(ca:8443 → gateway:8445、C++20 重写版为主、confs 内嵌 core)
- README: 更新架构图/链路/服务表/端口表,static/dnfs/db/captcha/confs 标注遗留 - MODULES/ARCHITECTURE: 事实来源改为 services.yaml,配置链路收敛为仅 gateway.ini - fsys/dnfs2 README: 架构图改为 ca 验签与纯 CLI 配置
This commit is contained in:
1 parent
77bc367d03
commit
ad5d91c47a
5 files changed
+134
-133
No files matched your search
@@ -15,41 +15,44 @@
|
|||||||
│ core (PMC / Nidus) │
|
│ core (PMC / Nidus) │
|
||||||
│ 进程托管服务 · 监听 :5200 (HTTP 管理接口) │
|
│ 进程托管服务 · 监听 :5200 (HTTP 管理接口) │
|
||||||
│ 读取 services.yaml 拉起并守护下列子进程 │
|
│ 读取 services.yaml 拉起并守护下列子进程 │
|
||||||
|
│ 内嵌 confs :8010 (仅 gateway.ini 分发) │
|
||||||
└───────────────┬──────────────────────────────┘
|
└───────────────┬──────────────────────────────┘
|
||||||
│ 启动 / 守护
|
│ 启动 / 守护
|
||||||
┌──────────────────┬───────────┼───────────┬──────────────────┬──────────────┐
|
┌──────────────────┬───────────┼───────────┬──────────────────┬──────────────┐
|
||||||
▼ ▼ ▼ ▼ ▼ ▼
|
▼ ▼ ▼ ▼ ▼ ▼
|
||||||
┌──────────────┐ ┌──────────────┐ ┌────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
┌──────────────┐ ┌──────────────┐ ┌────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
||||||
│ waf │ │ gateway │ │ static │ │ dnfs │ │ db │ │ ai_review │
|
│ waf │ │ ca │ │ fsys │ │ dnfs2 │ │ db2 │ │ ai_review │
|
||||||
│ WAF 网关 │ │ 应用层网关 │ │前端托管│ │ 树状菜单 │ │ 通用数据库 │ │ AI内容审核 │
|
│ WAF 网关 │ │ 中央认证 │ │前端托管│ │ 树状菜单 │ │ 通用数据库 │ │ AI内容审核 │
|
||||||
│ :443 (入口) │ │ :8443 (内部) │ │ :9200 │ │ :8006 │ │ :8005 │ │ :8007 │
|
│ :443 (入口) │ │ :8443 (内部) │ │ :9200 │ │ :8006 │ │ :8005 │ │ :8007 │
|
||||||
│ coraza+反代 │ │ 鉴权 + 反代 │ │静态/媒体│ │ 节点CRUD │ │ pymsg/TCP │ │ DeepSeek+RAG │
|
│ coraza+反代 │ │ 认证+前置转发│ │静态/媒体│ │ 节点CRUD │ │ pymsg/TCP │ │ DeepSeek+RAG │
|
||||||
└──────┬───────┘ └──────┬───────┘ └───┬────┘ └──────┬───────┘ └──────▲───────┘ └──────▲───────┘
|
└──────┬───────┘ └──────┬───────┘ └───┬────┘ └──────┬───────┘ └──────▲───────┘ └──────▲───────┘
|
||||||
│ HTTPS终止 │ 反向代理 │ 代理笔记请求 │ pymsg │ pymsg │ HTTP
|
│ HTTPS终止 │ 认证+转发 │ 代理笔记请求 │ pymsg │ pymsg │ HTTP
|
||||||
▲ └─────────────►│ ├─────────────►│─────────────────┘ │
|
▲ └─────────────►│ ├─────────────►│─────────────────┘ │
|
||||||
│ ├────────────►│ └─────── HTTP /review ──────────────┘
|
│ ┌───────────►│ │ └─────── HTTP /review ──────────────┘
|
||||||
│ └────────────►│
|
│ │ gateway │ │
|
||||||
|
│ │ :8445 纯转发│ │
|
||||||
|
│ └────────────►│ │
|
||||||
│
|
│
|
||||||
┌─────┴──────┐
|
┌─────┴──────┐
|
||||||
│ redirect80 │ :80 → :443(GET/HEAD 301 / 其余 308,重定向到 waf)
|
│ redirect80 │ :80 → :443(GET/HEAD 301 / 其余 308,重定向到 waf)
|
||||||
└────────────┘
|
└────────────┘
|
||||||
日志链路: waf / ca / gateway / static / dnfs / ai_review / captcha / smtp / aibox / confs / redirect80 ──(log_client, pymsg)──► db:8005 (Logs 表)
|
日志链路: waf / ca / gateway / fsys / dnfs2 / ai_review / captcha2 / smtp / aibox / redirect80 ──(log_client, pymsg)──► db2:8005 (Logs 表)
|
||||||
认证链路(v0.9.0 起): waf:443 ──HTTP──► ca:8443 (认证+前置转发) ──HTTP──► gateway:8445 (纯转发, 仅 loopback) ──► 内部服务
|
认证链路(v0.9.0 起): waf:443 ──HTTP──► ca:8443 (认证+前置转发) ──HTTP──► gateway:8445 (纯转发, 仅 loopback) ──► 内部服务
|
||||||
配置链路: gateway / static / smtp / captcha ──(pymsg get)──► confs:8010(配置统一存放于 confs/configs/,mtime 变化自动重载;ca/dnfs2/redirect80/db2 例外,配置纯 CLI 传递)
|
配置链路: gateway ──(pymsg get)──► core:8010 内嵌 confs(配置统一存放于 confs/configs/,mtime 变化自动重载);ca/dnfs2/db2/fsys/captcha2/smtp/redirect80 例外,配置纯 CLI 传递
|
||||||
```
|
```
|
||||||
|
|
||||||
> `db2` / `dnfs2` 分别是 `db` / `dnfs` 的 C++20 重实现(接口完全兼容,可平替),架构位置与 Python 版一致。`BotOps` 为 aibox 的终端前端(WebSocket 客户端),`lci` 为嵌入式帧缓冲图形界面,均不在上图中。
|
> `db2` / `dnfs2` / `fsys` / `captcha2` 分别是 `db` / `dnfs` / `static` / `captcha` 的 C++20 重实现(接口完全兼容,可平替),架构位置与 Python 版一致;`confs` 已内嵌进 `core`。`BotOps` 为 aibox 的终端前端(WebSocket 客户端),`lci` 为嵌入式帧缓冲图形界面,均不在上图中。
|
||||||
|
|
||||||
### 请求链路
|
### 请求链路
|
||||||
|
|
||||||
1. 客户端若以 HTTP 访问 `:80`,由 `redirect80` 重定向到 HTTPS `:443`(GET/HEAD 返回 301,其余方法返回 308 保留 body)。
|
1. 客户端若以 HTTP 访问 `:80`,由 `redirect80` 重定向到 HTTPS `:443`(GET/HEAD 返回 301,其余方法返回 308 保留 body)。
|
||||||
2. 客户端所有请求先打到 `waf:443`(HTTPS),WAF 终止 TLS、运行 coraza 规则匹配,命中则直接返回 403。
|
2. 客户端所有请求先打到 `waf:443`(HTTPS),WAF 终止 TLS、运行 coraza 规则匹配,命中则直接返回 403。
|
||||||
3. 未命中规则的请求由 WAF 以明文 HTTP 转发到 `ca:8443`,并设置 `X-Forwarded-For` / `X-Forwarded-Proto` 头。
|
3. 未命中规则的请求由 WAF 以明文 HTTP 转发到 `ca:8443`,并设置 `X-Forwarded-For` / `X-Forwarded-Proto` 头。
|
||||||
4. `ca` 对 `/login`、`/register` 做账号鉴权(PBKDF2 密码哈希 + RSA 签名 Token + 可选 CAPTCHA + 速率限制;注册需邮箱验证码,经 pymsg/TCP 调 `smtp:8008` 发送与校验),用户数据通过 pymsg/TCP 调用 `db:8005` 存取。
|
4. `ca` 对 `/login`、`/register` 做账号鉴权(PBKDF2 密码哈希 + RSA 签名 Token + 可选 CAPTCHA + 速率限制;注册需邮箱验证码,经 pymsg/TCP 调 `smtp:8008` 发送与校验),用户数据通过 pymsg/TCP 调用 `db2:8005` 存取。
|
||||||
5. 其余请求携带 Token,经 `ca` 验签后注入 `X-Auth-User` 身份头转发到 `gateway:8445`(仅 loopback,不验签仅做存在性检查),再由 gateway 反向代理到 `Proxy.opened` 中放开的内部服务(`static:9200` / `dnfs:8006`)。
|
5. 其余请求携带 Token,经 `ca` 验签后注入 `X-Auth-User` 身份头转发到 `gateway:8445`(仅 loopback,不验签仅做存在性检查),再由 gateway 反向代理到 `Proxy.opened` 中放开的内部服务(`fsys:9200` / `dnfs2:8006`)。
|
||||||
6. `db:8005` 与 `ai_review:8007` 在 `Proxy.closed` 中,仅允许内部服务间调用,不对外暴露。
|
6. `db2:8005` 与 `ai_review:8007` 在 `Proxy.closed` 中,仅允许内部服务间调用,不对外暴露。
|
||||||
7. `dnfs` 处理节点增删改查时,通过 pymsg/TCP 调用 `db` 服务完成数据持久化,新增节点前调用 `ai_review` 进行内容审核。
|
7. `dnfs2` 处理节点增删改查时,通过 pymsg/TCP 调用 `db2` 服务完成数据持久化,新增节点前调用 `ai_review` 进行内容审核。
|
||||||
8. 各服务通过 `log_client.py` SDK 异步批量推送运行日志(pymsg/TCP 写入 db 的 `Logs` 表),实现集中式日志收集(fail-safe,db 不可用时静默丢弃)。
|
8. 各服务通过 `log_client.py` SDK 异步批量推送运行日志(pymsg/TCP 写入 db2 的 `Logs` 表),实现集中式日志收集(fail-safe,db2 不可用时静默丢弃)。
|
||||||
|
|
||||||
## 各服务说明
|
## 各服务说明
|
||||||
|
|
||||||
@@ -60,15 +63,17 @@
|
|||||||
| [waf](waf/) | Go | 443 | WAF 网关(入口),终止 TLS、coraza 规则匹配(SecLang)、反向代理到 ca,支持 SIGHUP 热加载规则 |
|
| [waf](waf/) | Go | 443 | WAF 网关(入口),终止 TLS、coraza 规则匹配(SecLang)、反向代理到 ca,支持 SIGHUP 热加载规则 |
|
||||||
| [ca](ca/) | C++20 | 8443 | 中央认证服务(内部 HTTP),用户注册/登录鉴权、Token 签发与校验、身份头注入后前置转发到 gateway |
|
| [ca](ca/) | C++20 | 8443 | 中央认证服务(内部 HTTP),用户注册/登录鉴权、Token 签发与校验、身份头注入后前置转发到 gateway |
|
||||||
| [gateway](gateway/) | C++20 | 8445 | 应用层网关(仅 loopback),纯转发反向代理到内部服务,不验签(v0.9.0 起认证迁至 ca) |
|
| [gateway](gateway/) | C++20 | 8445 | 应用层网关(仅 loopback),纯转发反向代理到内部服务,不验签(v0.9.0 起认证迁至 ca) |
|
||||||
| [static](static/) | Python(Flask) | 9200 | 前端托管服务,社区首页、静态页面与文件浏览、视频/音频流媒体播放、路径遍历防护 |
|
| [fsys](fsys/) | C++20 | 9200 | 前端托管服务(static 的 C++ 重写),社区首页、静态页面与文件浏览、视频/音频流媒体播放、路径遍历防护,代理 dnfs2 笔记请求 |
|
||||||
| [dnfs](dnfs/) | Python(Flask) | 8006 | 树状网络文件系统(Dendrachy Network File-System),基于父子 pid 的节点树增删改查,集成 AI 内容审核 |
|
| [static](static/) | Python(Flask) | 9200 | ~~前端托管服务~~(遗留,已由 fsys 平替) |
|
||||||
| [dnfs2](dnfs2/) | C++20 | 8006 | dnfs 的 C++20 重实现(libhttp + libmsg),接口与 Python 版完全兼容,修复 P0/P1 安全问题,可平替 |
|
| [dnfs2](dnfs2/) | C++20 | 8006 | 树状网络文件系统(Dendrachy Network File-System),基于父子 pid 的节点树增删改查,集成 AI 内容审核;接口与 Python 版完全兼容,修复 P0/P1 安全问题 |
|
||||||
| [db](db/) | Python(pymsg) | 8005 | 通用数据库服务,基于 pymsg 协议(TCP 长度前缀帧 + JSON)的 SQL-over-TCP,SQLAlchemy Core 参数化查询防注入;内置集中式日志收集(Logs 表 + 自动清理) |
|
| [dnfs](dnfs/) | Python(Flask) | 8006 | ~~树状网络文件系统~~(遗留,已由 dnfs2 平替) |
|
||||||
| [db2](db2/) | C++20 | 8005 | db 的 C++20 重实现(libmsg + boost::json + libsqlite3),execute 路由/where 语法/响应格式完全对齐 Python 版,可平替 |
|
| [db2](db2/) | C++20 | 8005 | 通用数据库服务,基于 pymsg 协议(TCP 长度前缀帧 + JSON)的 SQL-over-TCP,参数化查询防注入;内置集中式日志收集(Logs 表 + 自动清理) |
|
||||||
|
| [db](db/) | Python(pymsg) | 8005 | ~~通用数据库服务~~(遗留,已由 db2 平替) |
|
||||||
| [ai_review](ai_review/) | Python(Flask) | 8007 | AI 内容审核服务,DeepSeek LLM + ChromaDB RAG,支持人工反馈纠偏 |
|
| [ai_review](ai_review/) | Python(Flask) | 8007 | AI 内容审核服务,DeepSeek LLM + ChromaDB RAG,支持人工反馈纠偏 |
|
||||||
| [captcha](captcha/) | Python(pymsg) | 8009 | 验证码服务(pymsg/TCP),生成图形验证码(5 分钟过期、一次性),经 ca 的 `GET /captcha/image` 代理给浏览器 |
|
| [captcha2](captcha2/) | C++20 | 8009 | 验证码服务(pymsg/TCP),生成图形验证码(5 分钟过期、一次性),经 ca 的 `GET /captcha/image` 代理给浏览器 |
|
||||||
| [smtp](smtp/) | Python(pymsg) | 8008 | 邮件服务,发送/校验邮箱验证码(pymsg 路由 send_email/verify_email/health),注册流程的邮件验证码后端,SMTP 账号配置在 .env |
|
| [captcha](captcha/) | Python(pymsg) | 8009 | ~~验证码服务~~(遗留,已由 captcha2 平替) |
|
||||||
| [confs](confs/) | Python(pymsg) | 8010 | 统一配置服务,集中存放并分发各服务配置文件(pymsg 路由 get/list/reload/health),内存缓存 + mtime 自动重载,路径遍历防护 |
|
| [smtp](smtp/) | Python(pymsg) | 8008 | 邮件服务,发送/校验邮箱验证码(pymsg 路由 send_email/verify_email/health),注册流程的邮件验证码后端,SMTP 账号配置在 .env(smtp3 C++ 重写待上线) |
|
||||||
|
| [confs](confs/) | Python(pymsg) | 8010 | ~~统一配置服务~~(遗留,已内嵌进 core,仅 gateway.ini 仍由 confs 分发) |
|
||||||
| [aibox](aibox/) | Python | 8765 | 独立 AI 智能体系统(DeepSeek + WebSocket),自带技能系统/记忆/任务调度,由 core 拉起但与主干微服务无调用关系 |
|
| [aibox](aibox/) | Python | 8765 | 独立 AI 智能体系统(DeepSeek + WebSocket),自带技能系统/记忆/任务调度,由 core 拉起但与主干微服务无调用关系 |
|
||||||
| [BotOps](BotOps/) | Python | — | aibox 智能体 TUI 前端(Textual),WebSocket 连接 aibox,支持 Markdown 增量流式渲染、思考模式展示、任务独立侧栏、自动重连 |
|
| [BotOps](BotOps/) | Python | — | aibox 智能体 TUI 前端(Textual),WebSocket 连接 aibox,支持 Markdown 增量流式渲染、思考模式展示、任务独立侧栏、自动重连 |
|
||||||
| [bot4cj](bot4cj/) | 仓颉(Cangjie) | — | 机器人硬件脚本解析器,解析 .mt 矩阵脚本通过 I2C 驱动 PCA9685 舵机 / MPU6050 陀螺仪,面向树莓派 Dashun 蜘蛛机器人平台(独立硬件项目) |
|
| [bot4cj](bot4cj/) | 仓颉(Cangjie) | — | 机器人硬件脚本解析器,解析 .mt 矩阵脚本通过 I2C 驱动 PCA9685 舵机 / MPU6050 陀螺仪,面向树莓派 Dashun 蜘蛛机器人平台(独立硬件项目) |
|
||||||
@@ -95,7 +100,7 @@
|
|||||||
- 内部 HTTP 服务,默认监听 127.0.0.1:8443(接管原 gateway 端口,WAF upstream 不变),不再承载 TLS(TLS 已由 WAF 终止)。
|
- 内部 HTTP 服务,默认监听 127.0.0.1:8443(接管原 gateway 端口,WAF upstream 不变),不再承载 TLS(TLS 已由 WAF 终止)。
|
||||||
- **配置体系(v1.1.0)**:彻底移除 confs 依赖,配置全部经 CLI 传递(CLI > 环境变量 > 默认值三层),原 `ca.ini` 配置值迁入 [core/services.yaml](core/services.yaml) 的 ca 条目 args;兼容旧环境变量名(`LISTEN_ADDR`/`UPSTREAM_GATEWAY`/`DB_*` 等)。
|
- **配置体系(v1.1.0)**:彻底移除 confs 依赖,配置全部经 CLI 传递(CLI > 环境变量 > 默认值三层),原 `ca.ini` 配置值迁入 [core/services.yaml](core/services.yaml) 的 ca 条目 args;兼容旧环境变量名(`LISTEN_ADDR`/`UPSTREAM_GATEWAY`/`DB_*` 等)。
|
||||||
- **密码安全**:PBKDF2-HMAC-SHA256(10 万轮 + 16 字节随机盐),密码强度校验(8+ 字符、4 类中至少 3 类),常数时间比较防 timing attack。
|
- **密码安全**:PBKDF2-HMAC-SHA256(10 万轮 + 16 字节随机盐),密码强度校验(8+ 字符、4 类中至少 3 类),常数时间比较防 timing attack。
|
||||||
- **用户存储**:用户数据通过 pymsg/TCP 调用 `db:8005`(`DbC::call_msg`)存取;登录成功即更新 `Users.last_login`(`"$now"` 哨兵)。
|
- **用户存储**:用户数据通过 pymsg/TCP 调用 `db2:8005`(`DbC::call_msg`)存取;登录成功即更新 `Users.last_login`(`"$now"` 哨兵)。
|
||||||
- **Token 机制**:`Base64(payload) + "_" + RSA-Sign(payload)`,默认 1 小时过期;RSA 密钥对启动时内存生成,重启后旧 Token 全部失效;jti 黑名单 + 用户版本号双轨吊销。
|
- **Token 机制**:`Base64(payload) + "_" + RSA-Sign(payload)`,默认 1 小时过期;RSA 密钥对启动时内存生成,重启后旧 Token 全部失效;jti 黑名单 + 用户版本号双轨吊销。
|
||||||
- **Cookie 认证**:登录成功同时签发 `HttpOnly + Secure + SameSite=Lax` 的 `q4_token` Cookie;验签时无 `Authorization` 头则回退读 Cookie,并向下游注入 `Authorization: Bearer`(下游零改动);`POST /logout` 清除 Cookie。
|
- **Cookie 认证**:登录成功同时签发 `HttpOnly + Secure + SameSite=Lax` 的 `q4_token` Cookie;验签时无 `Authorization` 头则回退读 Cookie,并向下游注入 `Authorization: Bearer`(下游零改动);`POST /logout` 清除 Cookie。
|
||||||
- **前置转发**:无 `Target-Url` 为公开请求(剥身份头直转 gateway);有 `Target-Url` 为受保护请求(验签后注入 `X-Auth-User`/`X-Auth-Admin` 转发,strip-then-set 契约剥离客户端伪造值);上游不可达统一 502。
|
- **前置转发**:无 `Target-Url` 为公开请求(剥身份头直转 gateway);有 `Target-Url` 为受保护请求(验签后注入 `X-Auth-User`/`X-Auth-Admin` 转发,strip-then-set 契约剥离客户端伪造值);上游不可达统一 502。
|
||||||
@@ -111,18 +116,19 @@
|
|||||||
- **反向代理**:`Target-Url` 必须在 `Proxy.opened` 白名单中,缺省走 `Proxy.default`;`X-Auth-User`/`X-Auth-Admin`/`Authorization` 原样透传下游。
|
- **反向代理**:`Target-Url` 必须在 `Proxy.opened` 白名单中,缺省走 `Proxy.default`;`X-Auth-User`/`X-Auth-Admin`/`Authorization` 原样透传下游。
|
||||||
- 详见 [gateway/README.md](gateway/README.md)。
|
- 详见 [gateway/README.md](gateway/README.md)。
|
||||||
|
|
||||||
### static(前端托管服务)
|
### fsys(前端托管服务 · C++20 重实现)
|
||||||
|
|
||||||
- 托管 `public/` 下的前端页面:社区首页(`index.html`)、登录/注册、树状笔记(`dnfs.html`)、文件浏览(`__view.html`)等。
|
- static 的 C++20 重实现(原 Python/Flask `static/` 目录保留为遗留,不再部署),托管 `public/` 下的前端页面:社区首页(`index.html`)、登录/注册、树状笔记(`dnfs.html`)、文件浏览(`__view.html`)等。
|
||||||
- 支持文件浏览、视频/音频在线播放(HTTP Range 分段请求,返回 206/416)、一键下载。
|
- 支持文件浏览、视频/音频在线播放(HTTP Range 分段请求,返回 206/416)、一键下载。
|
||||||
- 路径遍历防护(`safe_path_join`:realpath 前缀校验),仅允许访问 `directory.root` 之内。
|
- 路径遍历防护(realpath 前缀校验),仅允许访问 `--root` 之内。
|
||||||
- **dnfs 代理**:`/get_notes`、`/add_note`、`/delete_note`、`/update_note` 透传 Authorization 转发到 `dnfs:8006`(解决浏览器跨域)。
|
- **dnfs2 代理**:`/get_notes`、`/add_note`、`/delete_note`、`/update_note` 透传 Authorization 转发到 `dnfs2:8006`(解决浏览器跨域)。
|
||||||
- **账号旁路**:`/api/check_user`、`/api/reset_password` 等接口直接读写 `gateway/sqlite3.db` 的 Users 表;`/yhdet_callback`、`/api/yhdet_*` 对接 yhdet.top OAuth 登录。
|
- **账号旁路**:`/api/check_user`、`/api/reset_password` 等接口直接读写 `gateway/sqlite3.db` 的 Users 表;`/yhdet_callback`、`/api/yhdet_*` 对接 yhdet.top OAuth 登录。
|
||||||
- 统一品牌"树状菜单",支持深色模式(`css/theme.css`)。
|
- 统一品牌"树状菜单",支持深色模式(`css/theme.css`)与样式节点注入的自定义主题/样式(见 [docs/dnfs_custom_themes.md](docs/dnfs_custom_themes.md))。
|
||||||
- 可使用 Nuitka 编译为独立二进制(`fsys.bin`)。
|
|
||||||
- 配置全部经 CLI 传递(CLI > 环境变量 > 默认值,原 `confs/configs/static.ini` 迁入 `core/services.yaml` 的 fsys 条目 args),不依赖 confs。
|
- 配置全部经 CLI 传递(CLI > 环境变量 > 默认值,原 `confs/configs/static.ini` 迁入 `core/services.yaml` 的 fsys 条目 args),不依赖 confs。
|
||||||
|
|
||||||
### dnfs(树状菜单服务)
|
### dnfs(树状菜单服务 · 遗留)
|
||||||
|
|
||||||
|
> 已由 [dnfs2](#dnfs2树状菜单服务--c20-重实现)(C++20 重实现)平替,不再部署;以下为 Python 版说明。
|
||||||
|
|
||||||
- 基于 `pid`(父节点 id)组织的树状节点,节点含 `title` 与 `content`。
|
- 基于 `pid`(父节点 id)组织的树状节点,节点含 `title` 与 `content`。
|
||||||
- 提供 `/get_notes`、`/add_note`、`/delete_note`、`/update_note` 四个接口。
|
- 提供 `/get_notes`、`/add_note`、`/delete_note`、`/update_note` 四个接口。
|
||||||
@@ -133,13 +139,16 @@
|
|||||||
|
|
||||||
- dnfs 的 C++20 重实现,基于 [libhttp](libhttp/) + [libmsg](libmsg/) + boost::json,接口与 Python dnfs 完全兼容,前端零改动。
|
- dnfs 的 C++20 重实现,基于 [libhttp](libhttp/) + [libmsg](libmsg/) + boost::json,接口与 Python dnfs 完全兼容,前端零改动。
|
||||||
- 修复 Python 版的 P0/P1 安全问题(Token 验签 fail-closed、所有权校验、子节点检查、错误响应脱敏避免 IP/用户名泄露)。
|
- 修复 Python 版的 P0/P1 安全问题(Token 验签 fail-closed、所有权校验、子节点检查、错误响应脱敏避免 IP/用户名泄露)。
|
||||||
- Token 验签:HttpClient POST gateway `/whoami`,验签失败返回 503(fail-closed)。
|
- Token 验签:HttpClient POST ca `/whoami`(CLI 参数 `--gateway-url` 指向 ca:8443),验签失败返回 503(fail-closed)。
|
||||||
- 数据操作:libmsg `RpcClient` 调 db2 `execute` 路由(与 Python 版调 db 路径一致)。
|
- 数据操作:libmsg `RpcClient` 调 db2 `execute` 路由(与 Python 版调 db 路径一致)。
|
||||||
- 内容审核:HttpClient POST ai_review `/review`,fail-closed。
|
- 内容审核:HttpClient POST ai_review `/review`,fail-closed。
|
||||||
- 异步日志:libmsg `AsyncQueue` 写入 db2 Logs 表。
|
- 异步日志:libmsg `AsyncQueue` 写入 db2 Logs 表。
|
||||||
|
- 特殊节点:`js` / `file` / `style` / `theme` 四类,样式与主题节点支持界面注入换肤(节点作用域生效,详见 [docs/dnfs_custom_themes.md](docs/dnfs_custom_themes.md))。
|
||||||
- 配置通过 CLI 参数 + 环境变量 + 默认值,不依赖 confs;详见 [dnfs2/README.md](dnfs2/README.md)。
|
- 配置通过 CLI 参数 + 环境变量 + 默认值,不依赖 confs;详见 [dnfs2/README.md](dnfs2/README.md)。
|
||||||
|
|
||||||
### db(通用数据库服务)
|
### db(通用数据库服务 · 遗留)
|
||||||
|
|
||||||
|
> 已由 [db2](#db2通用数据库服务--c20-重实现)(C++20 重实现)平替,不再部署;以下为 Python 版说明。
|
||||||
|
|
||||||
- 基于自研 [pymsg](pymsg/) 协议(TCP 长度前缀帧 + JSON),单一路由 `_route: "execute"`,接收结构化 JSON(action + table + where + values),翻译为 SQL 执行。
|
- 基于自研 [pymsg](pymsg/) 协议(TCP 长度前缀帧 + JSON),单一路由 `_route: "execute"`,接收结构化 JSON(action + table + where + values),翻译为 SQL 执行。
|
||||||
- 支持 select / insert / update / delete,运算符包括 eq、ne、gt、lt、ge、le、like、in,支持排序与分页。
|
- 支持 select / insert / update / delete,运算符包括 eq、ne、gt、lt、ge、le、like、in,支持排序与分页。
|
||||||
@@ -152,7 +161,7 @@
|
|||||||
- 外部服务通过 `log_client.py` 以 pymsg 调 execute 路由逐条 INSERT 写入日志。
|
- 外部服务通过 `log_client.py` 以 pymsg 调 execute 路由逐条 INSERT 写入日志。
|
||||||
- `_log_internal()` — db 进程内部直接写 Logs 表,无网络往返,防递归设计。
|
- `_log_internal()` — db 进程内部直接写 Logs 表,无网络往返,防递归设计。
|
||||||
- 后台守护线程每小时自动清理:保留 30 天 / 上限 100 万条。
|
- 后台守护线程每小时自动清理:保留 30 天 / 上限 100 万条。
|
||||||
- **统一日志客户端 SDK**(各服务目录下的 `log_client.py`,如 [dnfs/log_client.py](dnfs/log_client.py)):各服务复制即用,纯标准库实现,异步非阻塞(内存队列 + 后台线程,50 条/2 秒批量 flush),fail-safe 设计(db 不可用时静默丢弃,不影响业务)。
|
- **统一日志客户端 SDK**(各服务目录下的 `log_client.py`,如 [smtp/log_client.py](smtp/log_client.py)):各服务复制即用,纯标准库实现,异步非阻塞(内存队列 + 后台线程,50 条/2 秒批量 flush),fail-safe 设计(db2 不可用时静默丢弃,不影响业务)。
|
||||||
|
|
||||||
### db2(通用数据库服务 · C++20 重实现)
|
### db2(通用数据库服务 · C++20 重实现)
|
||||||
|
|
||||||
@@ -171,14 +180,14 @@
|
|||||||
- **fail-closed 设计**:API 异常或响应解析失败时一律返回 `{"invalid": "true"}`(拦截),宁可误拦不可漏放。
|
- **fail-closed 设计**:API 异常或响应解析失败时一律返回 `{"invalid": "true"}`(拦截),宁可误拦不可漏放。
|
||||||
- 配置通过 `.env` 文件(已 gitignore),含 DeepSeek API 密钥、模型参数、监听地址。
|
- 配置通过 `.env` 文件(已 gitignore),含 DeepSeek API 密钥、模型参数、监听地址。
|
||||||
|
|
||||||
### captcha(验证码服务)
|
### captcha2(验证码服务 · C++20 重实现)
|
||||||
|
|
||||||
- 生成图形验证码,Token 一次性使用、5 分钟过期;基于 [pymsg](pymsg/) 协议(TCP 长度前缀帧 + JSON),仅依赖 PIL。
|
- captcha 的 C++20 重实现(原 Python `captcha/` 目录保留为遗留,不再部署),生成图形验证码,Token 一次性使用、5 分钟过期;基于 [pymsg](pymsg/) 协议(TCP 长度前缀帧 + JSON)。
|
||||||
- pymsg 路由:`image`(生成,返回 token + base64 PNG)、`verify`(校验,一次性消费)、`health`。
|
- pymsg 路由:`image`(生成,返回 token + base64 PNG)、`verify`(校验,一次性消费)、`health`。
|
||||||
- 答案比较采用 XOR 防时序攻击;错误答案与无效 Token 分别返回 `{valid:false}` 与 `{valid:false, error:...}`。
|
- 答案比较采用 XOR 防时序攻击;错误答案与无效 Token 分别返回 `{valid:false}` 与 `{valid:false, error:...}`。
|
||||||
- **gateway 代理路由**:`GET /captcha/image` 经 pymsg 调 captcha 后解码 PNG,以 `image/png` + `X-Captcha-Token` 响应头返回浏览器(`Cache-Control: no-store`)。
|
- **ca 代理路由**:`GET /captcha/image` 经 pymsg 调 captcha2 后解码 PNG,以 `image/png` + `X-Captcha-Token` 响应头返回浏览器(`Cache-Control: no-store`)。
|
||||||
- 由 `gateway` 在 `/login`、`/register` 中可选启用 CAPTCHA 校验(字段 `captcha_token` / `captcha_answer`)。
|
- 由 `ca` 在 `/login`、`/register` 中可选启用 CAPTCHA 校验(字段 `captcha_token` / `captcha_answer`)。
|
||||||
- 内存存储,不支持多实例水平扩展(需换 Redis);详见 [captcha/README.md](captcha/README.md)。
|
- 内存存储,不支持多实例水平扩展(需换 Redis);详见 [captcha2/README.md](captcha2/README.md)。
|
||||||
|
|
||||||
### smtp(邮件服务)
|
### smtp(邮件服务)
|
||||||
|
|
||||||
@@ -192,28 +201,29 @@
|
|||||||
- 零 Web 框架依赖:纯 Python 标准库 `http.server` + `ThreadingMixIn` 多线程并发。
|
- 零 Web 框架依赖:纯 Python 标准库 `http.server` + `ThreadingMixIn` 多线程并发。
|
||||||
- 智能重定向:GET/HEAD → 301(搜索引擎友好永久重定向),POST/PUT/DELETE/PATCH → 308(保留方法与 body)。
|
- 智能重定向:GET/HEAD → 301(搜索引擎友好永久重定向),POST/PUT/DELETE/PATCH → 308(保留方法与 body)。
|
||||||
- Host 保留:读取请求 `Host` 头构造重定向 URL(剥离端口),回退用配置的监听地址。
|
- Host 保留:读取请求 `Host` 头构造重定向 URL(剥离端口),回退用配置的监听地址。
|
||||||
- 日志集成:通过 `log_client.py` 异步批量推送运行日志到 db 的 Logs 表(fail-safe)。
|
- 日志集成:通过 `log_client.py` 异步批量推送运行日志到 db2 的 Logs 表(fail-safe)。
|
||||||
- 配置分层:CLI 参数(由 core/services.yaml 传入) > 环境变量(`REDIRECT80_*`) > 代码默认值,不依赖 confs。
|
- 配置分层:CLI 参数(由 core/services.yaml 传入) > 环境变量(`REDIRECT80_*`) > 代码默认值,不依赖 confs。
|
||||||
- 80 端口为 Linux 特权端口(<1024),需 `CAP_NET_BIND_SERVICE` 或 root;`_run.sh` 自动尝试 `setcap`,或用 systemd `AmbientCapabilities`;详见 [redirect80/README.md](redirect80/README.md)。
|
- 80 端口为 Linux 特权端口(<1024),需 `CAP_NET_BIND_SERVICE` 或 root;`_run.sh` 自动尝试 `setcap`,或用 systemd `AmbientCapabilities`;详见 [redirect80/README.md](redirect80/README.md)。
|
||||||
|
|
||||||
### confs(统一配置服务)
|
### confs(统一配置服务 · 已内嵌进 core)
|
||||||
|
|
||||||
- 集中存放各微服务的配置文件(`confs/configs/`),基于 pymsg(RpcServer,TCP 长度前缀帧 + JSON)分发,监听 127.0.0.1:8010。
|
- 独立 Python `confs` 服务已废弃(不再部署),配置分发逻辑已内嵌进 `core`(`ConfsTask`,由 `--confs 8010` 启用,协议与 Python 版字节级兼容,消费方零改动)。
|
||||||
|
- 集中存放各服务的配置文件(`confs/configs/`),基于 pymsg(RpcServer,TCP 长度前缀帧 + JSON)分发。
|
||||||
- pymsg 路由:`get`(取配置文件全文;带 `key` 时按键提取,ini 用 `Section.option`、json 用点号路径)、`list`(列出全部配置及元信息)、`reload`(重载指定配置,缺省清空全部缓存)、`health`。
|
- pymsg 路由:`get`(取配置文件全文;带 `key` 时按键提取,ini 用 `Section.option`、json 用点号路径)、`list`(列出全部配置及元信息)、`reload`(重载指定配置,缺省清空全部缓存)、`health`。
|
||||||
- 内存缓存 + 文件 mtime 变化自动重载,改配置无需重启 confs;配置名校验(basename + realpath 前缀 + 扩展名白名单)防路径遍历。
|
- 内存缓存 + 文件 mtime 变化自动重载,改配置无需重启;配置名校验(basename + realpath 前缀 + 扩展名白名单)防路径遍历。
|
||||||
- 消费方约定:服务启动时用 `RpcClient(8010).call("get", {"name": "<服务名>.ini"})` 拉取配置。各模块目录不再保留本地 ini(fail-safe 回退已废除)。
|
- 消费方约定:服务启动时用 `RpcClient(8010).call("get", {"name": "<服务名>.ini"})` 拉取配置。各模块目录不再保留本地 ini(fail-safe 回退已废除)。
|
||||||
|
|
||||||
**配置文件清单与依赖强度**(均位于 `confs/configs/`):
|
**配置文件清单与依赖强度**(均位于 `confs/configs/`):
|
||||||
|
|
||||||
| 配置文件 | 消费模块 | 依赖强度 |
|
| 配置文件 | 消费模块 | 依赖强度 |
|
||||||
|----------|----------|----------|
|
|----------|----------|----------|
|
||||||
| `gateway.ini` | gateway | confs 拉取(0.7.0 起配置完全迁入) |
|
| `gateway.ini` | gateway | confs 拉取(0.7.0 起配置完全迁入;其余服务已全部改为 CLI 传递,不再依赖 confs) |
|
||||||
|
|
||||||
- **部署安全约定**:`confs/configs/*.ini` 含敏感字段,权限必须收紧为 `root:root 0640`,仅 root 可写;被同机普通用户篡改可劫持对应服务(详见 `docs/security/core_SECURITY_AUDIT_20260801.md` 2026-08-10 复审)。原 `ca.ini` 管理员白名单已随 ca v1.1.0 迁入 `core/services.yaml` 的 CLI args;原 `smtp.ini` 全部配置已随 smtp3 迁入 `core/services.yaml` 的 CLI args(SMTP 凭据仍经 `.env` 注入);原 `captcha.ini` 与 `static.ini` 已分别随 captcha2、fsys 迁入 CLI args,防护对象相应转为 `services.yaml` 与 `.env` 的文件权限。
|
- **部署安全约定**:`confs/configs/*.ini` 含敏感字段,权限必须收紧为 `root:root 0640`,仅 root 可写;被同机普通用户篡改可劫持对应服务(详见 `docs/security/core_SECURITY_AUDIT_20260801.md` 2026-08-10 复审)。原 `ca.ini` 管理员白名单已随 ca v1.1.0 迁入 `core/services.yaml` 的 CLI args;原 `smtp.ini` 全部配置已随 smtp3 迁入 `core/services.yaml` 的 CLI args(SMTP 凭据仍经 `.env` 注入);原 `captcha.ini` 与 `static.ini` 已分别随 captcha2、fsys 迁入 CLI args,防护对象相应转为 `services.yaml` 与 `.env` 的文件权限。
|
||||||
|
|
||||||
### aibox(独立 AI 智能体系统)
|
### aibox(独立 AI 智能体系统)
|
||||||
|
|
||||||
- 一套相对独立的单智能体产品,基于 DeepSeek + WebSocket(:8765),由 `core` 拉起但与 waf / gateway / dnfs 等主干微服务无调用关系。
|
- 一套相对独立的单智能体产品,基于 DeepSeek + WebSocket(:8765),由 `core` 拉起但与 waf / gateway / dnfs2 等主干微服务无调用关系。
|
||||||
- 自带技能系统(`skills/`)、任务调度器、记忆管理、前端页面与语音客户端(`voice_client.py`)。
|
- 自带技能系统(`skills/`)、任务调度器、记忆管理、前端页面与语音客户端(`voice_client.py`)。
|
||||||
- 默认模型 `deepseek-v4-flash`,配置在 `config.json`;详见 [aibox/README.md](aibox/README.md)。
|
- 默认模型 `deepseek-v4-flash`,配置在 `config.json`;详见 [aibox/README.md](aibox/README.md)。
|
||||||
|
|
||||||
@@ -260,8 +270,8 @@
|
|||||||
|
|
||||||
| 文件 | 说明 |
|
| 文件 | 说明 |
|
||||||
|------|------|
|
|------|------|
|
||||||
| [pymsg](pymsg/) | 自研 RPC 基础库(setuptools 包),协议为 `[4字节大端长度][UTF-8 JSON]`,提供 `send/recv/MsgClient/MsgServer`;db 服务端与各 log_client 的基础依赖,requirements 以 `../pymsg` 本地路径引用 |
|
| [pymsg](pymsg/) | 自研 RPC 基础库(setuptools 包),协议为 `[4字节大端长度][UTF-8 JSON]`,提供 `send/recv/MsgClient/MsgServer`;db/db2 服务端与各 log_client 的基础依赖,requirements 以 `../pymsg` 本地路径引用 |
|
||||||
| log_client.py | 统一日志客户端 SDK,各服务目录各持一份副本(如 [dnfs/log_client.py](dnfs/log_client.py)),纯标准库 + pymsg,异步批量推送 |
|
| log_client.py | 统一日志客户端 SDK,各服务目录各持一份副本(如 [smtp/log_client.py](smtp/log_client.py)),纯标准库 + pymsg,异步批量推送 |
|
||||||
| security_middleware.py | Flask 安全响应头中间件(CSP / X-Frame-Options / nosniff 等),各服务各持一份副本 |
|
| security_middleware.py | Flask 安全响应头中间件(CSP / X-Frame-Options / nosniff 等),各服务各持一份副本 |
|
||||||
|
|
||||||
## 端口一览
|
## 端口一览
|
||||||
@@ -270,15 +280,16 @@
|
|||||||
|------|------|----------|------|
|
|------|------|----------|------|
|
||||||
| 80 | redirect80 | 0.0.0.0 | HTTP 入口,301/308 重定向到 HTTPS :443 |
|
| 80 | redirect80 | 0.0.0.0 | HTTP 入口,301/308 重定向到 HTTPS :443 |
|
||||||
| 443 | waf | 0.0.0.0 | HTTPS 对外入口(终止 TLS + coraza 规则匹配) |
|
| 443 | waf | 0.0.0.0 | HTTPS 对外入口(终止 TLS + coraza 规则匹配) |
|
||||||
| 8443 | gateway | 127.0.0.1 | 应用层网关(内部 HTTP,由 waf 转发) |
|
| 8443 | ca | 127.0.0.1 | 中央认证服务(内部 HTTP,由 waf 转发,认证+前置转发) |
|
||||||
|
| 8445 | gateway | 127.0.0.1 | 应用层网关(内部 HTTP,仅 loopback 纯转发) |
|
||||||
| 5200 | core | — | PMC HTTP 管理接口 |
|
| 5200 | core | — | PMC HTTP 管理接口 |
|
||||||
| 9200 | static | 127.0.0.1 | 前端托管(经 gateway 代理) |
|
| 8010 | core(内嵌 confs) | 127.0.0.1 | 统一配置服务(pymsg/TCP,仅 gateway.ini 仍由其分发) |
|
||||||
| 8006 | dnfs | 127.0.0.1 | 树状菜单(经 gateway 代理) |
|
| 9200 | fsys | 127.0.0.1 | 前端托管(经 gateway 代理) |
|
||||||
| 8005 | db | 127.0.0.1 | 数据库服务(pymsg/TCP,仅内部调用) |
|
| 8006 | dnfs2 | 127.0.0.1 | 树状菜单(经 gateway 代理) |
|
||||||
|
| 8005 | db2 | 127.0.0.1 | 数据库服务(pymsg/TCP,仅内部调用) |
|
||||||
| 8007 | ai_review | 127.0.0.1 | AI 审核(仅内部调用) |
|
| 8007 | ai_review | 127.0.0.1 | AI 审核(仅内部调用) |
|
||||||
| 8009 | captcha | 127.0.0.1 | 验证码服务(pymsg/TCP,经 gateway 代理) |
|
| 8009 | captcha2 | 127.0.0.1 | 验证码服务(pymsg/TCP,经 ca 代理) |
|
||||||
| 8008 | smtp | 127.0.0.1 | 邮件服务(仅内部调用,注册验证码邮件后端) |
|
| 8008 | smtp | 127.0.0.1 | 邮件服务(仅内部调用,注册验证码邮件后端) |
|
||||||
| 8010 | confs | 127.0.0.1 | 统一配置服务(pymsg/TCP,仅内部调用) |
|
|
||||||
| 8765 | aibox | 127.0.0.1 | AI 智能体(WebSocket,独立产品) |
|
| 8765 | aibox | 127.0.0.1 | AI 智能体(WebSocket,独立产品) |
|
||||||
| — | bot4cj | — (树莓派 I2C) | 机器人硬件脚本解析器(独立硬件项目,不联网) |
|
| — | bot4cj | — (树莓派 I2C) | 机器人硬件脚本解析器(独立硬件项目,不联网) |
|
||||||
| — | lci | — (树莓派 /dev/fb0) | 嵌入式帧缓冲图形界面(独立硬件项目,不联网) |
|
| — | lci | — (树莓派 /dev/fb0) | 嵌入式帧缓冲图形界面(独立硬件项目,不联网) |
|
||||||
@@ -314,7 +325,7 @@ bash _setup.deb.sh # Debian/Ubuntu
|
|||||||
# 或
|
# 或
|
||||||
bash _setup.rhel.sh # RHEL/CentOS/Rocky/Fedora
|
bash _setup.rhel.sh # RHEL/CentOS/Rocky/Fedora
|
||||||
|
|
||||||
# 2. 依次安装各模块(libth -> libhttp -> libcrypt -> libsqlite3 -> libmsg -> gateway -> waf -> static -> dnfs -> db -> smtp -> captcha -> confs -> ai_review -> aibox -> redirect80 -> core)
|
# 2. 依次安装各模块(libth -> libhttp -> libcrypt -> libsqlite3 -> libmsg -> liblogc -> gateway -> waf -> static -> fsys -> dnfs -> dnfs2 -> db -> db2 -> smtp -> smtp3 -> captcha -> captcha2 -> confs -> ai_review -> aibox -> redirect80 -> core;legacy Python 版与 C++ 重写版均构建,生产由 core 按 services.yaml 拉起新版)
|
||||||
bash _inst.sh
|
bash _inst.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -351,9 +362,9 @@ services:
|
|||||||
systemctl start Nidus # 或 bash core/_run.sh
|
systemctl start Nidus # 或 bash core/_run.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
对外访问入口:`https://<host>:443`(由 waf 终止 TLS 后转发到 gateway)。
|
对外访问入口:`https://<host>:443`(由 waf 终止 TLS 后转发到 ca)。
|
||||||
|
|
||||||
### WAF 与 gateway 的协作
|
### WAF 与 ca 的协作
|
||||||
|
|
||||||
WAF 启用后,证书从 gateway 迁移到 waf:
|
WAF 启用后,证书从 gateway 迁移到 waf:
|
||||||
|
|
||||||
@@ -362,28 +373,28 @@ mkdir -p /opt/micro_servers/waf/certs
|
|||||||
cp /opt/micro_servers/gateway/full_chain.crt /opt/micro_servers/gateway/server.key /opt/micro_servers/waf/certs/
|
cp /opt/micro_servers/gateway/full_chain.crt /opt/micro_servers/gateway/server.key /opt/micro_servers/waf/certs/
|
||||||
```
|
```
|
||||||
|
|
||||||
gateway 改为内部 HTTP 模式([example.ini](gateway/example.ini) 中 `tls = off`、`address = 127.0.0.1`、`port = 8443`)。
|
ca 改为内部 HTTP 模式(`core/services.yaml` 中 ca 条目 args:`--host 127.0.0.1`、`--port 8443`)。
|
||||||
|
|
||||||
如需独立部署(不使用 WAF),把 gateway 的 `tls = on`、`port = 443`、`address = 0.0.0.0`,证书留在 gateway 目录即可。
|
如需独立部署(不使用 WAF),把 waf 从 `services.yaml` 移除,ca 的 `--port` 设为 443、证书留在 ca 目录即可。
|
||||||
|
|
||||||
## 关于架构定位
|
## 关于架构定位
|
||||||
|
|
||||||
本项目具备微服务架构的核心特征,是一种**进程托管式轻量微服务**:
|
本项目具备微服务架构的核心特征,是一种**进程托管式轻量微服务**:
|
||||||
|
|
||||||
- **服务按业务能力拆分**:WAF 网关、应用网关、前端托管、节点树、数据库、内容审核各自独立、独立端口、独立数据存储。
|
- **服务按业务能力拆分**:WAF 网关、应用网关、前端托管、节点树、数据库、内容审核各自独立、独立端口、独立数据存储。
|
||||||
- **API 网关模式**:`waf` 作为边缘网关统一入口,`gateway` 承担鉴权与反向代理,内部服务通过 `closed` 列表隔离。
|
- **API 网关模式**:`waf` 作为边缘网关统一入口,`ca` 承担应用层鉴权与前置转发,`gateway` 纯转发,内部服务通过 `closed` 列表隔离。
|
||||||
- **进程编排/守护**:`core` 作为服务管理器拉起并守护子进程,类似简易版 supervisor。
|
- **进程编排/守护**:`core` 作为服务管理器拉起并守护子进程,类似简易版 supervisor。
|
||||||
- **多语言异构**:C++(core / gateway / db2 / dnfs2)、Python(static / dnfs / db / ai_review / redirect80 / BotOps)、Go(waf)、仓颉/Cangjie(bot4cj)混合,对外 HTTP、内部数据访问走 pymsg/TCP。
|
- **多语言异构**:C++(core / gateway / ca / db2 / dnfs2 / fsys / captcha2)、Python(ai_review / smtp / redirect80 / aibox / BotOps,及 static / dnfs / db / captcha / confs 等遗留)、Go(waf)、仓颉/Cangjie(bot4cj)混合,对外 HTTP、内部数据访问走 pymsg/TCP。
|
||||||
- **数据访问层解耦**:`db` 服务将数据库操作收敛为统一的 pymsg/TCP 接口,业务服务无需直连数据库。
|
- **数据访问层解耦**:`db2` 服务将数据库操作收敛为统一的 pymsg/TCP 接口,业务服务无需直连数据库。
|
||||||
- **AI 能力集成**:`ai_review` 以 RAG 增强的 LLM 审核为业务层提供内容安全能力,支持人工反馈闭环。
|
- **AI 能力集成**:`ai_review` 以 RAG 增强的 LLM 审核为业务层提供内容安全能力,支持人工反馈闭环。
|
||||||
- **集中式可观测性**:`db` 内置日志表与自动清理,各服务通过 `log_client.py` SDK 异步推送日志(pymsg),实现全链路汇聚,无需引入额外中间件。
|
- **集中式可观测性**:`db2` 内置日志表与自动清理,各服务通过 `log_client.py` SDK 异步推送日志(pymsg),实现全链路汇聚,无需引入额外中间件。
|
||||||
- **安全分层**:`waf` 在边缘做规则匹配(OWASP CRS / 自定义 SecLang 规则),`gateway` 在应用层做鉴权,`db` 仅监听本机,多层防护。
|
- **安全分层**:`waf` 在边缘做规则匹配(OWASP CRS / 自定义 SecLang 规则),`ca` 在应用层做鉴权,`db2` 仅监听本机,多层防护。
|
||||||
|
|
||||||
与云原生微服务的差异:未引入服务注册发现、容器编排、消息总线,服务地址在 `waf/config.yaml` 与 `gateway/example.ini` 中静态配置。对于个人/中小规模的 DIY 场景,这种取舍在简洁性与可控性上是合理的。
|
与云原生微服务的差异:未引入服务注册发现、容器编排、消息总线,服务地址在 `waf/config.yaml` 与 `confs/configs/gateway.ini` 中静态配置。对于个人/中小规模的 DIY 场景,这种取舍在简洁性与可控性上是合理的。
|
||||||
|
|
||||||
## 文档管理约定
|
## 文档管理约定
|
||||||
|
|
||||||
所有项目文档统一通过根目录 [docs/](docs/) 聚合管理,入口索引见 [docs/INDEX.md](docs/INDEX.md)。文档分类与存放规则如下:
|
所有项目文档统一通过根目录 [docs/](docs/) 聚合管理。文档分类与存放规则如下:
|
||||||
|
|
||||||
| 文档类型 | 存放位置 | 说明 |
|
| 文档类型 | 存放位置 | 说明 |
|
||||||
|----------|----------|------|
|
|----------|----------|------|
|
||||||
|
|||||||
+3
-3
@@ -5,7 +5,7 @@ dnfs 的 C++ 重实现,接口与 Python dnfs 完全兼容,修复 P0/P1 安
|
|||||||
## 架构
|
## 架构
|
||||||
|
|
||||||
```
|
```
|
||||||
gateway (验签/转发)
|
ca :8443 (验签 /whoami,验签通过后经 gateway 转发)
|
||||||
│ Bearer Token
|
│ Bearer Token
|
||||||
▼
|
▼
|
||||||
dnfs2 :8006 ──pymsg──► db2 :8005 (execute 路由) ──► SQLite
|
dnfs2 :8006 ──pymsg──► db2 :8005 (execute 路由) ──► SQLite
|
||||||
@@ -15,7 +15,7 @@ dnfs2 :8006 ──pymsg──► db2 :8005 (execute 路由) ──► SQLite
|
|||||||
```
|
```
|
||||||
|
|
||||||
- **HTTP 服务**: libhttp `HttpServer`(Boost.Beast 异步,多线程)
|
- **HTTP 服务**: libhttp `HttpServer`(Boost.Beast 异步,多线程)
|
||||||
- **Token 验签**: HttpClient POST gateway `/whoami`,fail-closed(503)
|
- **Token 验签**: HttpClient POST ca `/whoami`(CLI 参数 `--gateway-url` 指向 ca:8443),fail-closed(503)
|
||||||
- **数据操作**: libmsg `RpcClient` 调 db2 `execute` 路由
|
- **数据操作**: libmsg `RpcClient` 调 db2 `execute` 路由
|
||||||
- **内容审核**: HttpClient POST ai_review `/review`,fail-closed
|
- **内容审核**: HttpClient POST ai_review `/review`,fail-closed
|
||||||
- **异步日志**: libmsg `AsyncQueue` → db2 Logs 表
|
- **异步日志**: libmsg `AsyncQueue` → db2 Logs 表
|
||||||
@@ -45,7 +45,7 @@ dnfs2 :8006 ──pymsg──► db2 :8005 (execute 路由) ──► SQLite
|
|||||||
| 数据库超时 | `--db-timeout` | — | 10 |
|
| 数据库超时 | `--db-timeout` | — | 10 |
|
||||||
| AI 审核URL | `--review-url` | `REVIEW_URL` | http://127.0.0.1:8007/review |
|
| AI 审核URL | `--review-url` | `REVIEW_URL` | http://127.0.0.1:8007/review |
|
||||||
| AI 审核超时 | `--review-timeout` | — | 10 |
|
| AI 审核超时 | `--review-timeout` | — | 10 |
|
||||||
| 网关验签URL | `--gateway-url` | `GATEWAY_URL` | http://127.0.0.1:8443/whoami |
|
| ca 验签URL | `--gateway-url` | `GATEWAY_URL` | http://127.0.0.1:8443/whoami |
|
||||||
| 网关超时 | `--gateway-timeout` | — | 5 |
|
| 网关超时 | `--gateway-timeout` | — | 5 |
|
||||||
| 日志级别 | `--log-level` | — | info |
|
| 日志级别 | `--log-level` | — | info |
|
||||||
| 实例名 | `--instance` | — | dnfs2 |
|
| 实例名 | `--instance` | — | dnfs2 |
|
||||||
|
|||||||
+17
-16
@@ -1,6 +1,6 @@
|
|||||||
# Blackbird 架构文档(UniServe Framework)
|
# Blackbird 架构文档(UniServe Framework)
|
||||||
|
|
||||||
> 权威架构参考。本文以 `core/init.txt`(实际运行清单)与 `git HEAD` 为事实来源。
|
> 权威架构参考。本文以 `core/services.yaml`(实际运行清单)与 `git HEAD` 为事实来源。
|
||||||
> 与根目录 `README.md` 的偏差见文末「§10 与 README 的偏差」。
|
> 与根目录 `README.md` 的偏差见文末「§10 与 README 的偏差」。
|
||||||
> 最后核对于:2026-08-10。
|
> 最后核对于:2026-08-10。
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ Blackbird 是一套 **进程托管式轻量微服务** 系统(自研 UniServe
|
|||||||
┌──────────────────────────────────────────────────┐
|
┌──────────────────────────────────────────────────┐
|
||||||
│ core (PMC / Nidus) │
|
│ core (PMC / Nidus) │
|
||||||
│ 进程托管 :5200 (HTTP 管理) + 内嵌 confs :8010 │
|
│ 进程托管 :5200 (HTTP 管理) + 内嵌 confs :8010 │
|
||||||
│ 读 init.txt 拉起并守护下列子进程 │
|
│ 读 services.yaml 拉起并守护下列子进程 │
|
||||||
└───────────────────────┬──────────────────────────┘
|
└───────────────────────┬──────────────────────────┘
|
||||||
│ 启动 / 守护
|
│ 启动 / 守护
|
||||||
┌────────────────┬───────────────────────┼──────────────────┬─────────────────┐
|
┌────────────────┬───────────────────────┼──────────────────┬─────────────────┐
|
||||||
@@ -92,10 +92,10 @@ Blackbird 是一套 **进程托管式轻量微服务** 系统(自研 UniServe
|
|||||||
actpred / memdb / libtry (实验 / 支撑库)
|
actpred / memdb / libtry (实验 / 支撑库)
|
||||||
|
|
||||||
日志链路: 各服务 log_client ──pymsg──► db2:8005 Logs 表 (fail-safe, db 不可用时静默丢弃)
|
日志链路: 各服务 log_client ──pymsg──► db2:8005 Logs 表 (fail-safe, db 不可用时静默丢弃)
|
||||||
配置链路: core 内嵌 confs :8010 ──pymsg get──► 各服务 (confs/configs/*.ini, mtime 自动重载)
|
配置链路: gateway ──pymsg get──► core 内嵌 confs :8010 (confs/configs/gateway.ini, mtime 自动重载;其余服务配置纯 CLI 传递)
|
||||||
```
|
```
|
||||||
|
|
||||||
> 注:`core` 启动参数为 `./nidus.out -i init.txt --serve 5200 --confs 8010`,`--confs` 启用内嵌配置服务(由 confs2 合并而来,与 Python confs 协议兼容)。
|
> 注:`core` 启动参数为 `./nidus.out -i . --serve 5200 --confs 8010`(`-i .` 指向 services.yaml 所在目录),`--confs` 启用内嵌配置服务(由 confs2 合并而来,与 Python confs 协议兼容)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -122,7 +122,7 @@ Blackbird 是一套 **进程托管式轻量微服务** 系统(自研 UniServe
|
|||||||
|
|
||||||
### 4.4 日志 / 配置(横切)
|
### 4.4 日志 / 配置(横切)
|
||||||
- 各服务内置 `log_client`(异步队列 + 后台批量 flush)→ pymsg 写 `db2:8005` 的 `Logs` 表;`db2` 自带 30 天/100 万条清理线程。
|
- 各服务内置 `log_client`(异步队列 + 后台批量 flush)→ pymsg 写 `db2:8005` 的 `Logs` 表;`db2` 自带 30 天/100 万条清理线程。
|
||||||
- 各服务启动时经 pymsg `get` 从 `core:8010` 拉取自身 `.ini`;`confs/configs/` 下 mtime 变化自动重载;环境变量覆盖;命令行参数最高优先级。
|
- `gateway` 启动时经 pymsg `get` 从 `core:8010` 拉取 `gateway.ini`;`confs/configs/` 下 mtime 变化自动重载。其余服务配置纯 CLI 传递(CLI > 环境变量 > 默认值),不依赖 confs。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ Blackbird 是一套 **进程托管式轻量微服务** 系统(自研 UniServe
|
|||||||
| **memdb** | C++20 | — | — | 内存数据库 | 实验/支撑 |
|
| **memdb** | C++20 | — | — | 内存数据库 | 实验/支撑 |
|
||||||
| **libtry** | C | — | — | 嵌入式脚本解释器 | 支撑 |
|
| **libtry** | C | — | — | 嵌入式脚本解释器 | 支撑 |
|
||||||
|
|
||||||
### 已被替代、不应再部署的遗留模块(不在 init.txt)
|
### 已被替代、不应再部署的遗留模块(不在 services.yaml)
|
||||||
| 遗留 | 替代 | 说明 |
|
| 遗留 | 替代 | 说明 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| `static` (Python) | `fsys` | 前端托管已 C++ 重写 |
|
| `static` (Python) | `fsys` | 前端托管已 C++ 重写 |
|
||||||
@@ -157,7 +157,7 @@ Blackbird 是一套 **进程托管式轻量微服务** 系统(自研 UniServe
|
|||||||
| `dnfs` (Python) | `dnfs2` | 笔记服务已 C++ 重写 |
|
| `dnfs` (Python) | `dnfs2` | 笔记服务已 C++ 重写 |
|
||||||
| `captcha` (Python) | `captcha2` | 验证码已 C++ 重写 |
|
| `captcha` (Python) | `captcha2` | 验证码已 C++ 重写 |
|
||||||
| `confs` (Python) | 并入 `core` | 配置服务内嵌进 core(ConfsTask) |
|
| `confs` (Python) | 并入 `core` | 配置服务内嵌进 core(ConfsTask) |
|
||||||
| `smtp3` (C++) | (预备) | 代码就绪,init.txt 仍用 Python `smtp`,尚未平替 |
|
| `smtp3` (C++) | (预备) | 代码就绪,services.yaml 仍用 Python `smtp`,尚未平替 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -226,22 +226,23 @@ Blackbird 是一套 **进程托管式轻量微服务** 系统(自研 UniServe
|
|||||||
## 9. 演进策略与已知缺口
|
## 9. 演进策略与已知缺口
|
||||||
|
|
||||||
- **无服务注册发现 / 容器编排**:服务地址在 `waf/config.yaml` 与 `gateway` 的 `Proxy.*` 中静态配置,由 `core` 进程托管。适合个人/中小规模 DIY,但扩展需手工。
|
- **无服务注册发现 / 容器编排**:服务地址在 `waf/config.yaml` 与 `gateway` 的 `Proxy.*` 中静态配置,由 `core` 进程托管。适合个人/中小规模 DIY,但扩展需手工。
|
||||||
- **smtp3 待上线**:C++ 重写已完成并通过安全审计,但 init.txt 仍指向 Python `smtp`,建议择机平替以消除最后一块 Python 有状态服务。
|
- **smtp3 待上线**:C++ 重写已完成并通过安全审计,但 services.yaml 仍指向 Python `smtp`,建议择机平替以消除最后一块 Python 有状态服务。
|
||||||
- **可观测性缺口**:缺 tracing/metrics/告警,建议后续引入轻量方案(或复用 db2 Logs + 定时聚合)。
|
- **可观测性缺口**:缺 tracing/metrics/告警,建议后续引入轻量方案(或复用 db2 Logs + 定时聚合)。
|
||||||
- **水平扩展限制**:smtp/captcha 内存态为单点,若需多实例需引入 Redis 等共享存储。
|
- **水平扩展限制**:smtp/captcha 内存态为单点,若需多实例需引入 Redis 等共享存储。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 10. 与 README.md 的偏差(待同步)
|
## 10. 与 README.md 的偏差(已同步,2026-08-10)
|
||||||
|
|
||||||
以下为本文相对于根 `README.md` 的纠正点,建议择机回填 README:
|
以下为本文相对于根 `README.md` 的纠正点。2026-08-10 已按本清单回填 README 并同步 MODULES.md,状态如下:
|
||||||
|
|
||||||
1. **端口**:README 端口表写 `gateway 8443`,实际 `ca:8443`、`gateway:8445`(v0.9.0 起)。README 正文已正确,仅端口表需改。
|
1. **端口**:✅ 已修正。README 端口表原写 `gateway 8443`,现已改为 `ca:8443`、`gateway:8445`。
|
||||||
2. **前端模块**:README 仍列 `static`(Python)为主,实际生产为 `fsys`(C++ 重写),`static` 已废弃。
|
2. **前端模块**:✅ 已修正。README 现以 `fsys`(C++ 重写)为主表,`static` 标注遗留。
|
||||||
3. **C++ 重写版未进主表**:README 模块表仍以 `db`/`dnfs`/`captcha`/`confs` 为主,实际生产跑 `db2`/`dnfs2`/`captcha2`,`confs` 已并入 `core`。
|
3. **C++ 重写版未进主表**:✅ 已修正。README 模块表现以 `db2`/`dnfs2`/`captcha2` 为主,`db`/`dnfs`/`captcha` 标注遗留,`confs` 标注已并入 `core`。
|
||||||
4. **init.txt 不含 confs**:独立 confs 服务已不用,配置由 `core --confs 8010` 内嵌提供。
|
4. **init.txt**:✅ 已同步。core 已于 2026-08 移除 init.txt 兼容,仅支持 `services.yaml`(提交 b0d71a4);README/本文件均已更新为 `-i . --serve 5200 --confs 8010`。
|
||||||
5. **fsys README 图示滞后**:`fsys/README.md` 架构图仍写 `gateway :8443`,应为 `ca:8443 → gateway:8445`。
|
5. **fsys README 图示滞后**:✅ 已修正(2026-08-10)。`fsys/README.md` 架构图与配置章节已更新为 `ca:8443 → gateway:8445`、纯 CLI 配置。
|
||||||
6. **工作记忆偏差**:项目记忆中的 `gateway:8443 → fsys / dnfs` 与 `confs:8010` 需更新为 `ca:8443 → gateway:8445`、`dnfs2`、confs 内嵌 core。
|
6. **工作记忆偏差**:✅ 已同步。`ca:8443 → gateway:8445`、`dnfs2`、confs 内嵌 core 均已写入各文档。
|
||||||
|
7. **dnfs2 README 图示滞后**:✅ 已修正(2026-08-10)。`dnfs2/README.md` 架构图与验签描述已更新为 ca:8443(CLI 参数 `--gateway-url` 指向 ca)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
+20
-18
@@ -1,41 +1,43 @@
|
|||||||
# 模块清单(blackbird / micro_servers)
|
# 模块清单(blackbird / micro_servers)
|
||||||
|
|
||||||
> 一套 DIY 的轻量级「进程托管式微服务」(UniServe Framework)。
|
> 一套 DIY 的轻量级「进程托管式微服务」(UniServe Framework)。
|
||||||
> 混合语言:C++20(core/gateway/dnfs2/db2/lib*)、Python(fsys/dnfs/db/ai_review/smtp/captcha/confs/redirect80/BotOps/aibox/actpred/pymsg)、Go(waf)、仓颉/Cangjie(bot4cj)。
|
> 混合语言:C++20(core/gateway/ca/dnfs2/db2/fsys/captcha2/lib*)、Python(static/dnfs/db/ai_review/smtp/captcha/confs/redirect80/BotOps/aibox/actpred/pymsg,多为遗留)、Go(waf)、仓颉/Cangjie(bot4cj)。
|
||||||
> 由 `core` 读 `init.txt` 拉起并守护各子进程;`waf:443 → gateway:8443 → 业务服务` 为对外主链路。
|
> 由 `core` 读 `services.yaml` 拉起并守护各子进程;`waf:443 → ca:8443 → gateway:8445 → 业务服务` 为对外主链路。
|
||||||
|
|
||||||
## 一、核心与编排
|
## 一、核心与编排
|
||||||
|
|
||||||
| 模块 | 语言 | 端口 | 职责 |
|
| 模块 | 语言 | 端口 | 职责 |
|
||||||
|------|------|------|------|
|
|------|------|------|------|
|
||||||
| core | C++20 | 5200 | 进程托管服务 PMC / Nidus,读 `init.txt` 拉起守护子进程,提供 HTTP 管理接口(`--send/--exec/--list/--kill/--serve`) |
|
| core | C++20 | 5200 / 8010 | 进程托管服务 PMC / Nidus,读 `services.yaml` 拉起守护子进程,提供 HTTP 管理接口(`--send/--exec/--list/--kill/--serve`),内嵌 confs 配置服务(`--confs 8010`) |
|
||||||
|
|
||||||
## 二、入口与网关层
|
## 二、入口与网关层
|
||||||
|
|
||||||
| 模块 | 语言 | 端口 | 职责 |
|
| 模块 | 语言 | 端口 | 职责 |
|
||||||
|------|------|------|------|
|
|------|------|------|------|
|
||||||
| redirect80 | Python | 80 | HTTP→HTTPS 重定向(GET/HEAD 301,其余 308 保留 body);纯标准库 `http.server` |
|
| redirect80 | Python | 80 | HTTP→HTTPS 重定向(GET/HEAD 301,其余 308 保留 body);纯标准库 `http.server` |
|
||||||
| waf | Go | 443 | 唯一对外入口,终止 TLS + coraza 规则匹配(SecLang)+ 反代到 gateway;`kill -HUP` 热加载;规则库 `waf/rules/` |
|
| waf | Go | 443 | 唯一对外入口,终止 TLS + coraza 规则匹配(SecLang)+ 反代到 ca;`kill -HUP` 热加载;规则库 `waf/rules/` |
|
||||||
| gateway | C++20 | 8443 | 应用层网关(内部 HTTP),注册/登录鉴权、PBKDF2 密码哈希、RSA Token 签发校验、Cookie 认证、速率限制、反向代理(`Proxy.opened` 白名单) |
|
| ca | C++20 | 8443 | 中央认证服务(内部 HTTP),注册/登录鉴权、PBKDF2 密码哈希、RSA Token 签发校验、Cookie 认证、速率限制、身份头注入后前置转发到 gateway |
|
||||||
|
| gateway | C++20 | 8445 | 应用层网关(仅 loopback 纯转发,v0.9.0 起认证迁至 ca),反向代理(`Proxy.opened` 白名单),不验签 |
|
||||||
|
|
||||||
## 三、业务服务(对外,经 gateway 代理)
|
## 三、业务服务(对外,经 gateway 代理)
|
||||||
|
|
||||||
| 模块 | 语言 | 端口 | 职责 |
|
| 模块 | 语言 | 端口 | 职责 |
|
||||||
|------|------|------|------|
|
|------|------|------|------|
|
||||||
| fsys | Python/Flask | 9200 | 前端托管(社区首页/静态页面/媒体流/文件浏览);**原为 static,2026-08 重命名为 fsys**(core/init.txt 已同步),过渡期仍保留 legacy `static/` 目录存放 `fsys.py` |
|
| fsys | C++20 | 9200 | 前端托管(社区首页/静态页面/媒体流/文件浏览);Python/Flask `static` 的 C++ 重写(legacy `static/` 目录保留),代理 dnfs2 笔记请求 |
|
||||||
| dnfs | Python/Flask | 8006 | 树状菜单(Dendrachy Network File-System),基于 pid 的节点树 CRUD,新增节点前调 ai_review 审核 |
|
| dnfs | Python/Flask | 8006 | 树状菜单(Dendrachy Network File-System),基于 pid 的节点树 CRUD,新增节点前调 ai_review 审核(遗留,已由 dnfs2 平替) |
|
||||||
| dnfs2 | C++20 | 8006 | dnfs 的 C++20 重实现(libhttp + libmsg),接口兼容可平替,修复 P0/P1(fail-closed 验签/所有权校验/脱敏) |
|
| dnfs2 | C++20 | 8006 | dnfs 的 C++20 重实现(libhttp + libmsg),接口兼容可平替,修复 P0/P1(fail-closed 验签/所有权校验/脱敏);支持 js/file/style/theme 特殊节点 |
|
||||||
| ai_review | Python/Flask | 8007 | AI 内容审核,DeepSeek + ChromaDB RAG(色情/违禁药/赌博/诈骗/仇恨暴力),fail-closed 宁可误拦 |
|
| ai_review | Python/Flask | 8007 | AI 内容审核,DeepSeek + ChromaDB RAG(色情/违禁药/赌博/诈骗/仇恨暴力),fail-closed 宁可误拦 |
|
||||||
|
|
||||||
## 四、基础设施 / 支撑服务(仅内部调用)
|
## 四、基础设施 / 支撑服务(仅内部调用)
|
||||||
|
|
||||||
| 模块 | 语言 | 端口 | 职责 |
|
| 模块 | 语言 | 端口 | 职责 |
|
||||||
|------|------|------|------|
|
|------|------|------|------|
|
||||||
| db | Python/pymsg | 8005 | 通用数据库服务,SQL-over-TCP(SQLAlchemy Core 参数化防注入),内置集中式日志(Logs 表 + 自动清理) |
|
| db | Python/pymsg | 8005 | 通用数据库服务,SQL-over-TCP(SQLAlchemy Core 参数化防注入),内置集中式日志(Logs 表 + 自动清理)(遗留,已由 db2 平替) |
|
||||||
| db2 | C++20 | 8005 | db 的 C++20 重实现(libmsg + boost::json + libsqlite3),`execute` 路由/where 语法/响应格式对齐,可平替 |
|
| db2 | C++20 | 8005 | db 的 C++20 重实现(libmsg + boost::json + libsqlite3),`execute` 路由/where 语法/响应格式对齐,可平替 |
|
||||||
| confs | Python/pymsg | 8010 | 统一配置分发,集中存放各服务配置(`confs/configs/`),内存缓存 + mtime 自动重载,路径遍历防护 |
|
| confs | Python/pymsg | 8010 | 统一配置分发(遗留,已内嵌进 core 的 ConfsTask);`confs/configs/` 现仅剩 `gateway.ini` 仍由 confs 分发 |
|
||||||
| smtp | Python/pymsg | 8008 | 邮件服务,注册邮箱验证码后端(路由 send_email/verify_email/health),6 位码内存存储、冷却/限流/熔断 |
|
| smtp | Python/pymsg | 8008 | 邮件服务,注册邮箱验证码后端(路由 send_email/verify_email/health),6 位码内存存储、冷却/限流/熔断(smtp3 C++ 重写待上线) |
|
||||||
| captcha | Python/pymsg | 8009 | 验证码服务,图形验证码(一次性、5 分钟过期),经 gateway `GET /captcha/image` 代理给浏览器 |
|
| captcha | Python/pymsg | 8009 | 验证码服务,图形验证码(一次性、5 分钟过期),经 ca `GET /captcha/image` 代理给浏览器(遗留,已由 captcha2 平替) |
|
||||||
|
| captcha2 | C++20 | 8009 | captcha 的 C++20 重实现(pymsg),路由 image/verify/health 对齐 |
|
||||||
|
|
||||||
## 五、AI 智能体与前端
|
## 五、AI 智能体与前端
|
||||||
|
|
||||||
@@ -78,12 +80,12 @@
|
|||||||
- `_inst.sh`:一键按依赖顺序构建安装(库先行,core 最后)
|
- `_inst.sh`:一键按依赖顺序构建安装(库先行,core 最后)
|
||||||
- `_setup.deb.sh` / `_setup.rhel.sh`:系统依赖安装(Debian/Ubuntu、RHEL 系)
|
- `_setup.deb.sh` / `_setup.rhel.sh`:系统依赖安装(Debian/Ubuntu、RHEL 系)
|
||||||
- `docker.sh` / `docker-compose.yml`:容器化部署
|
- `docker.sh` / `docker-compose.yml`:容器化部署
|
||||||
- 部署路径约定 `/opt/micro_servers/`,`core` 的 `init.txt` 即从该路径拉起其余服务
|
- 部署路径约定 `/opt/micro_servers/`,`core` 的 `services.yaml` 即从该路径拉起其余服务
|
||||||
|
|
||||||
## 关键链路速记
|
## 关键链路速记
|
||||||
|
|
||||||
- **请求主链路**:client → `redirect80`(:80→443) → `waf`(:443 TLS + WAF) → `gateway`(:8443 鉴权) → `fsys`(:9200) / `dnfs`(:8006)
|
- **请求主链路**:client → `redirect80`(:80→443) → `waf`(:443 TLS + WAF) → `ca`(:8443 认证+前置转发) → `gateway`(:8445 纯转发) → `fsys`(:9200) / `dnfs2`(:8006)
|
||||||
- **日志链路**:各服务 `log_client.py`(异步批量)→ `db:8005` Logs 表(fail-safe,db 不可用时静默丢弃)
|
- **日志链路**:各服务 `log_client.py`(异步批量)→ `db2:8005` Logs 表(fail-safe,db2 不可用时静默丢弃)
|
||||||
- **配置链路**:业务服务 → `confs:8010`(内存缓存 + mtime 重载,confs 不可用时回退本地配置)
|
- **配置链路**:`gateway` → `core` 内嵌 confs:8010(内存缓存 + mtime 重载,仅 gateway.ini);其余服务配置纯 CLI 传递
|
||||||
- **数据/审核/邮件**:`dnfs` → `db:8005`(pymsg 持久化);`dnfs` → `ai_review:8007`(审核);注册邮件 `gateway` → `smtp:8008`
|
- **数据/审核/邮件**:`dnfs2` → `db2:8005`(pymsg 持久化);`dnfs2` → `ai_review:8007`(审核);注册邮件 `ca` → `smtp:8008`;登录验证码 `ca` → `captcha2:8009`
|
||||||
- **端口一览**:80 redirect80 · 443 waf · 8443 gateway · 5200 core · 9200 fsys · 8006 dnfs/dnfs2 · 8005 db/db2 · 8007 ai_review · 8009 captcha · 8008 smtp · 8010 confs · 8765 aibox
|
- **端口一览**:80 redirect80 · 443 waf · 8443 ca · 8445 gateway · 5200/8010 core · 9200 fsys · 8006 dnfs2 · 8005 db2 · 8007 ai_review · 8009 captcha2 · 8008 smtp · 8765 aibox
|
||||||
+19
-32
@@ -10,7 +10,10 @@ Python/Flask `static` 模块的生产级 C++ 重写,前端零改动兼容(
|
|||||||
waf :443 (TLS 终止 + 安全规则)
|
waf :443 (TLS 终止 + 安全规则)
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
gateway :8443 (反向代理 + 认证)
|
ca :8443 (认证 + 身份头注入 + 前置转发)
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
gateway :8445 (纯转发反向代理, 仅 loopback)
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
fsys :9200 (libhttp 异步多线程 + CORS)
|
fsys :9200 (libhttp 异步多线程 + CORS)
|
||||||
@@ -18,7 +21,7 @@ fsys :9200 (libhttp 异步多线程 + CORS)
|
|||||||
├── public/ 静态文件根目录
|
├── public/ 静态文件根目录
|
||||||
├── dnfs2 :8006 笔记代理(反向代理)
|
├── dnfs2 :8006 笔记代理(反向代理)
|
||||||
├── db2 :8005 用户查询 + 日志写入
|
├── db2 :8005 用户查询 + 日志写入
|
||||||
└── confs :8010 配置拉取
|
└── (配置纯 CLI 传递,不依赖 confs)
|
||||||
```
|
```
|
||||||
|
|
||||||
## 路由
|
## 路由
|
||||||
@@ -54,36 +57,20 @@ fsys :9200 (libhttp 异步多线程 + CORS)
|
|||||||
|
|
||||||
## 配置
|
## 配置
|
||||||
|
|
||||||
与 `static` 模块完全兼容,使用相同的 `static.ini`(由 confs 服务分发)。
|
纯 CLI + 环境变量 + 默认值(CLI > 环境变量 > 默认值),不依赖 confs;原 `static.ini` 各值已迁入 `core/services.yaml` 的 fsys 条目 args。
|
||||||
|
|
||||||
| Section | Key | 说明 |
|
| 配置项 | CLI 参数 | 环境变量 | 默认值 |
|
||||||
|---------|-----|------|
|
|---------|---------|----------|--------|
|
||||||
| `[server]` | `host` | 监听地址(默认 127.0.0.1) |
|
| 监听地址 | `--addr` / `-a` | `LISTEN_ADDR` | 127.0.0.1 |
|
||||||
| `[server]` | `port` | 监听端口(默认 9200) |
|
| 监听端口 | `--port` / `-p` | `LISTEN_PORT` | 9200 |
|
||||||
| `[directory]` | `root` | 静态文件根目录(相对路径基于工作目录,_run.sh 以模块目录启动) |
|
| 工作线程数 | `--threads` / `-t` | — | 4 |
|
||||||
| `[ssl]` | `enabled` | TLS 开关(默认 false) |
|
| 静态根目录 | `--root` | `STATIC_ROOT` | ./public |
|
||||||
| `[ssl]` | `cert_file` | 证书路径 |
|
| TLS 开关 | `--ssl-enabled` | — | false |
|
||||||
| `[ssl]` | `key_file` | 私钥路径 |
|
| 证书 / 私钥 | `--cert-file` / `--key-file` | — | cert.pem / key.pem |
|
||||||
| `[cors]` | `allowed_origins` | CORS 白名单,逗号分隔 |
|
| CORS 白名单 | `--cors-origins` | — | 逗号分隔,必需 |
|
||||||
|
| db2 地址 | `--db-host` / `--db-port` | `DB_HOST` / `DB_PORT` | 127.0.0.1:8005 |
|
||||||
### 环境变量
|
| dnfs2 上游 | `--dnfs-url` | `DNFS_URL` | http://127.0.0.1:8006 |
|
||||||
|
| 实例名 / 日志级别 | `--instance` / `--log-level` | — | fsys / info |
|
||||||
| 变量 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| `LISTEN_ADDR` | 覆盖监听地址 |
|
|
||||||
| `LISTEN_PORT` | 覆盖监听端口 |
|
|
||||||
| `STATIC_ROOT` | 覆盖静态文件根目录 |
|
|
||||||
| `DB_HOST` / `DB_PORT` | 覆盖 db 服务地址 |
|
|
||||||
| `DNFS_URL` | 覆盖 dnfs2 上游地址 |
|
|
||||||
| `CONFS_HOST` / `CONFS_PORT` | 覆盖 confs 引导地址 |
|
|
||||||
|
|
||||||
### 命令行参数
|
|
||||||
|
|
||||||
| 参数 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| `--addr` / `-a` | 监听地址 |
|
|
||||||
| `--port` / `-p` | 监听端口 |
|
|
||||||
| `--threads` / `-t` | 工作线程数 |
|
|
||||||
|
|
||||||
## 相比 Python static 的改进
|
## 相比 Python static 的改进
|
||||||
|
|
||||||
@@ -95,7 +82,7 @@ fsys :9200 (libhttp 异步多线程 + CORS)
|
|||||||
| 消除 Python 依赖 | 不再需要 venv/pip/Flask/waitress |
|
| 消除 Python 依赖 | 不再需要 venv/pip/Flask/waitress |
|
||||||
| 命令行参数 | 支持 `--addr/-a --port/-p --threads/-t` |
|
| 命令行参数 | 支持 `--addr/-a --port/-p --threads/-t` |
|
||||||
| 数值范围校验 | 所有端口/线程数有严格边界检查 |
|
| 数值范围校验 | 所有端口/线程数有严格边界检查 |
|
||||||
| 统一日志配置 | 复用主配置 confs 拉取的 db host/port |
|
| 统一日志配置 | 复用主配置(CLI/环境变量)的 db host/port |
|
||||||
|
|
||||||
## 运行
|
## 运行
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user