事情的起点特别朴素:我指着一台云服务器问,”这个博客我怎么更新?”

那台机器是别人帮搭的。上面跑着一个 Hexo 博客,但源码在哪、怎么发布、谁来维护,我一概不知。一个多月后再看,它已经变成了一套十三个域名入口的自托管体系——博客、内网穿透、监控面板、几个自己写的工具,全部 HTTPS,防火墙只开四个端口。

这篇文章记录这次整理的路线和心得。

第一步:不动手,先盘点

接手任何”不明系统”,第一件事不是改,是看。

我让 Agent 把服务器从里到外扫了一遍:nginx 指向哪、源码在哪、监听了哪些端口、有哪些账号、什么服务在跑。这一步把家底盘清楚,后面的每个决定才有依据——盘点先于优化,这是这次最重要的一条经验。

盘点立刻就有收获:防火墙开着一段两千个端口的大范围规则,实际只用到十几个;两个从未登录过的账号躺在那里;还有一个装了一半就被放弃的旧博客系统,连着 98MB 的残留文件。

博客这一层:从能用到像样

博客的改造是循序渐进的:

先把发布流程搞清楚——Hexo 的套路其实就三步:写 Markdown、生成静态页、nginx 直接读生成目录。没有 git,没有 CI,简单到不容易坏。

然后是合规这条线:域名解析、ICP 备案、证书、页脚挂备案号,一步不缺。中间还认真读了一份公安备案的办事指南 PDF,把流程整理成带材料清单的操作手册。合规不是负担,它是”这个站可以长期开着”的前提。

最后才是观感:默认主题换成 Butterfly,起站名、定作者。技术上都是小事,但站名这种事 Agent 替代不了——它给了我十个候选,最后”随想与复利”四个字还是得我自己拍板。

安全这一层:收敛,而不是加固

安全上我做的事,准确说是”收敛”而不是”加固”——没有装一堆新东西,只是把不必要的开口关掉:

  • 防火墙从两千个开放端口收到四个:SSH、HTTP、HTTPS、frp 控制端口
  • 删掉两个从未登录的冗余账号和 98MB 的废弃系统
  • 内网穿透的认证 token 一直有效——日志里确实有陌生 IP 来敲过门,被 token 挡了

收完之后有个副产品:所有服务只能从一个门进(HTTPS 域名),排查问题、记地址、给人分享,都变简单了。安全措施最好的状态,是顺手把复杂度也降了。

穿透这一层:从 IP 加端口,到子域名

家里跑着不少东西:一个股票筛选器、一个 AI 绘图服务、一个电力交易的小系统、几个 Agent 的监控面板。它们通过 frp 内网穿透,借云服务器对外。

改造前的访问方式是”IP 加端口号”——记不住,发给别人不体面,而且每个端口都是裸露的攻击面。改造后每个服务一个子域名,统一走 nginx 反代加 HTTPS,原来的裸端口全部从公网关闭。

现在家里的机器只跟服务器保持一条加密隧道;对外,则是一排整齐的 https://xxx.我的域名。新增一个服务的成本变成两条 DNS 记录加一段配置,几分钟的事。

这套架构的形状

最后定型的是一个很朴素的洋葱结构:

  • 最外层:防火墙,四个端口;
  • 中间层:nginx,所有域名入口、证书、跳转都在这一层收口;
  • 内层:frp 把家里的服务引进来,服务器本机只跑博客和一个网关应用;
  • 家里:真正吃资源的计算(AI 绘图、数据抓取)都在本地,云服务器只做轻量的转发。

一台两核 1.6G 的入门云主机,load 常年在 0.1 以下,响应一百多毫秒。资源放在该放的地方,便宜的机器也能撑起体面的服务。

几条心得

  1. 盘点先于优化。不摸清现状就动手,改的不是系统,是自己对系统的想象。
  2. 入口要收敛。端口、域名、账号,数量越少越好管。十三个服务共用一个门,比十三个门各配一把锁更安全也更省心。
  3. 安全是做减法。这次没新增任何安全组件,只是关端口、删账号,风险面缩小了一个数量级。
  4. 人的决策点在命名和取舍。Agent 能把整条流水线跑完,但站名叫什么、哪些服务值得留下、备案要不要办,这些”要不要”的问题始终是我的。
  5. 把过程写下来。这次每一步的命令、验证结果都有记录,回溯任何决定都有一条清楚的路径——这也是这篇文章能存在的原因。

结语

回头看,这次整理没有用到任何高深技术:nginx、frp、防火墙规则、一张证书,全是十几年老工具。真正起作用的,是”先看清楚、再收干净、把入口变少”这三句话。

以及,一个你不清楚怎么更新的系统,和一套你自己搭起来的系统,即使配置完全相同,也是两种东西——后者你敢改,前者你只敢用。