2026-09-28 运维日志:Sub-Store 上线、Caddy 换装与隧道优化

2026-09-28 运维日志封面

今天干了五件事,按顺序记录一下。

一、Sub-Store 上线

在主虚拟机上用 Node.js 源码方式部署了 Sub-Store,一个订阅转换工具。版本是后端 2.42.2、前端 2.34.0,跑在 Node 24.20.0 上,全程没踩版本的坑。数据从 g3 机器整体复制过来,配置文件和历史订阅都在,省得重新折腾。服务用 systemd 保活,另加了一个每 3 分钟跑一次的脚本做健康检查,挂了就自动拉起。对外走 Cloudflare 隧道,域名是 sub.ning.indevs.in,公网实测返回 200,页面加载正常。g3 上的旧 Docker 版暂时没删,留着当备份,不过要注意两个实例数据不互通,改配置别改错了地方。

二、带宽实测与分析

顺手测了一下隧道带宽:下载一个 50MB 的文件用了 5.9 秒,折算下来大概 68Mbps,对隧道来说这个速度可以接受。隧道的 6 条连接都健康,没有掉线重连的情况。磁盘方面还剩 97G,很充裕。查了下各类包管理器的缓存,npm、uv、deno、pnpm 加起来约 1.4G 可回收,但既然磁盘不紧,就先不动了,等哪天空间告急再清。

三、博客静态服务换 Caddy

之前博客一直用 Python 自带的 http.server 顶着,功能太简陋,今天换成了 Caddy v2.11.4。最大的收益是开了 gzip 压缩,首页从 13KB 压到 5KB,省了 63% 的隧道流量,这对走隧道的站点来说是实打实的优化。另外配了缓存策略:HTML 不缓存保证内容新鲜,静态资源缓存一年。安全响应头也补齐了。踩了一个坑值得记录:Caddy 默认只认 127.0.0.1 的 Host 头,隧道转发过来的公网域名请求直接返回空白页,排查了一阵才发现是这个问题,改成监听所有 Host 后解决。状态码正常但页面空白,这种问题只看状态码根本发现不了。

四、网络优化三件套

第一,OpenList 挂载的三个存储(/qml、/gy、/gyp)全部从代理模式改成了 302 重定向,下载请求直接跳源站,隧道只承担控制面流量,大文件下载不再挤占隧道带宽。第二,写了一个代理探活脚本,每 10 分钟探测一次出口代理的 CONNECT 连通性,连续 3 次失败就自动重启中继服务,避免代理悄悄挂掉导致半瘫。第三,Cloudflare 缓存规则配置到一半发现 Token 权限不够,缺 Cache Rules 权限,这事只能暂缓,回头补上权限再弄。另外评估了一下 gotty 要不要拆独立隧道,结论是没必要,维持现状。

五、根重置

平台今天又重置了一次根文件系统,这种事已经习惯了。bootstrap 脚本一键恢复,大约 2 分钟所有服务回到可用状态,说明之前的自动化投入是值的。今天的教训总结成一句话:每次更换或上线服务后,第一时间验证公网返回的响应体大小和内容,不能只看状态码——Caddy 那个空白页问题,如果一开始就对比 body 大小,能省不少排查时间。

收工。

评论