docs: 6月25-26日知识库架构重构完整文档

This commit is contained in:
fxy
2026-06-26 14:58:33 +08:00
parent 95f853ccf8
commit 025825596a

View File

@ -0,0 +1,167 @@
# 知识库架构重构 · 2026年6月25-26日
## 背景
6月25日完成导航页崩坏修复、Authelia SSO部署、Homepage/Wiki.js初装。6月26日完成知识库全链路重构从自建前端转向成熟开源方案确立了「两层分离」的最终架构。
---
## 一、核心决策
### 1.1 放弃自建前端,拥抱成熟方案
| 之前 | 之后 | 原因 |
|------|------|------|
| 自建 search.html/reader.html | Wiki.js + ask.xybkwd.top | 自建前端频繁崩溃JS 语法错误、CDN 问题不断 |
| Meilisearch 做展示 | Meilisearch 做搜索后端 | 搜索引擎的长板是检索,短板是展示 |
| 单体前端 | 两层分离 | Gitea→Wiki.js展示层 + Meilisearch→AI检索层 |
### 1.2 两层分离架构
```
层1: 知识库展示
Gitea(fxy) + Memos(SQLite) → cron聚合 → wiki-knowledge-base → Wiki.js
↓ ↓
inspiration-collector wiki.xybkwd.top
weread-notes 454篇页面
work-docs
层2: 知识库检索
wiki-knowledge-base → Meilisearch → RAG(DeepSeek) → AI问答页
457篇索引 25篇/35000字 ask.xybkwd.top
```
**设计原则**
- Git 是唯一真相源Wiki.js 是只读展示
- Meilisearch 不与 Wiki.js 集成(版本 2.5 不支持),作为独立后端
- AI 问答页独立部署,不注入 Wiki.js DOMVue SPA 注入不稳定)
---
## 二、Wiki.js 部署细节
### 2.1 多仓库聚合
- 聚合仓库:`beast/wiki-knowledge-base`
- 同步脚本:`/home/ubuntu/wiki-knowledge-base/sync.sh`cron 每小时 15 分
- 四个来源inspiration(214) + reading(119) + work(3) + memos(117)
### 2.2 批量导入踩坑
- Wiki.js Git 存储不会把仓库已有 .md 自动展示为页面
- API Key 只有读权限,需 JWT 认证(密码临时改为 tmp123456导入后恢复
- 通过 GraphQL API 批量创建 454 个页面
### 2.3 网络配置
- Gitea`HTTP_ADDR = 0.0.0.0`(原 127.0.0.1iptables DROP 保护外网
- Wiki.jsGit 存储指向 `http://172.17.0.1:3000/beast/wiki-knowledge-base.git`
- docker-compose volume 持久化修复(原容器重启丢配置)
---
## 三、Meilisearch 迁移
### 3.1 从北京迁到东京
- 北京 Meilisearch空索引已停用
- 东京 docker-compose 新增 Meilisearch v1.13,端口 localhost:7700
- 索引脚本:`/home/ubuntu/wiki/meili_index.py`
### 3.2 中文搜索局限性
- Meilisearch v1.13 中文按单字分词,「工程物资」→ 「工/程/物/资」
- 应对策略扩大检索量25篇/35000字交给 DeepSeek 智能筛选
---
## 四、AI 问答平台
### 4.1 RAG 服务
- FastAPI 容器wiki-rag:8200docker-compose 管理
- 检索Meilisearch top 25 → 拼上下文 → DeepSeek 生成
- 对话存储:服务器 JSON 文件 `/home/ubuntu/wiki/conversations/`
### 4.2 前端
- 独立域名 `ask.xybkwd.top`,纯静态 HTML
- marked.js 渲染 MarkdownCatppuccin 暗色主题
- 对话列表、新建/切换/删除、自动保存
### 4.3 UI 注入失败教训
- 尝试 4 次在 Wiki.js 注入搜索框/AI按钮均失败
- 原因Wiki.js 是 Vue SPAinjectBody 脚本执行时机与 Vue 渲染竞争
- 结论:独立页面是最可靠的方案
---
## 五、Homepage 看板重构
### 5.1 仪表盘聚合
-DeepSeek 余额 + 北京状态,两个独立 API9099/9098
- 新:统一 API9097: dashboard_api.py三个卡片
- DeepSeek 余额 ¥73.xx
- 东京:内存 62.8% / 磁盘 55%
- 北京:状态 online / 内存 25% / 磁盘 14%
### 5.2 网络模式修复
- 原 Homepage 桥接网络,`host.docker.internal` 无法解析
- 改为 `network_mode: host`,直接访问 localhost API
### 5.3 视觉优化
- 主题zinc 暗色 + 毛玻璃卡片
- 精简:移除 WebDAV 日记、待办等纯链接项
- 图标:服务卡片全部使用 Homepage 内置图标
---
## 六、Caddy 路由变更
| 域名 | 路由 | 变更 |
|------|------|------|
| nav.xybkwd.top | `/search-api*` → localhost:7700 | 北京 Meili 改为东京本地 |
| ask.xybkwd.top | `/api/*` → localhost:8200 | 新增 AI 问答域名 |
| wiki.xybkwd.top | `handle_path /api/ask*` | 预留(未启用,留给 Auth 通过后使用) |
---
## 七、服务全景
### 东京服务器 (43.163.225.30)
| 服务 | 端口 | 域名 |
|------|------|------|
| Caddy | 80/443 | 所有域名 |
| Gitea | 3000 | gitea.xybkwd.top |
| Wiki.js | 3100 | wiki.xybkwd.top |
| Meilisearch | 7700 | nav/search-api 反代 |
| RAG API | 8200 | ask.xybkwd.top/api/* |
| Memos | 5230 | memo.xybkwd.top |
| Audiobookshelf | 13378 | podcast.xybkwd.top |
| Vaultwarden | 8088 | vault.xybkwd.top |
| WebDAV | 8766 | dav.xybkwd.top |
| Calibre-Web | 8083 | books.xybkwd.top |
| Halo | 8090 | halo.xybkwd.top |
| Freqtrade | 8080 | dashboard.xybkwd.top |
| Homepage | 3001 | nav.xybkwd.top |
| Authelia | 9091 | auth.xybkwd.top |
| Dashboard API | 9097 | nav(内部) |
### 数据管道
```
Memos SQLite → memos_export.py
Gitea repos → sync.sh (cron 15分)
wiki-knowledge-base (聚合仓库)
├── Wiki.js Git Sync (每5分) → wiki.xybkwd.top
└── meili_index.py → Meilisearch → RAG → ask.xybkwd.top
```
---
## 八、踩坑清单
1. **heredoc 转义**:反斜杠和引号在 bash heredoc 中频繁被吃掉,推荐 SCP 上传 Python 脚本
2. **Wiki.js 注入**Vue SPA 的 injectBody 与 DOM 渲染存在竞态条件,不适合做 UI 注入
3. **Caddy forward_auth**:包裹整个站点,无法在 auth 域内做路径级绕过,需用独立域名
4. **Meilisearch doc ID**:只支持 `[a-zA-Z0-9_-]`,中文路径需 hash 编码
5. **PostgreSQL json vs jsonb**Wiki.js settings 的 value 是 json 类型,不支持 jsonb_set
6. **Docker 容器访问宿主机**`host.docker.internal` 需要 extra_hosts 或 network_mode:host
7. **YAML % 引号**`suffix: %` 不加引号导致 YAML 解析失败,首页崩溃
8. **Simple Icons 不彩色**Homepage 的 si- 图标默认单色,需自定义 PNG/SVG 图标