Day14 你的機器還活著嗎

https://image01.fishmind.org/cnc/ironman-2026-day14-01.png

這一路示範到此,共蓋了 10 台:3 台 proxmox ,7 台 ubuntu : Router, NPM,HQ,LLM,TTS+STT+OCR,RAG,Remotion 。

底下的截圖是我實際在管的那座機房目前狀態,數量會跟示範的不同,請見諒。

機器多了,常態性地檢查系統服務是否正常,就變成很重要了。

第 8 天蓋的控制中心有四個頁面:儀表板、遠端、日誌、管理。那四頁回答的是「現在怎麼樣」。今天要補的是另外三個問題:
昨天到今天變了什麼?
該在跑的東西還在跑嗎?
出事的時候誰來告訴我?
做法是在同一個控制台上再加三個分頁:維運、服務、防護,外加一組通知設定。

ssh 連到 hq,切換到 /opt/claude-working,執行 claude code:
告訴 claude code:

hq 這個控制台要再加三個分頁:維運、服務、防護。

一、維運:每天固定時間掃一次全機隊,另外給我一顆「立即掃描」。
    要問的東西:
    - 系統版本、核心版本、有幾個更新可以裝、其中幾個是安全更新、要不要重開機
    - 這個系統版本什麼時候停止支援,還剩幾天
    - 對外的憑證什麼時候到期
    - 磁碟還剩多少、備份最後一次是什麼時候
    ⚠️ 一台機器只准連一次 SSH。要問的事情寫成一支腳本一次帶回來,
       不要每一項各連一次。
    ⛔ 這一頁全部唯讀。要看更新有哪些就用模擬的方式問,不要真的裝下去。

二、掃出來的每一件事都要能被關掉,給我三個選項:知道了、延後幾天、
    凍結(我決定暫時不處理,但它要繼續列在清單上,標明是我凍的)。
    ⚠️ 同一件事連續掃兩次,數量要一樣,不要每天長出一筆一模一樣的。

三、服務分頁:不要另外派一支程式去問。直接用維運掃描帶回來的那份快照,
    列出每台在跑什麼容器、在聽哪些埠、開了哪些系統服務。
    我會另外登記「這台應該要有什麼」,你把兩邊比對,
    ⭐ 我要的答案只有一個:我說過應該要在的,現在有沒有不見。

四、防護分頁:把每一台的 fail2ban 狀態撈回來,
    哪幾台有裝、現在封了幾個、累計封了幾個,可以當場封鎖或解封一個位址。
    ⛔ 不要在遠端機器上裝任何東西,用現有的 SSH 連線去問。

規則:
- 憑證用現有那份,不要另外開一份新的清單。
- 有機器連不上,那一台標示連不上就好,⛔ 不要把它名下的事情當作已經解決。

儀表板:

https://image01.fishmind.org/cnc/ironman-2026-day14-02.png

我自己的儀表板現在管 40 台機器:線上 36 台,離線 4 台。每一列有名稱、位址、狀態、CPU、記憶體、磁碟三個百分比,還有標籤與最後檢查時間。標籤(web、docker、proxmox、host)不是裝飾,掃描要靠它決定對哪一台問哪一種問題;問一台路由器有幾個容器沒有意義。

截圖裡那幾台的最後檢查時間是 3:20:04、3:20:05、3:20:06、3:20:07,一台差一兩秒。那代表它是一台一台掃過去的,綠燈的意思應該是「剛剛才確認過它活著」,不是「上次確認的時候它活著」。背景那支檢查程式如果自己死了,整片綠油油的畫面會維持原樣,而底下的機器可能已經倒了半天。所以那個時間必須跟燈放在同一列。

離線那 4 台不一定是壞了,有可能是本來就決定關機的。清冊要能記得這件事,不然它每天早上都會為了一台你關掉的機器叫一次,叫到你不再看它為止。

這一頁能自己去問 40 台機器,代表那 40 組 SSH 憑證放在某個地方。規矩從第一天到今天沒有變:密碼加密之後才進資料庫,解密的鑰匙不放在資料庫旁邊,不寫進程式碼,也不進版控。自己蓋的管理系統會變成整座機房裡最值錢的一台,因為它一台就能通到全部機器。

遠端主機管理:

https://image01.fishmind.org/cnc/ironman-2026-day14-03.png

左邊是機器列表,右邊是那一台的詳情:主機、SSH 使用者 root、狀態、上次檢查時間,還有備註。備註欄寫的是規格:Proxmox VE 8.4.14、252GB 記憶體、ZFS 鏡像、上面跑 17 台虛擬機。那是那台機器的身分證。半夜盯著一個沒看過的機器名稱發呆的時候,不用先去翻文件才知道它是誰。

