251 lines
12 KiB
Markdown
251 lines
12 KiB
Markdown
# CHANGELOG - 服务器运维日志
|
||
|
||
## v1.0.0 (2026-06-14)
|
||
|
||
### Added
|
||
- 初始化仓库:README、CHANGELOG、DECISION_LOG
|
||
- 每日运维总结机制确立
|
||
- 首份总结:2026-06-14 服务器功能变动总结
|
||
|
||
## v1.1.0 (2026-06-15)
|
||
|
||
### Added
|
||
- — Cookie session auth proxy 完整源码和 systemd 服务文件
|
||
- — Python HTTPServer,bcrypt 密码验证,HMAC-SHA256 token 签名
|
||
- — systemd 服务,port 9002,开机自启
|
||
|
||
### Changed
|
||
- **安全认证升级**:Caddy basicauth → auth_proxy Cookie session
|
||
- 所有保护服务(gitea/dashboard/books/nav/brief/todo)改为走 auth_proxy:9002
|
||
- 新增 auth.xybkwd.top 子域作为登录入口
|
||
- Session cookie: 7天过期,HttpOnly,SameSite=Lax,Domain=.xybkwd.top
|
||
- 密码验证不变(bcrypt),token 签名防篡改(HMAC-SHA256)
|
||
- — 去掉所有 basicauth,改为 reverse_proxy localhost:9002
|
||
- 服务清单更新:books (Calibre-Web) 状态同步
|
||
|
||
### Fixed
|
||
- 移动端重复登录问题:basicauth 每 ~1 小时要求重新输入密码
|
||
- Cookie 跨子域失效:缺 Domain=.xybkwd.top 导致各子域不共享 cookie
|
||
- Set-Cookie 值带多余引号:浏览器拒绝该 cookie
|
||
|
||
### Security
|
||
- 认证安全性不变:bcrypt + HMAC-SHA256,无明文密码传输
|
||
- 公开服务(blog/vaultwarden/memos)不经过 auth_proxy,不受影响
|
||
|
||
## v1.1.0 (2026-06-15)
|
||
|
||
### Added
|
||
- — Cookie session auth proxy 完整源码和 systemd 服务文件
|
||
- — Python HTTPServer,bcrypt 密码验证,HMAC-SHA256 token 签名
|
||
- — systemd 服务,port 9002,开机自启
|
||
|
||
### Changed
|
||
- **安全认证升级**:Caddy basicauth → auth_proxy Cookie session
|
||
- 所有保护服务(gitea/dashboard/books/nav/brief/todo)改为走 auth_proxy:9002
|
||
- 新增 auth.xybkwd.top 子域作为登录入口
|
||
- Session cookie: 7天过期,HttpOnly,SameSite=Lax,Domain=.xybkwd.top
|
||
- 密码验证不变(bcrypt),token 签名防篡改(HMAC-SHA256)
|
||
- — 去掉所有 basicauth,改为 reverse_proxy localhost:9002
|
||
- 服务清单更新:books (Calibre-Web) 状态同步
|
||
|
||
### Fixed
|
||
- 移动端重复登录问题:basicauth 每 ~1 小时要求重新输入密码
|
||
- Cookie 跨子域失效:缺 Domain=.xybkwd.top 导致各子域不共享 cookie
|
||
- Set-Cookie 值带多余引号:浏览器拒绝该 cookie
|
||
|
||
### Security
|
||
- 认证安全性不变:bcrypt + HMAC-SHA256,无明文密码传输
|
||
- 公开服务(blog/vaultwarden/memos)不经过 auth_proxy,不受影响
|
||
|
||
|
||
## v1.2.0 (2026-06-15) — rollback
|
||
|
||
### Removed
|
||
- **auth_proxy 对主服务的拦截**:恢复 Caddy 直接反向代理到后端
|
||
- gitea → localhost:3000, dashboard → localhost:9000, books → localhost:8083
|
||
- nav/brief → file_server(静态文件),nav/api/* → todo 9001
|
||
- auth.xybkwd.top 仍保留 auth_proxy:9002 作为登录门户(不影响其他服务)
|
||
|
||
### Added
|
||
- 认证方案待修复:Caddy v2.11 basic_auth bcrypt hash 格式需要重新调试
|
||
|
||
### Lesson Learned (Critical)
|
||
- **🔴 铁律:所有配置变更必须先 commit 到 git,再部署到生产环境**
|
||
- 本次事故的根因:直接修改 /etc/caddy/Caddyfile 后未及时 git commit,
|
||
导致回滚时需要从 git 历史中找回正确版本(commit 6c35f31)
|
||
- git 历史在此次事故中挽救了服务:回滚前险些无法恢复
|
||
## 2026-06-16
|
||
|
||
### 要闻流水线改造 v0.3
|
||
|
||
**改动:**
|
||
1. fetch 脚本时效过滤 — fetch_news.py (48h) / fetch_policy.py (72h) / fetch_research.py (72h)
|
||
2. 新增 archive_daily_brief.py — 每日要闻归档到 daily-brief 仓库(含跨日去重)
|
||
3. 新增 cn_merge.py — 合并本地国内新闻到流水线
|
||
4. 所有新闻条目增加 [MM-DD] 日期标记(支持多种时间格式解析)
|
||
5. crontab 新增:22:40 归档 / 05 3,9,15,21 cn_merge
|
||
|
||
**架构变更:**
|
||
- 新增本地抓取层:WorkBuddy 本地运行 local_fetch_cn.py,通过 SCP 推送到东京
|
||
- 数据源扩展:新华网(3路)+ 微博热搜,约 113 条/轮
|
||
- 浏览器展示和归档共享同一数据源(news_summary.json)
|
||
|
||
**涉及文件:**
|
||
- 东京 ~/scripts/: fetch_news.py, fetch_policy.py, fetch_research.py, cn_merge.py(新)
|
||
- 东京 ~/daily-brief/: archive_daily_brief.py(新), archive/2026/06/2026-06-16.md
|
||
- 本地 Claw/: local_fetch_cn.py(新), local_fetch_daemon.py(新), start_cn_fetch.bat(新)
|
||
|
||
### 要闻流水线改造 v0.4 — 扩源 + RAW分层 + 精选器
|
||
|
||
**改动:**
|
||
1. fetch_news.py v2.0 — 新增 5 个国际源(BBC, The Guardian, CNBC, FT中文, Bloomberg),12源/轮约342条
|
||
2. local_fetch_cn.py v2.0 — 清理失效源(人民网/观察者网/腾讯/澎湃),保留新华网3路+微博
|
||
3. cn_merge.py v2.0 — 分两路输出:全量→news_raw.json+RAW ndjson,精选→news.json(送AI摘要)
|
||
4. 新增 selector.py — 多策略评分精选器(来源权重+时效+多样性,16主题分类)
|
||
5. 行情数据采集 — 新增 fetch_market_daily.py,31品种日线OHLCV,daily-brief/market_data/
|
||
6. RAW存档机制 — 所有新闻全量写入 daily-brief/raw/YYYY-MM-DD.ndjson(逐行JSON,0 token)
|
||
|
||
**架构变更:**
|
||
- 抓取层从~200条/轮扩张至~500条/轮,RAW全量存档
|
||
- AI摘要层从全量处理改为精选80条,token成本不变
|
||
- 新增行情数据采集线(事件线+价格线双轨归档)
|
||
|
||
**crontab 更新:**
|
||
- 50 23 * * * — 行情日线采集(新增)
|
||
- 10 0 * * * — RAW存档推送到Gitea(新增)
|
||
- 05 3,9,15,21 — cn_merge v2(含selector精选,更新)
|
||
|
||
**涉及文件:**
|
||
- 东京 ~/scripts/: fetch_news.py, cn_merge.py (更新), selector.py (新)
|
||
- 东京 ~/daily-brief/: fetch_market_daily.py (新), raw/ (新目录)
|
||
- 本地 Claw/: local_fetch_cn.py (更新)
|
||
|
||
### Hotfix 2026-06-16 — 新华网RSS下线 + URL日期提取防线
|
||
|
||
**问题:** 新华网 RSS(3路)返回300条2022年12月旧闻,且 published 字段全为空,绕过48h时效过滤,导致浏览页面显示4年前旧闻。
|
||
|
||
**修复:**
|
||
1. 全面移除新华网 RSS — xinhuanet.com 和 news.cn 域名全线瘫痪,返回2022年旧闻
|
||
2. 清理新浪新闻 RSS — 返回2018年旧闻("光纤之父"高锟离世...),一并移除
|
||
3. 新增 URL 日期提取防线 — `parse_published_time` 增加从 link URL 提取日期(`/YYYY-MM/DD/`),作为 published 为空时的第二道防线
|
||
4. 清洗 RAW 存档 — 从 ndjson 中移除 1186 条新华网旧数据
|
||
5. 清洗 news.json — cn_merge 重新精选,确认0条旧闻
|
||
|
||
**当前中文源:** 36氪(东京RSS)+ FT中文(东京RSS)+ 微博热搜(本地页面抓取)
|
||
**国内RSS生态现状:** 全线死亡。新华网/新浪/人民/澎湃/凤凰/环球/第一财经/界面 — 均无可用RSS。
|
||
|
||
### 中文新闻源改造 v3.0 — 全面非RSS抓取(2026-06-16 17:30)
|
||
|
||
**背景:** 国内主流媒体 RSS 已全线死亡(新华网返回2022旧闻、新浪返回2018旧闻),
|
||
需改用非RSS方式获取中文新闻。
|
||
|
||
**改造内容:**
|
||
1. 本地 local_fetch_cn.py 全面重写为 v3.0
|
||
2. 移除所有 RSS 源(均失效),改为5路非RSS抓取
|
||
|
||
**新增中文源(5路):**
|
||
| 源 | 方式 | 条数/轮 |
|
||
|---|------|-------:|
|
||
| 新浪新闻API | JSON API (7频道) | 40 |
|
||
| 新华网频道页 | 静态HTML解析 | 61 |
|
||
| 人民网栏目页 | 静态HTML解析 | 31 |
|
||
| 观察者网 | 静态HTML解析 | 50 |
|
||
| 微博热搜 | API JSON | 30 |
|
||
| **合计** | | **~207** |
|
||
|
||
**技术要点:**
|
||
- 新浪API返回Unix时间戳 → 精确发布时间
|
||
- 新华网/人民网/观察者网从URL提取日期 → 48h时效过滤
|
||
- 观察到三种URL日期格式:YYYYMMDD、YYYY_MM_DD、YYYY/MMDD
|
||
- extract_date_from_url() 统一解析所有格式
|
||
|
||
**国际源(东京 fetch_news.py 12源):**
|
||
NYT, CNN, Al Jazeera, TechCrunch, BBC, The Guardian, CNBC, Bloomberg
|
||
+ 36氪, FT中文(中文)
|
||
每轮 ~300条
|
||
|
||
**中英文源合并后每轮:~500条 → RAW存档 → 精选80条**
|
||
|
||
### Hotfix Batch 2026-06-16-2 — 修复三项数据问题
|
||
|
||
#### ① 新浪头条published为空修复
|
||
- **问题**:新浪API返回的`ctime`是字符串`"1781604459"`而非数字,代码中`isinstance(ctime, (int, float))`判定False,
|
||
`published`字段全为空 → selector无时效加分 → 10条新浪头条全部落选,中国热点只有新华网
|
||
- **修复**:`local_fetch_cn.py` → `int(ctime)`转换字符串时间戳
|
||
- **效果**:新浪-头条10条全部入选精选池,中国热点恢复正常
|
||
|
||
#### ② 新闻来源被AI改写修复
|
||
- **问题**:summarize_news.py调用DeepSeek后,AI把`新浪-头条`改写为`新浪财经`
|
||
- **修复**:新增`build_source_lookup()` + `restore_source()`,AI输出后按标题匹配恢复原始来源名
|
||
- **效果**:中国热点中新浪头条正确显示为"新浪-头条",而非"新浪财经"
|
||
|
||
#### ③ 微信读书阅读时长单位错误修复
|
||
- **问题**:WeRead API返回的`readingTime`单位是秒,代码当作分钟处理,15分钟读书记录显示为"15小时"
|
||
- **修复**:`sync.py` → `read_seconds // 60`转分钟
|
||
- **效果**:GitHub入门与实践:30小时24分钟→30分钟;Python编程:471小时→7小时51分钟
|
||
|
||
#### ④ 时间显示格式修复
|
||
- **问题**:今日新闻在摘要中只显示`HH:MM`无日期前缀
|
||
- **修复**:`summarize_news.py` → 始终输出`MM-DD HH:MM`格式
|
||
- **效果**:所有条目统一显示`06-16 10:07`,跨日可辨
|
||
|
||
#### ⑤ selector权重优化
|
||
- **问题**:selector.py缺少新增非RSS源(新浪、观察者网、人民网)的权重,主题上限固定3条导致国内热点被筛
|
||
- **修复**:新增SOURCE_WEIGHTS条目(新浪-头条1.3最高),主题上限改为差异化配置,中国热点主题放宽至2x
|
||
- **效果**:中文精选从单一新华网变为新浪+新华网+观察者网混合
|
||
|
||
**涉及文件:**
|
||
- local_fetch_cn.py — ctime类型修复
|
||
- selector.py — 新源权重 + 主题差异化上限
|
||
- summarize_news.py — 来源恢复逻辑 + 时间格式修复
|
||
- sync.py — 阅读时长秒→分钟
|
||
|
||
## v1.3.0 (2026-06-20) — Audiobookshelf 有声书服务
|
||
|
||
### Added
|
||
- **Audiobookshelf** Docker 部署(ghcr.io/advplyr/audiobookshelf:latest),端口 13378
|
||
- Caddy 反代 `podcast.xybkwd.top`
|
||
- `archive_old_audio.sh` — 服务器端滚动淘汰脚本(每节目保留3集)
|
||
- `sync_archive.sh` — 本地 D 盘归档同步脚本
|
||
- `D:/服务器备份/有声书/` — 本地永久音频归档目录
|
||
- 文体部工作空间 — 播客/有声书/课程学习管理
|
||
|
||
### Changed
|
||
- 服务清单新增 Audiobookshelf (podcast.xybkwd.top)
|
||
|
||
### Lessons Learned (Critical)
|
||
- 🔴 数据库/cache 操作必须先问用户,不得擅自执行(造成 Audiobookshelf DB 误删)
|
||
- Audiobookshelf 章节排序依赖三层:文件名 + chapters[].start + audioFiles[].index
|
||
- 排序依据必须是源端 upload_date,不准凭主观判断
|
||
- 容器有 watcher 自动检测文件变化,不需要重启
|
||
- B站无纯音频流,用 `-f worstvideo+worstaudio/worst` 最小化下载量
|
||
|
||
|
||
## v1.4.0 (2026-06-17) — 个人服务三联部署
|
||
|
||
### Added
|
||
- WebDAV 服务(dav.xybkwd.top:8766)— bytemark/webdav 容器,日记同步后端
|
||
- Vaultwarden 密码管理(vault.xybkwd.top:8088)— 统一密码管理
|
||
- Halo 博客(www.xybkwd.top:8090)— 个人博客发布平台
|
||
- 个人数据中心四件套架构成型:存储/密码/阅读/发布
|
||
|
||
## v1.5.0 (2026-06-19) — Dashboard v1.4.0 + 双策略架构
|
||
|
||
### Added
|
||
- Dashboard 三 Tab 布局 + 震荡指标面板(RSI/布林带/ATR/MFI)
|
||
- 第二个 Telegram Bot(震荡策略专用)
|
||
- 双 Docker 实例 8081/8082
|
||
|
||
### Changed
|
||
- Freqtrade 从单策略升级为双策略并行(趋势 v2.2d + 震荡 v3.2)
|
||
- 移除 BTC/USDT 监控
|
||
|
||
### Lessons Learned
|
||
- Dashboard 指标必须与策略逻辑统一,从代码提取而非手工维护
|
||
- 主任不得越俎代庖写代码部署服务
|
||
|
||
### 2026-06-28
|
||
- 修复:inspiration-collector weekly_digest.py 路径 bug
|
||
- 第 82 行:os.path.join(daily_root, date_str) → os.path.join(daily_root, parts[0], parts[1], parts[2])
|
||
- 每日摘要目录结构调整时漏了同步周报脚本
|