問題
我有一台 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_TOKEN、N8N_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 裡。
結果
重開機測試:
- Mac Mini 開機
- n8n 6 秒內啟動完成
- ngrok tunnel 自動連上固定網址
- Activator 確認 n8n ready 後,自動啟動 Telegram Bot workflow
- 在 Telegram 發訊息給 @PenCCBot — 即時回覆
從開機到 Bot 可用:約 10 秒。不需要開 Terminal、不需要人在場。
學到的事
-
plist 不能直接用
env或 source:環境變數必須包在 shell script 裡,或用EnvironmentVariablesdict(但那樣密碼會明文寫在 plist 裡,不好)。 -
n8n workflow 不會自動 active:啟動 n8n 不等於啟動 workflow。需要額外的 API call 或
--activateflag。 -
ngrok 免費方案能鎖固定 domain:這個功能藏在 dashboard 裡,省掉了每次重連後更新 webhook URL 的麻煩。
-
三個 agent 比一個大 script 好:各自獨立、各自重啟、各自有 log。n8n crash 不影響 ngrok,ngrok 斷線不影響 n8n。
下一步
這台 Mac Mini 現在是一台安靜的自動化伺服器。下一步是讓它能做更多事:
- 接 Claude Code dispatch — Telegram 傳指令,Mac Mini 自動執行
- n8n workflow 擴展 — approve 打 API 自動發布文章
- 監控機制 — 如果 n8n 連續 crash,Telegram 通知我
一人公司最重要的基礎設施不是程式碼,是不需要你在場也能跑的系統。