快速指令那兩顆按鈕是查看系統負載與查看系統服務,把「每次連進去都會打的那幾行」變成按鈕。輸出直接印在下面:開機 71 天、負載 7.17、記憶體 251Gi 用掉 200Gi、根目錄用了 33%。下面還留一個自訂指令,要問別的就自己打。

遠端這一頁可以對任何一台機器送任何一個指令,權限是整個控制台裡最大的。看得住它的東西只有日誌,而且要把指令原文記進去,不能只記「執行了一次遠端指令」。

實作的時候撞到一個坑:虛擬化主機那幾台是用 root 登入的,而且根本沒裝 sudo。如果指令一律加上 sudo 再送出去,那幾台會整台顯示「無法查詢」。不是它壞了,是工具多此一舉。所以送指令之前要先問一句「我現在是誰」,是 root 就不要提權。這種錯誤的症狀很討厭:它看起來像機器出問題,其實是你的工具出問題。

維運分頁的做法:一台機器只連一次 SSH。要問的事情有十幾件 —— 系統版本、核心、有幾個更新、其中幾個是安全更新、要不要重開機、磁碟剩多少、備份最後一次是什麼時候、憑證什麼時候到期。如果是一項寫一支函式各連各的,40 台乘十幾項就是好幾百次連線,要跑好幾分鐘,而且每一次連線都是一次可能失敗的機會。
實際做法是把那十幾件事寫成一支腳本,每一段前面放一個分段標記,一次連線全部帶回來,回來之後再照標記切開。40 台大約 25 秒。

25 秒這個數字的意義不只是快,是它快到你願意按下「立即掃描」等它跑完。一個要跑五分鐘的檢查,你會等到捉狂。

維運這一頁全部唯讀。要知道有哪些更新可以裝,就用模擬的方式問「如果我升級會裝哪些東西」,不要真的裝下去。一個會自己動手的檢查程式,出事的時候你分不清楚是機器壞了還是它弄壞的。

維運中心・待辦事項:

https://image01.fishmind.org/cnc/ironman-2026-day14-04.png

待辦事項上面五個數字:嚴重 4、高 2、中 24、低 30、已解決 89。每一筆有分類(EOL、安全)、機器、狀態、最後出現時間。右上角寫著上次掃描的時間,旁邊一顆立即掃描。

每一列右邊有三顆按鈕:知道了、延後 7 天、凍結。一份不能關掉的清單,第三天就沒有人看了,知道了,就是我現在不處裡。凍結跟延後不一樣:延後是等一下處理,凍結是我知道、而且我決定暫時不處理、別再問我。被凍結的事情要繼續列在清單上,並且標明是我自己凍的,不是它自己安靜下去的。

同一件事的識別碼不能包含會變動的數值。「某某憑證只剩 31 天」如果把 31 寫進識別碼,明天變成 30 就會被當成一件新的事情,於是每天長出一筆一模一樣的東西,一週之後那份清單就沒救了。識別碼只能是「哪一台、哪一件事」,剩幾天是內容不是身分。

對帳的邏輯是:這一輪掃描沒再看到的問題就當它解決了。聽起來合理,直到有一台機器剛好在掃描的那 25 秒裡連不上 —— 它名下所有的事情都會突然被判定已解決,然後下次它上線,那些事情會以新問題的身分整批復活再推播一次。所以自動結案只能對這一輪真的掃到的機器做。連不上的那一台,答案是「不知道」,不是「沒事」。

維運中心・憑證:

https://image01.fishmind.org/cnc/ironman-2026-day14-05.png

憑證頁列的是網域、來源、簽發者、到期日、剩餘天數、在哪一台。來源有兩種:一種是去反向代理的資料庫裡問「你帳面上寫這張憑證什麼時候到期」,另一種是真的去跟那個網域握一次手,看對方遞出來的是哪一張。這兩個不是重複,是對照組。

憑證出事幾乎都不是因為忘記續,而是續了但沒有裝上去,或者裝上去了但服務沒有重新載入。帳面上一切正常,外面拿到的還是舊的那張。只信任帳面,你會在到期當天從使用者的截圖裡知道這件事。截圖裡最短的剩 31 天,全部 ok。這一頁平常沒有任何事情發生,它的價值全部集中在到期前那一個星期。

維運中心・系統與軟體:

https://image01.fishmind.org/cnc/ironman-2026-day14-06.png

系統與軟體那一頁列的是系統版本、核心版本、可升級、安全性、需重開機、EOL 天數。有一台可升級的有 84 個,其中 17 個是安全更新。這兩個數字放在一起看,你會拖,84 個聽起來像一個下午的工作,慢點再做;17 個安全更新,可以先做。

需重開機這一欄,存在的理由很簡單:升級完沒有重開,跑的還是舊的核心。套件清單上寫著已經是新版,實際上記憶體裡跑的是舊的。

