Files
server-ops/CHANGELOG.md

12 KiB
Raw Permalink Blame History

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 HTTPServerbcrypt 密码验证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天过期HttpOnlySameSite=LaxDomain=.xybkwd.top
    • 密码验证不变bcrypttoken 签名防篡改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 HTTPServerbcrypt 密码验证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天过期HttpOnlySameSite=LaxDomain=.xybkwd.top
    • 密码验证不变bcrypttoken 签名防篡改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中文, Bloomberg12源/轮约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.py31品种日线OHLCVdaily-brief/market_data/
  6. RAW存档机制 — 所有新闻全量写入 daily-brief/raw/YYYY-MM-DD.ndjson逐行JSON0 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日期提取防线

问题: 新华网 RSS3路返回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.pyint(ctime)转换字符串时间戳
  • 效果:新浪-头条10条全部入选精选池中国热点恢复正常

② 新闻来源被AI改写修复

  • 问题summarize_news.py调用DeepSeek后AI把新浪-头条改写为新浪财经
  • 修复:新增build_source_lookup() + restore_source()AI输出后按标题匹配恢复原始来源名
  • 效果:中国热点中新浪头条正确显示为"新浪-头条",而非"新浪财经"

③ 微信读书阅读时长单位错误修复

  • 问题WeRead API返回的readingTime单位是秒代码当作分钟处理15分钟读书记录显示为"15小时"
  • 修复sync.pyread_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])
    • 每日摘要目录结构调整时漏了同步周报脚本