- TIMELINE: v11.0 有声书服务上线 + 音频归档体系 - CHANGELOG: v1.3.0 Audiobookshelf 部署 + 踩坑记录 - DECISION_LOG: O-2026-06-20 x3 (归档分层/章节排序/部门拆分) - README: 新增 ebook-library + Audiobookshelf 条目 - 服务清单: 新增 podcast.xybkwd.top + 音频归档
244 lines
10 KiB
Markdown
244 lines
10 KiB
Markdown
# 服务器服务部署时间线
|
||
|
||
记录东京服务器(43.163.225.30)上每个服务的诞生背景和部署时间。
|
||
|
||
---
|
||
|
||
## 2026 年之前
|
||
|
||
### 🔴 Beast Trader 策略运行(起点)
|
||
|
||
- **背景**:你已经在服务器上运行 Freqtrade 策略,但无法实时监控运行状态
|
||
- **痛点**:策略有没有在跑、最近有没有成交、收益如何——这些信息需要一个面板来展示
|
||
- **这是一切的起点**
|
||
|
||
---
|
||
|
||
## 2026 年上半年
|
||
|
||
### 🟡 v1.0 — Beast Dashboard(监控面板)
|
||
|
||
- **部署时间**:约 2026 年初
|
||
- **背景**:策略运行在 freqtrade 上,需要一个 Web 面板实时监控
|
||
- **技术选型**:FastAPI 后端(端口 9000)+ 纯 HTML 前端,Caddy 反代 `dashboard.xybkwd.top`
|
||
- **核心功能**:实时展示策略状态、持仓、最近交易记录
|
||
- **意义**:服务器上第一个自建 Web 服务,打开了后续所有服务的大门
|
||
|
||
---
|
||
|
||
### 🟢 v2.0 — Telegram Bot 通知
|
||
|
||
- **部署时间**:Dashboard 之后不久
|
||
- **背景**:Dashboard 需要人主动去看,策略有信号时需要主动推送
|
||
- **技术选型**:Freqtrade 原生 Telegram 集成 + 自建 `@jason5612_bot`
|
||
- **核心功能**:策略信号推送、交易通知、每日日报推送到微信(通过 Server酱)
|
||
- **意义**:从"人查面板"升级到"机器主动通知"
|
||
|
||
---
|
||
|
||
### 🟢 v3.0 — Caddy 反向代理
|
||
|
||
- **部署时间**:服务数量达到 3 个左右时
|
||
- **背景**:每个服务都跑在不同端口,直接 IP:端口 访问体验差,且没有 HTTPS
|
||
- **技术选型**:Caddy(自动 Let's Encrypt 证书)+ 域名(`xybkwd.top` 系列)
|
||
- **核心功能**:统一入口、HTTPS、basic_auth 保护
|
||
- **意义**:从此访问服务变成正常的域名访问,安全性也解决了
|
||
|
||
---
|
||
|
||
### 🔵 v4.0 — Gitea(私有 Git 服务)
|
||
|
||
- **部署时间**:约 2026 年中
|
||
- **背景**:策略代码、面板代码都在服务器上手工改,没有版本控制,一旦改坏无法回滚
|
||
- **技术选型**:Gitea(轻量级自托管 Git)+ `gitea.xybkwd.top`
|
||
- **核心功能**:代码版本管理、跨设备同步、作为知识库中枢
|
||
- **意义**:从此所有代码改动都有历史记录,服务器上的"作坊"升级成"有规范的工程"
|
||
|
||
---
|
||
|
||
### 🟣 v5.0 — 灵感收集器(Memos → AI → Gitea)
|
||
|
||
- **部署时间**:约 2026 年 5 月
|
||
- **背景**:你有很多碎片想法(微信、备忘录),但散落各处,无法沉淀
|
||
- **技术选型**:Memos(碎片记录)+ Daily Digest 脚本(DeepSeek API 分析)+ Gitea 存储
|
||
- **核心功能**:碎片灵感 → AI 深度分析 → Markdown 归档 → Gitea
|
||
- **cron**:每日 22:00 北京时间自动运行
|
||
- **意义**:第一次把"AI 分析"引入工作流,不只是执行策略,还帮你思考
|
||
|
||
---
|
||
|
||
### 🟠 v6.0 — 栖云导航页(nav.xybkwd.top)
|
||
|
||
- **部署时间**:约 2026 年 5-6 月
|
||
- **背景**:服务越来越多,需要一个统一入口
|
||
- **技术选型**:纯静态 HTML(`/var/www/nav/index.html`)+ Caddy 静态托管
|
||
- **核心功能**:所有服务的导航、快速跳转
|
||
- **意义**:"栖云"这个名字就是这时候定的,个人数据中心的雏形出现了
|
||
|
||
---
|
||
|
||
### 🔴 v7.0 — 每日要闻(brief.xybkwd.top)
|
||
|
||
- **部署时间**:约 2026 年 6 月初
|
||
- **背景**:每天想快速了解重要新闻,但不想被信息流淹没
|
||
- **技术选型**:RSS 抓取(7 个源)→ DeepSeek 总结 → `brief.html` 两栏展示
|
||
- **核心功能**:AI 精选摘要、分类展示、移动端适配
|
||
- **cron**:每 3 小时抓取一次,30 分钟后 AI 总结
|
||
- **意义**:第一次把"新闻聚合 + AI 总结"做成自动化流水线
|
||
|
||
---
|
||
|
||
### 🔵 v8.0 — Todo 系统(todos.html + todo_server.py)
|
||
|
||
- **部署时间**:约 2026 年 6 月
|
||
- **背景**:灵感收集器分析了你的想法,但产生的待办事项没有地方管理
|
||
- **技术选型**:Python HTTP Server(端口 9001)+ PWA 前端(`todos.html`)
|
||
- **核心功能**:CRUD 待办、优先级、分类、从灵感自动提取 todo
|
||
- **意义**:灵感 → 待办 → 执行的闭环形成了
|
||
|
||
---
|
||
|
||
### 🟢 v9.0 — AI 对话(chat.xybkwd.top)
|
||
|
||
- **部署时间**:约 2026 年 6 月
|
||
- **背景**:想在手机上直接和 AI 对话,而不依赖 WorkBuddy 桌面端
|
||
- **技术选型**:FastAPI + SQLite(端口 8900)+ 内嵌 HTML/JS 前端
|
||
- **核心功能**:移动端 AI 对话、对话历史存储、Markdown 渲染
|
||
- **意义**:WorkBuddy 的能力延伸到了手机端
|
||
|
||
---
|
||
|
||
### 🟡 v10.0 — 系统备份自动化
|
||
|
||
- **部署时间**:约 2026 年 6 月中旬
|
||
- **背景**:服务越来越多,一旦服务器出问题,重建成本很高
|
||
- **技术选型**:`backup.sh` 脚本 + cron 每日 04:00 自动备份
|
||
- **备份内容**:系统配置、Docker 元数据、SQLite 数据库、工作目录、SSL 证书
|
||
- **意义**:从"能跑"升级到"不怕丢"
|
||
|
||
---
|
||
|
||
## 当前状态(2026-06-15)
|
||
|
||
| 服务 | 域名 | 端口 | 状态 |
|
||
|:---|:---|:---:|:---:|
|
||
| Caddy(反代) | 各域名 | 80/443 | ✅ 运行中 |
|
||
| Gitea | gitea.xybkwd.top | 3000 | ✅ 运行中 |
|
||
| Memos | memo.xybkwd.top | 5230 | ✅ 运行中 |
|
||
| Dashboard | dashboard.xybkwd.top | 9000 | ✅ dry-run 运行中 |
|
||
| AI Chat | chat.xybkwd.top | 8900 | ✅ 运行中 |
|
||
| Todo Server | nav.xybkwd.top/api | 9001 | ✅ 运行中 |
|
||
| 每日要闻 | brief.xybkwd.top | 静态 | ✅ 运行中 |
|
||
| 栖云导航 | nav.xybkwd.top | 静态 | ✅ 运行中 |
|
||
| **Audiobookshelf** | **podcast.xybkwd.top** | **13378** | **✅ 运行中** |
|
||
| 灵感收集器 | — | cron | ✅ 每日 22:00 运行 |
|
||
| 系统备份 | — | cron | ✅ 每日 04:00 运行 |
|
||
| 音频归档 | D://服务器备份//有声书// | — | ✅ 手动同步 |
|
||
|
||
---
|
||
|
||
## 演化规律
|
||
|
||
每次加新服务,都遵循同一个模式:
|
||
|
||
```
|
||
痛点出现 → 找到一个最小可用的技术方案 → 快速上线 → 用一段时间 → 发现新问题 → 迭代或加新服务
|
||
```
|
||
|
||
没有一开始就做宏大规划,都是按需生长。现在的架构是 **10 次迭代** 自然演化的结果。
|
||
|
||
---
|
||
|
||
### 2026-06-15 — Calibre-Web 电子书库上线
|
||
|
||
**背景**:冯总在文石阅读器上读书并做标注,需要一个统一管理平台,且与 AI 打通。
|
||
|
||
**部署内容**:
|
||
- Docker 部署 `linuxserver/calibre-web:latest`
|
||
- 端口:8083,Caddy 反代到 `books.xybkwd.top`
|
||
- 数据目录:`~/calibre-web/books`(图书库)、`~/calibre-web/config`(配置)
|
||
- nav 导航页新增电子书库卡片(琥珀色书籍图标)
|
||
|
||
**后续计划**:
|
||
- 上传图书文件
|
||
- 打通文石标注同步(Calibre Companion / WebDAV)
|
||
- 开发 AI 读书助手(摘要生成、笔记整理、微信读书同步)
|
||
- 建立独立 Gitea 仓库 `ebook-library` 管理书库相关代码和文档
|
||
|
||
**意义**:个人知识管理从多个碎片(Memos、要闻、Gitea)走向阅读 → 标注 → AI 分析 → 笔记归档的完整闭环。
|
||
|
||
|
||
### 2026-06-15 — Lucky 清除 & 全面安全加固
|
||
|
||
**背景**:冯总要求排查服务器安全状态,确保纯私有化部署的个人服务不对外暴露。
|
||
|
||
**排查发现**:
|
||
- Lucky 已无实质作用(进程、Docker、二进制均不存在),仅残留 配置目录(132KB)
|
||
- 所有服务的 Caddy basicauth 认证缺失(之前设置后被取消)
|
||
- ufw 残留 Lucky 端口规则(16601/tcp)和多余规则(9001/tcp)
|
||
- Shadowsocks 服务正常运行(31567/tcp,代理用途)
|
||
- fail2ban 未安装
|
||
|
||
**执行操作**:
|
||
- 彻底删除 (无 Docker 镜像/容器/卷残留)
|
||
- 恢复所有个人服务的 basicauth 保护(用户名 ,密码 )
|
||
- 加密的服务:gitea / dashboard / memo / nav / books
|
||
- 不加的服务:blog(公开)、vaultwarden(自身有登录)
|
||
- Caddyfile 备份到 server-ops 仓库
|
||
|
||
**安全铁律**:
|
||
- 严禁取消 basicauth,任何调试通过 localhost 不改 Caddyfile
|
||
|
||
---
|
||
|
||
### 2026-06-20 — Audiobookshelf 有声书服务上线 + 音频归档体系
|
||
|
||
**v11.0 — 有声书 & 播客服务**
|
||
|
||
**部署内容**:
|
||
- Docker 部署 `ghcr.io/advplyr/audiobookshelf:latest`,端口 13378
|
||
- Caddy 反代到 `podcast.xybkwd.top`
|
||
- docker-compose 管理:`/home/ubuntu/audiobookshelf/docker-compose.yml`
|
||
- 数据目录:`config/` `metadata/` `audiobooks/` `podcasts/`
|
||
- 手机端通过希声 App 同步收听
|
||
|
||
**核心工作流**:
|
||
```
|
||
B站/YouTube → yt-dlp 下载(带 upload_date) → 转 MP3
|
||
→ 按源端发布时间排序 → 加 01-N 前缀(完整保留标题)
|
||
→ 放入 audiobooks/节目名/
|
||
→ Audiobookshelf watcher 自动检测 → 希声自动同步
|
||
```
|
||
|
||
**技术突破 — 章节排序三层同步铁律**:
|
||
Audiobookshelf 章节排序依赖三层数据,只改文件名不生效:
|
||
| 层 | 位置 | 关键字段 | 规则 |
|
||
|:---|:---|:---|:---|
|
||
| ① 文件系统 | 文件名 | `01-标题.mp3` | 数字前缀确保字母序 |
|
||
| ② books 表 | `chapters` JSON | `start`(秒) | 必须连续递增 |
|
||
| ③ books 表 | `audioFiles` JSON | `index` | 必须顺序 1→2→3→... |
|
||
|
||
**滚动淘汰 + 本地归档体系**:
|
||
- 每节目服务器只保留最新 3 集(节省磁盘)
|
||
- 淘汰的旧集 → `archive_pending/` 暂存 → `sync_archive.sh` SCP 到本地
|
||
- 本地归档:`D:/服务器备份/有声书/<节目名>/`(D 盘 392G 可用)
|
||
- 服务器脚本:`/home/ubuntu/audiobookshelf/scripts/archive_old_audio.sh`
|
||
- 本地脚本:`D:/服务器备份/有声书/sync_archive.sh`
|
||
|
||
**踩坑记录**:
|
||
1. 数据库误删 — 必须问用户再动手(血的教训)
|
||
2. 章节排序 — 不是靠文件名字母序,是靠 chapters[].start 时间戳
|
||
3. SCP 中文路径 — 含空格的目录需临时路径中转
|
||
4. 容器无需频繁重启 — watcher 自动检测文件变化
|
||
5. B站无纯音频流 — 用 `-f worstvideo+worstaudio/worst` 最小化下载量
|
||
|
||
**当前有声书内容**:
|
||
| 节目 | 集数 | 来源 |
|
||
|:---|:---|:---|
|
||
| 渤海小吏·八王之乱 | 5集 | B站 |
|
||
| 纵横四海 | 3集 | B站 |
|
||
| 翟东升 | 3集 | YouTube |
|
||
| Elon Musk | 99集 | 本地导入 |
|
||
|
||
**意义**:从碎片化的通勤时间利用,升级为一套完整的"内容获取 → 整理归档 → 移动收听"流水线。个人知识输入的又一条通道。
|