最右邊那欄是 EOL 天數,有兩台是 -19,代表已經過了停止支援的日期 19 天。這一欄如果寫成日期,眼睛會滑過去;寫成天數,而且過期的用負數,它才會刺眼。這一頁不會幫你升級,它一個字都不會幫你動,它唯一的功能是讓你沒有辦法假裝不知道。

服務清冊:

https://image01.fishmind.org/cnc/ironman-2026-day14-07.png

服務分頁上面四個數字:在跑的服務 407、預期但不見 0、已登記預期 40、無清冊資料 4。它沒有自己的探針,吃的是剛才那次掃描帶回來的同一份快照 —— 容器、在聽的埠、非預設的系統服務,那次連線順手一起帶回來了。多派一支程式去問,就是多一個要維護、會壞。

407 這個數字其實沒有用,沒有人看得完 407 個服務,看完也不知道哪個不該在。真正有用的是第二個數字:預期但不見,0。做法是另外登記一份「這台應該要有什麼」,掃描回來之後兩邊比對,少了的那一個會變成一筆維運待辦,跟其他問題走同一條通知、同一組按鈕。至於在跑但沒登記的那幾百個,它不會吵你:「多了一個我不認識的服務」是安全掃描的題目,不是這一頁的題目。

無清冊資料那 4 台是路由器,它們不是 Linux 那一套,問不出容器也問不出系統服務。這種情況要顯示成「不適用」,不能顯示成失敗。把不適用畫成紅色,你會很快學會忽略紅色,然後某一天真正的紅色出現,你也會忽略它。

下面那一區把 40 台按用途分成幾群:AI 與模型、網站、郵件、反向代理、虛擬化主機、網路設備,每一台後面寫著它跑了幾個服務。這一區其實是在回答昨天結尾那個問題 —— 我們到底組了幾台機器。答案不是一個數字,是這一張圖。

防護・fail2ban:

https://image01.fishmind.org/cnc/ironman-2026-day14-08.png

防護分頁上面:已安裝 fail2ban 的有 17 台(全機隊 32 台)、目前封鎖中 10、累計封鎖 573、無法查詢 4。這一頁只做兩件事:把每一台的 jail 狀態撈回來,以及當場封鎖或解開一個位址。

展開的那一台是控制台自己所在的機器:sshd 那個 jail 失敗 14 次、累計 1817 次、來源 3 個檔案,現在封著 10 個位址,累計封過 460 個。整個機隊累計 573,光這一台就佔了 460。對外開著的那一台永遠是被敲最多的,這不是它比較弱,是它比較容易被找到。

17 台裝、32 台總數,不是每一台都裝,因為不是每一台都對外,這很合理。但「哪幾台沒裝」這件事必須看得見,不能靠印象。印象會說「應該都裝了吧」,清單會說是哪 15 台沒有安裝。

總覽只給數字,展開某一台才去拿明細。一開始的版本是全部撈回來,結果畫面上塞了幾百顆位址標籤,要解封的那一個反而找不到。

「有跑、有計數、但是封鎖數 0」不是好消息。門檻如果是連續失敗 5 次就封,對方只要每個位址試 4 次就換下一個,計數會一直跳,封鎖數永遠是零。要看的不是封了幾個,是同一個時間窗裡同一個來源打了幾次;那個數字貼著門檻下緣,代表對方知道你的門檻在哪裡。

自動監控與通知:

https://image01.fishmind.org/cnc/ironman-2026-day14-09.png

通知設定那一頁:檢查間隔 3 分鐘、Telegram 通知已啟用、定時報告 08:00 與 18:00 各一次,旁邊加一個立即發送。

推播的規則全部是為了同一件事,讓它保持可信:只有嚴重跟高會推,推過就標記起來,7 天還沒解決才再推一次,單次掃描最多 10 則。一個會在半夜連續響 40 次的系統,跟一個不會響的系統效果完全一樣 —- 因為你會把它靜音。

早晚各一次的定時報告是另一種東西,它不是告警,是「今天有這些事情還開著」。沒有它,沒有響就等於沒消息,而沒消息不等於沒事 —— 昨天那支只有四分之一字幕的影片,全程也是綠燈。定時報告的功能是把「沒有壞消息」變成一則要主動送出來的消息,這樣一來,連續三天沒收到報告本身就是一個異常。

然後就撞到牆了。Telegram 適合推「現在」:某台掛了、憑證剩三天、磁碟滿了。但有一整類東西它裝不下:每天早上那份清單、每個月的變更紀錄、這需要一個信箱。而且我們不想再靠別人家的信箱:帳號被鎖是別人決定的,信被丟進垃圾桶是別人決定的,自主權在人家手上。

這座機房到今天會看、會聽、會講、會查、會出片,40 台機器誰活著誰死了都問得出來,但還沒辦法送出一封屬於自己的信。

明天,自己收信,也自己寄信 —— 自架 mail server。


本文為 iThome 2026 鐵人賽「一個人的機房」系列第 14 篇,同步發表於 iT 邦幫忙

發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料