
自架服務踩過的一些坑
最近我把家裡那些閒置的舊電腦、硬碟和資料都重新盤點了一遍,能整併的就整併,不能整併就收在一起,不要散落在家裡各個角落生灰。
然後我開始搞自架服務,弄了音樂伺服器、檔案伺服器還有其他雜七雜八的東西,一路上走了不少彎路,也踩了不少坑,但也因此累積了一些可以拿出來和大家分享的心得。
硬體
裝了 Linux 不會改變硬體效能
我家有三台閒置電腦都是 10 年以上的款式,原本想著裝 Linux Debian 通通可以拿來當作伺服器使用,但事情根本沒有我想的這麼簡單。
這些老舊 CPU 裝了 Linux 確實用的比 Windows 開心,執行一般任務也都非常流暢,當年可說是頂到天的款式,例如我手上這顆 E6700 ,但是在現在來看核心數非常少,架構也和如今大部分 CPU 應該要支援的指令集不同。ente(備份手機照片的服務) docker 裡面需要用到 minio(一個開源檔案儲存容器),因為 CPU 架構不相容無法順利跑起來。
1 | Attaching to minio-1, museum-1, postgres-1, socat-1, web-1 |
我最後也沒有用 ente 就是,我比較喜歡 immach ,不過這類照片儲存的服務都要用到資料庫和 S3 ,沒有換 CPU 應該也會遇到一樣的問題
有些服務是直接告訴你我很吃效能,例如 Jellyfin 的文檔就寫了很高的硬體需求,我目前暫時沒有把劇集弄到本地服務觀看的需求,也沒有那麼多部劇要看,自己使用也有點浪費,所以沒有架這個。現在影集正版都加了 DRM ,片商會希望大家用串流觀看,刻意把正版用某些神奇方法下載下來對我來說有點多此一舉。
所以說要自架服務硬體規格還是堆的愈高愈好,不過假如你手邊就是沒有這麼好的硬體又捨不得花錢,退而求其次架一些簡單的服務或找其他朋友共用硬體會好一點,不用特別強求,有好的硬體才需要考慮要不要拿來用。
如果你有心要好好選擇硬體,千萬不要用 nvidia 家的顯卡,他們的閉源驅動程式在 Linux 上很難搞!除非你不打算裝桌面環境只跑 CUDA 計算。
為什麼不用樹莓派?
我想樹莓派的硬體規格可能比我的老舊的電腦還要好,我有樹莓派 5 ,但是我不是很願意拿他來跑任何服務,因為我手邊的機械硬碟、固態硬碟,樹莓派都沒辦法接上他們,要另外買擴充卡,變成只有 USB 硬碟能接,我有好幾片正常桌機的主機板,樹莓派在自架服務上的角色就非常尷尬。
我記得樹莓派可以用 iPad 充電口供電,或許我以後會帶他出門當做 iPad 的擴充硬體?
太老舊的電腦該何去何從?
後來我有把 E6700 換掉變成比較新的 i5-7500 ,就能應付我大部分的個人需求了(至少目前是這樣),輕量的服務和較耗資源的都放在一起都沒問題。那些老舊機器真的不會是我架本地服務的首選,我現在還沒有插電對他們做任何事,以後看情況可能跑個備份或是等到我搬去宿舍之後把這些電腦留在家裡當成個人電腦湊合用之類的。這些電腦就是備用機,拿來練習重灌、嘗試新的作業系統也很不錯,反正我家現在除了我沒人會用電腦,我自己主力電腦扣掉筆電也足夠了,就先收好。
磁碟分割
這是安裝 Linux 會碰到的問題,千萬千萬千萬不要把各個系統分割區獨立開來,我給伺服器的 SSD 本來就不大,只有 120GB ,我卻把 /var 、/home 、 /root 這些重要的系統檔案放在成不同的磁區,造成整顆硬碟沒什麼用,某個磁區例如 /var 所在磁區卻滿了不能繼續用。我把大部分的空間分給 /home 的磁區,所以 /var 沒辦法使用這些閒置空間,造成資源浪費。
docker 的一些資料會放在 /var 裡面,最好讓 /var 有比較高的彈性,反正真正佔空間的東西都會放在另外掛載的機械硬碟,home 除了設定檔也不會有多少東西。
軟體
作業系統 & 桌面環境選擇
目前主力機全部都是 Linux ,伺服器用 Debian 12,主力機有 Arch 和 mint 。Arch 安裝要做比較多設定,滾動式更新也對於伺服器來說也不太穩定。伺服器用的桌面環境最好輕量一點的,先不要用 WayLand 為架構的桌面環境,要選 x11 ,通常桌面環境會同時支援兩種,挑桌面環境再注意一下有沒有只裝到一種。「因為伺服器通常不會接螢幕(headless),也就是說你要麼就是 ssh 看純文字,要看視窗圖形介面就要用 VNC 這種遠端桌面軟體,有些遠端桌面程式跑 WayLand 可能有一些些問題,還是要回來 x11。目前 VNC 我用 tiger VNC ,這個軟體不需要在原始主機登入再按同意才給連線操作,但是沒有聲音傳輸,能傳聲音的開源方案我還沒看到滿意的,反正我現在也沒有需要傳輸聲音的需求。
伺服器的桌面環境不需要太多功能比如 2048 、貪吃蛇這種遊戲,也不需要可以自訂很多快捷鍵,反正給我畫面做一點基礎操作就好,無頭主機我喜歡裝 xfce4。
自架服務
偏好有文檔、可以用 docker 安裝的服務,發揮想像力,想要什麼就架什麼,不一定要把資料給科技巨頭放在雲端,這沒有比較安全。
GitHub 有一個儲存庫叫做 awesome-selfhosted ,根據各種需求條列了可以用哪些自架服務,可以去那邊挖寶。
目前我使用 Navidrome 聽音樂串流、immach 備份手機相片、syncthing 同步所有裝置之間重要的 config 檔、samba 遠端直接掛載硬碟,不久之後可能還會架 nextCloud 、Annfie ,未來服務肯定會愈架愈多,有碰到有意思的再單獨發一篇 blog 來說。
開機服務
crontab 和 systemd 是一定要學的的東西,這非常方便,前者可以按時排成備份之類的操作,後者用來開機自啟動服務,systemd 無論是在伺服器還是我個人電腦都會頻繁用到,個人電腦是拿來跑 rclone 自動掛載自己的 samba 分享目錄還有 CloudFlare R2 空間
硬碟配置
你的資料夾怎麼設計決定你多快能找到檔案,散落在各處的檔案也不利於備份,記得檔案放在哪裡非常重要,不然就等於沒有存這個檔案。要是連檔名都忘了, find 、grep 也沒辦法救你,資料一多普通人類絕對不可能記得自己以前都把這些東西塞到哪去了,所以一定要分類。
怎麼個分類法呢?
這裡分享我的朋友 Mertifas 給我的靈感,他說只要想像一個實際熟悉的地方(例如你家),把抽象的資訊放進這個空間裡面的某個物件旁邊,以後若需要回想詳細內容,只要想像自己走進那個場景就會比較容易回想起這些抽象的內容,這套理論叫做「記憶宮殿」。
也就是說你要讓硬碟設計真的像是一個房間,而你把檔案 A 放在桌子上,檔案 B 放在沙發。對於一顆資料碟來說(你可以理解成你放文件的最上層,也 Windows 的 D 槽),我的入口點全部都是薩爾達傳說海拉魯王國的著名的村莊。像是克洛格森林(Korok-Forest)、利特村(Rito Village)、海拉魯城堡(Hyrule Castle),當然我在檔案系統會用英文命名才比較好在 CLI cd 進去。每個村莊根據我在遊戲裡面對第一印象存放不同種類的檔案:
- 克洛格森林:放封存的照片檔
- 利特村:放動態資源(docker file 、加密的密碼本、ppt 模版等等)
- 海拉魯城堡:放捷徑和啟動器
- 卡卡利科村:放我想藏起來的東西
- 一始村:課外學習內容放在一始村
- 哈特諾村底下的古代研究所資料夾:放各種專案放在,
- 格魯德村:肥大的檔案例如 .iso 和各種可以選擇安裝路徑的程式
- 沃托里村:放遊戲會需要的檔案,steam 和 Epic 下載的遊戲都存在這
我也會用一些遊戲中的河流與道路名稱,作為各村莊底下的子資料夾,用來進一步細分用途。像是哈特諾村除了古代研究所還有其他商店和河流,我就會用這些地點來幫專案做更細部的分類,就專案來說就有近期主推、長期專案、blog 、暫時會頻繁使用的資源檔等等。不只是伺服器,在個人電腦我也十分建議這樣做,其實這套思路是我從個人電腦開始實施的,換到伺服器上我會根據用途動態新增/減少地點,我的無頭伺服器就不會有沃托里村和海拉魯城堡。自從我開始用這個方法存檔案後,就很少再忘記資料放在哪了,親測有效。
要讀文檔
不要只看一些個人 blog 寫的總結,他們的資訊更新速度絕對比官方文檔慢很多,讀文檔才能知道更細節的功能。尤其是自架服務串接的手機 App ,文檔會推薦所有能用的給你,個人 blog 通常只會推薦他用過的。
網路
IP
自架伺服器你要考慮的一大重點是如何在外面連上自己家裡面的服務,如果只有在家裡面能夠連上一點都不方便,但正常人不會有公網 IP ,中華電信可以申請我也不推薦你把機器暴露在公網,非常危險。我用 CloudFlare tunnel 和 zerotier 來遠端存取伺服器的資源。內網穿透 VPN 還有 Tailscale 可以試試,不過我性質和 zerotier 差不多,我裝好 zerotier 才知道這個,聽說也不錯用,免費方案裝置數量比 zerotier 多 10 倍(100 個)。
CloudFlare tunnel
這需要去買網域託管在 CloudFlare ,你一定要買個網域,買個網域很划算的,可以做很多事(以後再來解釋可以做哪些事),便宜的網域一年也沒多少錢,絕對物超所值。在伺服器上按照文檔安裝串連 CloudFlare 的程式就可以在外網輸入自己的網址存取服務,不需要公網 IP ,甚至可以直接拿到 https 憑證,非常省事。
VPN
這只有在外網 ssh 或 VNC 連回家會用到,我暫時不想把伺服器 ssh 透過 CloudFlare tunnel 轉送。
IP 我偏好手動指定,遮罩我切 /16 ,但是 ip pool 前三組數字是固定的,相當於切了 /24 ,多出來的備而不用,反正是私人 IP 隨便我切。因為也沒多少台裝置。伺服器的尾數是從 10 開始的完全平方數,這樣很好記,終端例如平板電腦就讓他隨邊配了,反正平常其他裝置不會叫他,忘記他的 IP 也沒差。我常用的 IP 是 10.144.21.100 ~10.144.21.255 這個區塊。