Archer Han
← 全部作品

服务台

把散在七八个地方的内部服务收进一个入口,登录和证书只有一套

服务台首页,八个服务按状态列在一个列表里
服务台首页。八个服务挂在同一条入口下,只用一次登录。

为什么做

这几年陆续往服务器上装东西:密码库、监控、远程桌面、图床、备份、证书。每个都有自己的一套东西要记——端口、登录页、证书什么时候到期。

一开始还记得住,后来就记不住了。有一回想看看备份跑没跑成功,翻了半天才想起来是哪个端口。证书更麻烦,八个服务各管各的,到期时间不一样,有几回是浏览器先报了错我才知道。

所以做了这么一个首页:一个域名进来,所有服务都在,登录过一次就不用再登,证书统一续。

关键的取舍

不改动各个服务本身。 每个服务都有自己的账号体系,我没有去改它们,而是在门口加了一层。代价是有些服务的界面里还会冒出它自己的登录框,看着重复。换来的是我升级任何一个服务都不用管登录。

公网只开 80 和 443。 其他服务的端口一律退到内网,外面碰不到。加一个新服务不用动防火墙规则,这是最省事的地方。代价是调试的时候必须先想清楚流量从哪进来。

首页只显示状态,不做图表。 我本来想把每个服务的指标都抓过来画在一张图上。后来发现我真正会看的只有 它活着吗,要看细节点进去就行。首页因此简单了很多,代价是有时候得多点一下。

统一入口是怎么做的

所有流量先到一台反向代理(我用的是 Caddy),由它按域名分发到各个服务。每个服务只在自己的容器里监听端口,这些端口不对公网暴露。首页就是一个静态目录,file_server 把它直接发出去。

archerhan.com {
	root * /srv/site
	file_server
}

home.archerhan.com {
	reverse_proxy home:3000
}

新加一个服务就是复制一段、改个域名。

回头看

动手的时候我以为最难的是统一登录,真正拖时间的是证书。八个服务的续期方式各不相同,有几个根本不支持自动续,最后是写了个脚本每月跑一次。

麻烦的从来不是功能本身,而是那些你以为顺手就能带上的边角。

Next.js · Caddy 统一入口 · 每个服务一个子域 · 源码不公开