升級紀錄 2026年3月21日 4 min read

把閒置 Mac Mini 變成 24/7 自動化伺服器

一台吃灰的 Mac Mini,裝上 n8n + ngrok + Telegram Bot,變成不用管的自動化中樞。從手動啟動到 launchd 開機自跑的完整實作紀錄。

問題

我有一台 Mac Mini 放在店裡,原本只拿來接螢幕放背景音樂。

但最近開始跑 n8n 自動化工作流 — 接 Telegram Bot、處理內容審核、串 webhook — 問題來了:每次斷電重開機,所有東西都要手動重啟

n8n 要下一行很長的指令載入環境變數。ngrok 要開另一個 terminal 連 tunnel。然後還要進 n8n 後台確認 workflow 有沒有 active。

一個人經營的系統,如果需要人盯著才能跑,那它就不是系統。

解法:三個 LaunchAgent

macOS 有內建的 launchd,功能類似 Linux 的 systemd。寫一個 .plist 丟進 ~/Library/LaunchAgents/,就能做到開機自動執行、crash 自動重啟。

我把整個 Mac Mini 自動化拆成三個獨立 agent:

1. n8n — 工作流引擎

com.penstudio.n8n.plist
→ 執行 start-n8n.sh(載入 .env 環境變數 → 啟動 n8n)
→ KeepAlive: true(crash 自動重啟)
→ RunAtLoad: true(開機自跑)

關鍵細節:n8n 需要讀 .env 裡的 TELEGRAM_BOT_TOKENN8N_API_KEY 等變數,所以不能直接寫在 plist 裡(plist 不支援 env 指令)。解法是包一層 shell script,用 export 逐行載入。

2. ngrok — 固定 tunnel

com.penstudio.ngrok.plist
→ ngrok http 5678 --domain <fixed-domain>
→ KeepAlive: true
→ RunAtLoad: true

ngrok 免費方案每次重連會換 URL,但我用 ngrok 的 static domain 功能鎖定一個固定網址。Telegram webhook 設一次就不用改了。

3. Workflow Activator — 開機後自動啟動工作流

這是最容易被忽略的一步:n8n 啟動後,裡面的 workflow 不一定是 active 狀態

com.penstudio.n8n-activate.plist
→ 執行 activate-workflow.sh
→ 等 n8n healthz 回應後,用 API PATCH 啟動指定 workflow
→ RunAtLoad: true(一次性,不 KeepAlive)

腳本邏輯:每 2 秒 ping localhost:5678/healthz,收到 200 就打 API 把 penso-telegram-review-bot 這個 workflow 設為 active。

安全

自動化伺服器 24/7 跑在店裡的網路上,安全不能馬虎:

  • .env 檔案權限 600(只有 owner 能讀)
  • Shell script 權限 700
  • Log 檔案預建為 600
  • n8n 有 email 登入保護
  • ngrok tunnel 只暴露 5678 port

敏感資訊全部鎖在 ~/.n8n/.env,不進 git、不進 iCloud、不出現在 plist 裡。

結果

重開機測試:

  1. Mac Mini 開機
  2. n8n 6 秒內啟動完成
  3. ngrok tunnel 自動連上固定網址
  4. Activator 確認 n8n ready 後,自動啟動 Telegram Bot workflow
  5. 在 Telegram 發訊息給 @PenCCBot — 即時回覆

從開機到 Bot 可用:約 10 秒。不需要開 Terminal、不需要人在場。

學到的事

  1. plist 不能直接用 env 或 source:環境變數必須包在 shell script 裡,或用 EnvironmentVariables dict(但那樣密碼會明文寫在 plist 裡,不好)。

  2. n8n workflow 不會自動 active:啟動 n8n 不等於啟動 workflow。需要額外的 API call 或 --activate flag。

  3. ngrok 免費方案能鎖固定 domain:這個功能藏在 dashboard 裡,省掉了每次重連後更新 webhook URL 的麻煩。

  4. 三個 agent 比一個大 script 好:各自獨立、各自重啟、各自有 log。n8n crash 不影響 ngrok,ngrok 斷線不影響 n8n。

下一步

這台 Mac Mini 現在是一台安靜的自動化伺服器。下一步是讓它能做更多事:

  • 接 Claude Code dispatch — Telegram 傳指令,Mac Mini 自動執行
  • n8n workflow 擴展 — approve 打 API 自動發布文章
  • 監控機制 — 如果 n8n 連續 crash,Telegram 通知我

一人公司最重要的基礎設施不是程式碼,是不需要你在場也能跑的系統

More logs are being generated from the Penso-OS source of truth.

Back to logs