--- date: "2024-01-28 12:16:00" --- # 我的迷你 Homelab:用 Tailscale、Caddy、NextDNS 來輕鬆設定 Tailnet 內網的自訂網域 SSL 去年八九月搞了一台 [Orange Pi](http://www.orangepi.org/) 來玩。原本是想跑 [k3s](https://k3s.io/) cluster 來鍛鍊 k8s 相關知識的,但瞎搞了一陣子,只安裝完 [TailScale](https://tailscale.com/) 設定完 [Exit Node](https://tailscale.com/kb/1103/exit-nodes),就沒繼續弄了。 幾個月前身邊幾位朋友開始玩 llama 時,一起裝了 llama.cpp 來使用,不過我自己並沒有太多著墨。最近為了嘗試微軟出的 Phi-2 這個超級小的模型,又重新找了解決方案,才發現 [ollama](https://ollama.ai/) 這套工具,讓下載 model、提供 AI API 一氣呵成,還有現成的 [web UI](https://github.com/ollama-webui/ollama-webui) 和 [prompt community](https://ollamahub.com/) 可以用。 至此 ollama 才成為我開始認真打造 Homelab 的契機 XD ## 首次嘗試: MagicDNS + Caddy SSL 其實大多自建服務,跑起來之後用 local IP + port 就能夠存取了,反正也沒有要曝露到公網。有時候在外連線也要存取的話,就借助 TailScale 來把機器變成內網。覺得 IP 有點醜?那就用 [Tailscale MagicDNS](https://tailscale.com/kb/1081/magicdns)。剛好 Caddy 就內建了 [Tailscale MagicDNS 的 SSL 整合](https://tailscale.com/blog/caddy),直接數行搞定:(好個合作!) ```sh # 若服務跑在 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](https://nextdns.io/) 來當作簡單的 DNS 解法。NextDNS 最主要還是從 DNS 層來做內容防護的服務(aka 用來擋廣告、防追蹤的)。他也提供了簡易的 Rewrite 功能,能夠把自訂的 Domain 指向 IP 位址。 ![image](https://hackmd.io/_uploads/HynUOoM96.png =400x) 巧的是,Tailscale 直接整合了 NextDNS 服務,只要在 Admin console 加入 NextNDS 的設定檔 ID 即可,真是好一個商業大 feat! ![image](https://hackmd.io/_uploads/H1QSusfc6.png =400x) 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` 指令來安裝該憑證到本機: ```bash 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 指到本機: ```bash ssh host -L 2019:127.0.0.1:2019 ``` 如果是手機等無法跑 caddy cli 的地方,就直接 caddy 的根憑證丟到裝置上安裝: ```bash /var/lib/caddy/.local/share/caddy/pki/authorities/local/root.crt ``` > [!NOTE] > 在 iOS 上操作的方法: > Airdrop .crt 檔案到裝置 -> 設定 -> VPN 與憑證管理 -> 安裝 > 一般 -> 關於 -> 憑證與信任裝置管理 -> 打開該憑證的信任 ### 小結 回顧一下,目前我 Homelab 的架構是: * Tailscale 做 VPN + Exit Node * 架設各種服務在 Tailnet 節點(大部分為 docker,[`lazydocker`](https://github.com/jesseduffield/lazydocker) 好用) * 用 NextDNS/Adguard Home 來設定自訂網域 DNS + 擋廣告服務 * 用 Caddy 自簽的憑證來發自訂網域的 SSL 還有 reverse proxy Tailscale 和 NextDNS/AG Home 都有極簡易 UI 可以調整。唯一比較需要弄設定檔的 Caddy,因為語法也相當容易(看看一個服務也才兩行),所以這整套推薦給不太想要弄設定檔,和我一樣懶的各位。 除了上述提到的數個服務外,我還陸陸續續跑了: * [CodiMD](https://github.com/hackmdio/codimd):簡單好用的自架版協作 Markdown 服務。你終究是要業配的,那為何不一開始就業配 * [Ladder](https://github.com/everywall/ladder):12ft 的開源替代,可以,呃,自己看說明 * Eternal Terminal:mosh 的替代,雖然聽說效能差了一點,但在台灣網路環境絕還夠用 * ...等等,定時觀賞 [awesome selfhosted](https://awesome-selfhosted.net/) 和 [reddit selfhosted](https://www.reddit.com/r/selfhosted/) 版 在榨乾小 Orange Pi 的最後一絲戰力前,我是不會放棄跑更多服務的 XD 最後祝大家 Happy Hacking Homelab 啦! [^1]: [FR: Support custom records in MagicDNS](https://github.com/tailscale/tailscale/issues/1543) [^2]: [FR: TLS Certificates for subdomains - or wildcard certificates](https://github.com/tailscale/tailscale/issues/7081)