Homelab - 基础设施

以前我算是个云服务爱好者,存储和算力全都跑在云上。虽然家里也有群晖 NAS 和旁路由,但整体还是追求稳定,开箱即用就好,从不折腾太多。

直到最近国补活动,我入手了一台不到 ¥3000 的 Mac mini——比起每年三五千起步的云服务费,便宜太多。而且家里本来就有 NAS,可以实现存储和计算分离,所以就决定搞个 Homelab,搭建自己的 deepseek 服务、数据分析平台等等。


当前的硬件设备:

  • 光猫 ×2 电信光猫:¥200/月,送 5 张电话卡无限流量 联通光猫:今年免费,明年起 ¥9/月

  • 硬件旁路 2019 年在淘宝买的老设备,两千多,性价比一般,性能也不强,先将就用着,等坏了就拿国补 Mac mini 顶上。当前基于 ESXi 跑了 iKuai + OpenWRT:

    • iKuai 负责双宽带拨号

    • OpenWRT 负责旁路由功能

  • 群晖 NAS 作为存储单元,性能太弱,跑不了高负载计算任务

  • 国补 Mac mini 作为计算单元,SSD 太贵,不适合存储,刚好和 NAS 互补


Infra 软件组件

  • Dnsmasq(OpenWRT 自带) 主要提供 DHCP 和本地 DNS 域名解析。

由于使用了旁路由模式,需要“翻墙”的设备,其网关设置为 OpenWRT;不需要翻墙的设备,则将网关设为 iKuai。

本地 DNS 还可以用来给设备分配友好的域名,比如:

  • 群晖:nas.kidylee.com

  • 相册服务:photo.kidylee.com

在局域网内可以直接用这些域名访问设备。如果想要这些域名在外网也能访问,还需要用到两个软件:Caddyddns-go


Caddy

Caddy 是一个 https 服务器,支持反向代理,并内置了自动申请 SSL 证书的功能。

比如:局域网发起对 nas.kidylee.com 的请求,Dnsmasq 会将域名解析为 Caddy 所在机器的地址,Caddy 接到请求后再代理到群晖 NAS 上。这样,局域网的服务也能跑在 https 上。

外网访问时,域名先经 Cloudflare 解析到家里的公网 IP,通过 iKuai 的端口转发再传给 Caddy,同样也能访问服务。


ddns-go

为了让外网请求能准确找到家里的公网 IP,我们需要动态更新域名解析记录,这就是 ddns 的作用。

我用的是 ddns-go,它原生支持 Cloudflare,配置简单,只要提供 Cloudflare 的 API,就能自动更新 IP,甚至可以直接在它的 Web UI 里新增子域名,不需要登录 Cloudflare 页面,超方便。


openclash

这个就不用多说了,懂的都懂。

但需要特别注意一点:Caddy 所在的机器,网关必须指向 iKuai,而不是 OpenWRT

因为 OpenClash 在 OpenWRT 上使用防火墙转发请求,对于内网向外的访问没问题,但对于外网访问内网的请求,Clash 分不清方向,会直接断掉连接。

我本来打算魔改 Clash 来解决,后来一想还是要尊重“Do one thing, do it well”的原则,索性把 Caddy 安装到群晖上,再把群晖的网关指到 iKuai——群晖本身不需要翻墙,这样设置最稳。


云服务

目前唯一还用的云服务就是赛博菩萨——Cloudflare

除了做 DNS 服务,我还主要用它的 Rule 功能。

众所周知,国内宽带对家庭用户的 80 和 443 端口有监听。如果你在这两个端口上跑了 HTTP 服务,过一阵子这些端口就会被封掉。所以我一般只能用像 https://nas.kidylee.com:8443 这种非常规端口来访问服务。

但通过 Cloudflare 的 Rule,我可以将发往 443 的请求转发到 8443 上,从而实现无端口的访问方式,配置名我就干脆叫它 “fuck 443”。可以参考另外一篇文章具体设置: https://kidylee.com/blog/fuck-443/

这样的配置带来了几个好处:

  1. 内外网访问一致: 无论在家还是在外,访问服务都是同一个域名,局域网访问时不会绕外网再回来,速度快、体验佳。

  2. 可使用 443 端口访问服务: 避免因 443 被封影响访问,同时又保留了 https 的兼容性。

  3. 密码软件支持更友好: 密码管理工具一般只识别域名,不区分端口。如果多个服务都在同一个域名 + 不同端口下,密码软件很容易搞混,甚至覆盖掉原密码。 现在每个服务一个独立子域名 + 独立证书,密码软件识别准确,https 访问也更安全。