Files
server-ops/栖云数字城堡_全景架构手册.md

347 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 栖云数字城堡 · 全景架构手册
> 冯先生个人数字基建,始于 2026 年 6 月 7 日
> 最后更新2026-06-24
---
## 一、整体拓扑
```
┌─────────────────────────────────────┐
│ 东京 VPS43.163.225.30
│ Caddy 网关 → 各项服务 + 统一认证 │
│ 主力运行新闻管线、Gitea、Memos、 │
│ 播客、阅读、日记、todo、代理 │
└──────────────┬──────────────────────┘
┌──────────────┴──────────────────────┐
│ 北京 VPS81.70.93.78
│ 知识库Meilisearch + AI 问答 │
│ 每天凌晨 3 点从东京备份 │
└─────────────────────────────────────┘
```
---
## 二、域名与服务清单
所有服务统一域名 `*.xybkwd.top`,经 Caddy 反向代理 + 统一认证auth.xybkwd.top
### 2.1 核心服务
| 域名 | 服务 | 端口 | 需要认证 |
|:---|:---|:---:|:---:|
| nav.xybkwd.top | 导航页 + 知识库搜索/问答 | 静态文件 | ✅ |
| auth.xybkwd.top | 统一登录认证 | 9002 | — |
| chat.xybkwd.top | 旧 AI 对话(已弃用) | 8900 | — |
| gitea.xybkwd.top | Git 代码仓库 | 3000 | ✅ |
| dashboard.xybkwd.top | 控制面板 | 9000 | ✅ |
| memo.xybkwd.top | 备忘录 / 随手记 | 5230 | — |
| search.xybkwd.top | 搜索(原 Meilisearch 直连现指向8100 | 8100 | ✅ |
### 2.2 内容与阅读
| 域名 | 服务 | 端口 |
|:---|:---|:---:|
| brief.xybkwd.top | 每日简报 | 静态文件 |
| books.xybkwd.top | 在线阅读 | 8083 |
| podcast.xybkwd.top | 播客服务器 | 13378 |
### 2.3 同步与存储
| 域名 | 服务 | 端口 |
|:---|:---|:---:|
| dav.xybkwd.top | WebDAV 日记同步 | 8766 |
| vault.xybkwd.top | 密码管理 | 8088 |
### 2.4 代理与工具
| 域名 | 服务 |
|:---|:---|
| ss.xybkwd.top | Shadowsocks 代理订阅 |
| www.xybkwd.top | 主站 | 8090 |
---
## 三、Gitea 仓库清单
全部在 **fxy** 用户下,共 **17 个仓库**
### 核心系统
| 仓库名 | 说明 |
|:---|:---|
| `server-ops` | 服务器运维脚本、配置归档、daily 日志 |
| `nav-page` | 导航页前端代码 |
| `dashboard` | 控制面板 |
| `qiyun-portal` | 栖云个人门户 |
| `todo-system` | 待办系统 |
| `daily-brief` | 新闻采集管线(国内+国际+政策+研报) |
### 知识与笔记
| 仓库名 | 说明 |
|:---|:---|
| `inspiration-collector` | 灵感收集器AI 日报/周报/随手记) |
| `weread-notes` | 微信读书笔记 + 每日阅读日报 |
| `obsidian-vault` | Obsidian 笔记库 |
| `ebook-library` | 电子书库 |
| `work-docs` | **工作文档归档**2026-06-24 新增) |
| `qa-archive` | **知识库问答记录归档**2026-06-24 新增,自动同步) |
### 投研与交易
| 仓库名 | 说明 |
|:---|:---|
| `freqtrade-strategies` | 交易策略代码 |
| `beast-trader-strategies` | Beast Trader 策略 |
| `boox-notes` | BOOX 阅读笔记 |
### 其他
| 仓库名 | 说明 |
|:---|:---|
| `culture-sports` | 文体部 |
| `boox-notes` | BOOX 同步笔记 |
---
## 四、数据流
### 4.1 知识库备份(东京 → 北京)
```
东京 server
├── repos/灵感收集器、weread-notes、server-ops、daily-brief、nav-page、dashboard、work-docs
├── configs/Caddy 配置、脚本)
├── gitea_data/(数据库 + 仓库元数据)
└── crontab/
↓ 每天凌晨 3:00 rsync
北京 /home/ubuntu/backups/tokyo/
├── repos/ ← 最新的裸仓库(供 indexer 索引)
├── repos_working/ ← 每日工作副本
├── gitea_data/ ← 7 轮滚动备份
├── configs/
└── logs/ ← 30 天日志
```
### 4.2 知识库索引(北京)
```
北京 /home/ubuntu/backups/tokyo/repos/
├── inspiration-collector/ai-insights/daily/ → 灵感文章/灵感日报
├── weread-notes/notes/ → 阅读卡片
├── weread-notes/daily/ → 阅读日报
└── work-docs/ → 工作文档
↓ 每天凌晨 4:10 cronindexer.py
Meilisearchlocalhost:7700 → 全文搜索引擎
```
### 4.3 问答归档(北京 → 东京 Gitea
```
你提问 → kb_server.py北京:8100
↓ 实时
.md 文件写入 /home/ubuntu/kb/qa-archive/YYYY-MM/
↓ 每 30 分钟
Tokyo rsync 拉取 → git commit → git push
Gitea: fxy/qa-archive
```
### 4.4 日报/新闻管线(东京)
```
每小时 fetch_tencent_news.py → 腾讯新闻
每日 fetch_domestic_politics.py → 国内时政
每日 fetch_policy.py → 政策文件
每日 fetch_news.py → 国际新闻
每日 fetch_market.py → 行情数据
每日 fetch_research.py → 研报摘要
汇总 → cn_merge.py → 精选 80 条
每天 22:40 archive_daily_brief.py → Gitea daily-brief 仓库
每天 23:00 fetch_market_daily.py → 指数/汇率/数字货币/宏观
```
---
## 五、服务器清单
### 5.1 东京服务器
| 项目 | 信息 |
|:---|:---|
| IP | 43.163.225.30 |
| 用户 | ubuntu |
| SSH 密钥 | `C:\Users\32779\Desktop\保险箱\ssh_new.pem` |
| 角色 | 主力服务 + Gitea + Caddy 网关 |
| 服务 | Caddy、Gitea、Memos、freqtrade、audiobookshelf、WebDAV、SS 代理等 |
### 5.2 北京服务器
| 项目 | 信息 |
|:---|:---|
| IP | 81.70.93.78 |
| 用户 | ubuntu |
| SSH 密钥 | `C:\Users\32779\Desktop\保险箱\BJ.pem` |
| 角色 | 知识库Meilisearch + AI 问答)+ 备份 |
| 服务 | Meilisearch7700、QA API8100、rsync 备份 |
| SSH 到东京密钥 | `~/.ssh/tokyo_key.pem` |
### 5.3 安全规则
- **绝对不碰防火墙/安全组**。UFW 经验:启用后导致全部页面崩溃,直接禁用。
- 端口开放统一由云控制台安全组管理,需要开放端口时由冯先生自行操作。
- 腾讯云(北京)安全组允许东京 IP 访问 7700Meilisearch和 8100QA API
---
## 六、本机环境Windows
### 6.1 Python
| 项目 | 路径 |
|:---|:---|
| 解释器 | `C:\Users\32779\.workbuddy\binaries\python\envs\default\Scripts\python.exe` |
| Git Bash | `/c/Users/32779/.workbuddy/binaries/python/envs/default/Scripts/python.exe` |
| 已装包 | mootdx, requests, pandas, stockstats, python-docx, PyMuPDF |
| 编码 | 中文输出需 `PYTHONIOENCODING=utf-8` |
### 6.2 Ollama 本地模型
| 项目 | 值 |
|:---|:---|
| 程序路径 | C 盘Windows 安装默认,不可选) |
| 模型数据 | `D:\ollama\model_data\` |
| 环境变量 | OLLAMA_MODELS=`D:\ollama\model_data\models` |
| | OLLAMA_HOST=`0.0.0.0:11434` |
| | OLLAMA_IGPU_ENABLE=`1`Intel Arc 加速) |
| | OLLAMA_CONTEXT_LENGTH=`65536` |
| 已安装 | `qwen3.5:9b`6.3GBIQ4_NL 量化,来自 modelscope.cn |
| 运行 | `ollama run qwen3.5:9b` |
### 6.3 A 股数据工具栈
| 数据 | 接口 | 方式 |
|:---|:---|:---|
| K线/财务 | mootdx TCP 7709 | 不封IP首选 |
| 龙虎榜/解禁/融资融券/大宗 | datacenter-web.eastmoney.com | 可直连 |
| 东财其他API | push2.eastmoney.com | ❌ TLS握手失败走WebFetch |
| 实时行情/PE/PB | qt.gtimg.cn腾讯 | 待验证 |
### 6.4 doc2md 文档转换工具
| 项目 | 信息 |
|:---|:---|
| 位置 | `C:\Users\32779\WorkBuddy\Claw\doc2md.py` |
| GUI | `C:\Users\32779\WorkBuddy\Claw\doc2md_gui.py` |
| 启动 | 双击 `Claw\启动转换工具.bat` |
| 输入目录 | `Claw\input\` |
| 输出目录 | `Claw\output\` |
| 功能 | Word标题+表格)→ MDPDF字号识别+表格提取)→ MD |
---
## 七、知识库 RAG 问答
### 7.1 架构
```
浏览器 nav.xybkwd.top/search.html
├─ 搜索 → /search-api/* → Caddy东京→ Beijing:7700Meilisearch
└─ 问答 → /api/ask → Caddy东京→ Beijing:8100kb_server.py
├─ Meilisearch 检索 top 8 × 3 轮搜索
└─ DeepSeek API → 基于资料生成回答
```
### 7.2 检索优化
| 优化项 | 之前 | 现在 |
|:---|:---:|:---:|
| 单次检索文档数 | 3 篇 | 12 篇3 搜索词 × 6 篇,去重) |
| 搜索策略 | 单关键词 | 多轮检索AI 自动拆成 3 个角度 |
| 每篇截取 | 2000 字 | 4000 字 |
| 提示词 | 简单指令 | 要求交叉验证多条资料 |
| 输出上限 | 2000 tokens | 4000 tokens |
### 7.3 成本
- 单次问答约 ¥0.02(一次 DeepSeek 生成搜索词 + 一次生成回答)
- 知识库增大不影响单次成本(始终只取 top 12
### 7.4 前端功能
- 搜索/问答双标签切换
- Markdown 渲染marked.js CDN
- 保存按钮 → 下载 .md 文件到本地
- 自动归档 → 同步到 Gitea `fxy/qa-archive`
---
## 八、踩坑汇总(血的教训)
### 🔥 最高优先级
1. **不碰防火墙安全组** — UFW 启用后全部服务崩溃,彻底禁用
2. **Caddy `handle_path` 会剥离路径前缀** — 代理 API 要用 `@matcher` + `handle @matcher`,不能用 `handle_path`
3. **Caddy 规则顺序敏感**`/api/ask` 必须在 `@api`(匹配 `/api/*`)之前,否则被拦截
4. **服务器端口必须监听 `0.0.0.0`**`127.0.0.1` 只能本机访问,跨服务器必须 `0.0.0.0`
### ⚠️ 重要
5. **`rsync --delete` 会删 .git 目录** — 同步非 Git 目录到 Git 仓库时不能用 `--delete`
6. **Ollama pull 受系统代理干扰** — Clash127.0.0.1:7890会阻断 Ollama CLI 的模型下载,需 `HTTP_PROXY=""` 清空
7. **Ollama `OLLAMA_MODELS` 路径格式** — Windows 必须用反斜杠 `D:\ollama\...`Git Bash 的 `/d/` 前缀不生效
8. **模型默认上下文仅 4096** — 长文本会被无声截断,必须设 `OLLAMA_CONTEXT_LENGTH=65536`
9. **服务端中文 URL 编码** — Python `http.server` 对 URL 中的中文编码处理脆弱,需 `urllib.parse` 手动解析
### 📝 常规注意事项
10. **Gitea API 不能自删用户** — 管理员用户也不能通过 API 删除自己
11. **Git 不跟踪空目录** — 需要 `.gitkeep` 占位文件
12. **Windows 下 Python 路径问题** — Git Bash 要用绝对路径调用 Python且中文输出要设编码
13. **助理模式可能覆盖已有功能** — 修改 search.html 后,助理模式再次运行时可能覆盖 Q&A 代码
---
## 九、构建时间线
```
2026-06-07 WorkBuddy 首次下载
2026-06-08 ~ 初步搭建导航页 + Memos
2026-06-09 ~ Gitea 搭建 + 仓库迁移
2026-06-10 ~ Caddy 网关 + 统一认证
2026-06-11 ~ 待办系统 + 新闻管线初建
2026-06-12 ~ 微信公众号同步
2026-06-13 ~ Shadowsocks 代理
2026-06-14 ~ 播客服务器 + OpenBSD 防火墙踩坑
2026-06-15 ~ 北京服务器加入,两地备份
2026-06-16 ~ 日记 WebDAV 同步
2026-06-17 ~ 新闻管线完善 + 灵感收集器
2026-06-18 ~ 培训周报自动化
2026-06-19 ~ 北京服务器加固
2026-06-20 ~ A 股数据工具栈 + 交易策略回测
2026-06-21 ~ 90 后培训班文档分析
2026-06-22 ~ Ollama 本地模型部署
2026-06-23 ~ 知识库索引Meilisearch+ 文档转换工具
2026-06-24 ~ 知识库 AI 问答 + 问答归档 + 工作文档仓库
```
---
## 十、交接备忘
如果某天需要重装或迁移,关键步骤顺序:
1. **东京服务器** → 部署 Caddy、GiteaDocker、Memos、各脚本
2. **域名 DNS** → 指向东京 IP
3. **北京服务器** → 部署 Meilisearch、kb_server.py、备份脚本
4. **安全组** → 北京开放 7700、8100 给东京 IP
5. **本机** → 装 Python 环境、Ollama、Claw 工具
6. **SSH 密钥** → 东京→北京互信(保险箱文件夹有备份)
---
*文档生成于 2026-06-24共 17 个 Gitea 仓库、2 台服务器、10+ 运行服务。*