把一台 VPS 改成自己的机房:我为什么什么都自己搭
我在这台机器上放了反向代理、登录网关、模型路由、文件镜像、视频解析和备份。这些都能买 SaaS,但我还是自己搭:我想知道每一层在做什么,出问题时手里有命令。
机器在圣何塞,Debian 12,8 核 7.9G,服务基本跑在 Docker 里。下面是我做完后留下的几个判断,不是教程。
从一台空机器开始
刚拿到机器时,我装过面板。它把「服务在不在跑」变成一个绿色圆点,却不告诉你端口绑在哪、证书从哪来、日志写到哪。真出故障,还是要回 SSH。
后来我把顺序倒过来:先定边界,再装服务。公网只留 22、80、443,nftables 只放行这三个口,再叠 fail2ban 和白名单;80 做证书和跳转,443 交给 Caddy。其它容器一律只绑 127.0.0.1,要对外就从 Caddy 走。这个约束让「服务不小心暴露到公网」变成需要刻意去做的事。
我给自己定了三条:
- 能绑回环就不绑公网;
- 能用一个入口就不开第二个;
- 能写进脚本的步骤,不留在记忆里。
端口我查过一次:
| 端口 | 用途 | 对外 |
|---|---|---|
| 22 | SSH | 仅白名单 |
| 80 | 证书与跳转 | 是 |
| 443 | Caddy 反代 | 是 |
平时不看面板截图,直接看容器把端口映射到了哪里:
docker ps --format '{{.Names}} {{.Ports}}'
为什么不用现成的 SaaS
SaaS 最吸引人的是「不用管」,但对这些服务,「不用管」往往等于「不能改」。模型网关被限流时,我要它自动切备用线路;网盘分享失效时,我要知道是链接过期还是同步脚本卡住;解析要边转边发,不能先落盘再等几十秒。这些都不是标准产品的默认行为。
代价也实在:升级、证书、磁盘都要自己看。办法是把能自动化的尽量自动化,把不能自动化的写短。比如备份,整机打包后上传到 139 云盘,另留一个单文件恢复脚本;它不依赖面板,机器重装后能直接跑。
备份是否可信,不看提示,看恢复脚本能不能在一台空机器上跑完。
面板要能跑命令
我对面板的要求只有一个:得让我看见命令,最好还能直接跑。仪表盘适合展示,不适合排障。服务挂了,我需要三样东西:
- 最近的日志;
- 当前监听的地址;
- 进程的退出码。
现在入口很朴素:一个统一登录网关,一个密码覆盖 magpie、dsh、文件站、解析站四个子域,登录一次 30 天免密。
一个入口,四个子域
magpie 是我花时间最多的。它是 OpenAI 兼容的模型网关,后面挂多账号池和路由组;主模型被限流时,按路由组切到备用线路,调用方不用改代码。dsh 是 DeepSeek harness 的网页版,我打过几个补丁,改过文件下载、删文件和模型选择器。文件站用 OpenList,把网盘分享链接自动镜像到自己的域名。解析站用 yt-dlp 边转边发,服务端不落盘,代价是不能断点续传。
这些改动都不大,但每一处都对应一个具体的不顺手。自己搭的好处就在这里:不顺手的地方,可以改到顺手为止。
不把服务暴露在公网
上面这些服务,没有一个应该直接听公网。容器只绑回环,Caddy 在 443 上做 TLS 和反代,统一登录挡在前面。麻烦是每加服务都要多写一段反代配置;好处是攻击面小到能在一张纸上画完。
我不觉得自建适合所有人。它适合愿意为「知道发生了什么」多花一点时间的人。这台机器最大的价值不是省了多少钱,而是出问题时我能从最外面一层查到最里面一层,不用等别人回工单。