我的迷你 Homelab:用 Tailscale、Caddy、NextDNS 來輕鬆設定 Tailnet 內網的自訂網域 SSL
去年八九月搞了一台 Orange Pi 來玩。原本是想跑 k3s cluster 來鍛鍊 k8s 相關知識的,但瞎搞了一陣子,只安裝完 TailScale 設定完 Exit Node,就沒繼續弄了。
幾個月前身邊幾位朋友開始玩 llama 時,一起裝了 llama.cpp 來使用,不過我自己並沒有太多著墨。最近為了嘗試微軟出的 Phi-2 這個超級小的模型,又重新找了解決方案,才發現 ollama 這套工具,讓下載 model、提供 AI API 一氣呵成,還有現成的 web UI 和 prompt community 可以用。
至此 ollama 才成為我開始認真打造 Homelab 的契機 XD
首次嘗試: MagicDNS + Caddy SSL
其實大多自建服務,跑起來之後用 local IP + port 就能夠存取了,反正也沒有要曝露到公網。有時候在外連線也要存取的話,就借助 TailScale 來把機器變成內網。覺得 IP 有點醜?那就用 Tailscale MagicDNS。剛好 Caddy 就內建了 Tailscale MagicDNS 的 SSL 整合,直接數行搞定:(好個合作!)
# 若服務跑在 localhost 3000 port name.tailnet-name.ts.net { reverse_proxy :3000 }
但一台機器也可能跑不只一個 http 服務,而 Tailscale 的 MagicDNS 也暫時不支援 sub domain 的功能。[1] [2] 如果要支援多個服務,那乾脆就自訂網域好了。
Step 1:Custom DNS: with NextDNS
最簡單暴力的改法就是改 Host 了。直接硬把 domain 指到我們內部服務節點的 IP 上。但是這樣一來 Tailnet 內的裝置就無法共同享用這個設定。
我則是使用了 NextDNS 來當作簡單的 DNS 解法。NextDNS 最主要還是從 DNS 層來做內容防護的服務(aka 用來擋廣告、防追蹤的)。他也提供了簡易的 Rewrite 功能,能夠把自訂的 Domain 指向 IP 位址。
![image](https://hackmd.io/_uploads/HynUOoM96.png)
巧的是,Tailscale 直接整合了 NextDNS 服務,只要在 Admin console 加入 NextNDS 的設定檔 ID 即可,真是好一個商業大 feat!
![image](https://hackmd.io/_uploads/H1QSusfc6.png)
NextDNS 雖然有免費方案,但正常網路習慣下蠻容易用盡的,為此我之前還用了三年的 NextDNS Pro 方案。你當然也可以架設自己的 DNS 服務來辦到。為了達成全自架的夢想(??),我自架了朋友推薦的 Adguard Home,一樣可以檔廣告,一樣支援自訂域名設定:
![image](https://hackmd.io/_uploads/r1YPdsGca.png)
Step 2:信任 Caddy 自簽的 SSL 憑證
設定完 DNS 後,用自訂的網址連接就會跳轉到內網服務去了,但此時還需要設定憑證才會讓自訂網址的 SSL 可用。
Server 端 Caddy 的設定:
example.lan { tls internal reverse_proxy :3000 }
然後在 Client 端,也安裝上 Caddy CLI,用 caddy trust
指令來安裝該憑證到本機:
sudo caddy trust # or using address option # sudo caddy trust --address xx.xx.xx.xx:2019
因為預設這個指令會去抓 localhost:2019
的 Caddy Admin API,在執行前,可以用 ssh local forwarding 的方式來把 server 的 2019 port 指到本機:
ssh host -L 2019:127.0.0.1:2019
如果是手機等無法跑 caddy cli 的地方,就直接 caddy 的根憑證丟到裝置上安裝:
/var/lib/caddy/.local/share/caddy/pki/authorities/local/root.crt
在 iOS 上操作的方法: Airdrop .crt 檔案到裝置 -> 設定 -> VPN 與憑證管理 -> 安裝 一般 -> 關於 -> 憑證與信任裝置管理 -> 打開該憑證的信任
小結
回顧一下,目前我 Homelab 的架構是:
- Tailscale 做 VPN + Exit Node
- 架設各種服務在 Tailnet 節點(大部分為 docker,
lazydocker
好用) - 用 NextDNS/Adguard Home 來設定自訂網域 DNS + 擋廣告服務
- 用 Caddy 自簽的憑證來發自訂網域的 SSL 還有 reverse proxy
Tailscale 和 NextDNS/AG Home 都有極簡易 UI 可以調整。唯一比較需要弄設定檔的 Caddy,因為語法也相當容易(看看一個服務也才兩行),所以這整套推薦給不太想要弄設定檔,和我一樣懶的各位。
除了上述提到的數個服務外,我還陸陸續續跑了:
- CodiMD:簡單好用的自架版協作 Markdown 服務。你終究是要業配的,那為何不一開始就業配
- Ladder:12ft 的開源替代,可以,呃,自己看說明
- Eternal Terminal:mosh 的替代,雖然聽說效能差了一點,但在台灣網路環境絕還夠用
- …等等,定時觀賞 awesome selfhosted 和 reddit selfhosted 版
在榨乾小 Orange Pi 的最後一絲戰力前,我是不會放棄跑更多服務的 XD
最後祝大家 Happy Hacking Homelab 啦!