HomeLab 基础设施之内网域名
前言
大学时,我的各种服务都挂在公网服务器上,比如自己的代码托管服务、api 管理服务,随处都能连上这些服务,很爽。但毕竟公网服务器不便宜,服务越来越多,1G 内存完全不够用的,而且出于安全考虑,有些服务也不适合部署在公网服务器上,于是毕业后我把电脑搬回家,全年开机当服务器用(其实一天的电费也挺贵的,但它可是插着 64G 内存和显卡的服务器)。
刚开始,访问内网服务时都是用 ip:port 的方式,当时服务没多少,也只有我自己在用这些服务,问题不大。之后部署了 Jellyfin 影音库,父母也要用,于是我开始给服务加上域名。
私有域名
反正家里的路由器系统是 OpenWrt,直接上去配置 dnsmasq,手动去配 dns 解析,比如 jellyfin.lan
,然后再去服务器上弄一个 nginx 反向代理就可以用域名访问了。
再后来,我整了个 Portainer,为了安全(应该安全吧)得上 https 了,但像我这样的域名又是没法申请 https 证书的,那我只能自己签发 CA 证书,然后得在家里的设备上都安装并信任这个 CA 证书。自己签发 CA 证书不是本文的重点,想自己签发 CA 证书可以参考下面这两篇文章:
其实给自己的设备安装自签 CA 证书也还没多麻烦,尚能接受。但后来折腾 CI/CD 时麻烦的事情就来了,与 CI/CD 配套的基础设施还有 npm registry 等等,这些基础设施都需要 https,又因为我的 CI/CD 过程是在 Docker 容器中完成的,在构建时容器环境中是没有自签 https 证书的,所以我还得维护一套添加了自签 https 证书的基础镜像,事情变得麻烦了起来。
其次,有些应用还不认手动添加到系统的 https 证书,比如 immich(issue)。
于是我开始思考其他方案。
购买域名
我突然想到以前公司也是有内网域名的 byted.org
,明白了,我可以去买一个域名然后通过 DNS 验证签发一个通配 https 证书,即使 CA 无法访问到我的内网服务器!
冲,选一个短一点、便宜点的域名 cled.top
,一年也不到 50 块钱。然后再去 OpenWrt 上把 cled.top
解析到内网 IP 上。最后再用 acme.sh 的 dnsapi 签发一个证书就可以啦。