跳至主要內容
技術

監控與維運:睡覺時產品也在跑

監控與維運:睡覺時產品也在跑
一個人做產品 第 11 / 18 篇

本篇是「一個人做產品」系列的第 11 / 18 篇。你可以從系列總覽開始閱讀,也可以直接接著看本文。

凌晨四點的維運噩夢

你正在做一個很好的夢,手機突然震動。

不是鬧鐘。是一封信:「您的網站 bobo-example.com 已經連續無回應 15 分鐘。」

你從床上跳起來,打開筆電,一邊揉眼睛一邊 SSH 進 server。查了 20 分鐘,發現是資料庫連線數爆了。重啟服務、清理連線、確認恢復正常。回到床上已經凌晨五點,六點半又要起床上班。

如果你做產品做得夠久,這種故事你一定經歷過。

好消息是:2026 年,一個人的維運不需要這麼痛苦。你需要的是一套最小化但有效的監控系統,加上自動化的故障恢復機制。讓產品出問題時,它先自己試著修自己,真的修不好再叫你。

監控金字塔:先搞對優先順序

大公司的監控系統動輒幾十個 dashboard、上百條 alert rule。你不需要那些。

一個人做產品,監控有四個層級,按優先順序排列:

         ┌─────────┐
         │ 商業指標 │  ← 每週看一次就好
         ├─────────┤
         │ 效能指標 │  ← 有空再看
         ├─────────┤
         │ 錯誤追蹤 │  ← 每天掃一眼
         ├─────────┤
         │ 可用性   │  ← 最重要,必須自動告警
         └─────────┘

層級 1:可用性監控(必做)

你的網站活著嗎? 這是最基本也是最重要的問題。

工具免費方案
UptimeRobot50 個監控點
Better Stack10 個監控點
Cloudflare Health ChecksPro 方案起(付費);Free 方案僅有 Passive Origin Monitoring

我自己的 bobo-blog 就是用 UptimeRobot,免費 50 個監控點對個人專案綽綽有餘。如果你已經在 Cloudflare 生態系裡,Health Checks 也是現成的選項。

設定方式很簡單:

  1. 註冊 UptimeRobot(免費)
  2. 新增你的網站 URL 和 API 健康檢查端點
  3. 設定告警通知:email + Slack(或 Telegram)
  4. 設定檢查頻率:每 5 分鐘

五分鐘設定完,你的網站掛了你就會知道。這是投資報酬率最高的五分鐘。

層級 2:錯誤追蹤(強烈建議)

網站活著,不代表沒有錯誤。用戶可能遇到 500 error、JavaScript crash、API timeout,但因為其他功能正常所以你不知道。

Sentry 是 Solo Builder 的最佳選擇:

  • 免費方案:每月 5,000 筆錯誤事件,夠用
  • 支援幾乎所有語言和框架
  • 自動分組重複的錯誤
  • 附上完整的 stack trace 和用戶環境資訊
// Astro 專案整合 Sentry,一行搞定
import * as Sentry from '@sentry/astro';

Sentry.init({
  dsn: 'https://xxx@sentry.io/yyy',
  tracesSampleRate: 0.1, // 只取樣 10%,省額度
});

傳統做法 vs. AI 加持做法

傳統做法:

  1. 收到 Sentry 告警
  2. 打開 Sentry dashboard 看 stack trace
  3. 花 30 分鐘讀 log、找問題
  4. 花 30 分鐘寫修復
  5. 部署、驗證

AI 加持做法:

  1. 收到 Sentry 告警
  2. 把 error 訊息和 stack trace 丟給 Claude Code
  3. AI 直接在你的 codebase 裡找到問題根因
  4. AI 提出修復方案,你 review 後 approve
  5. CI/CD 自動部署

同一個 bug,從一小時變成十五分鐘。

而且 Claude Code 可以做得更進階——設定一個 Sentry webhook,錯誤發生時自動觸發 AI 分析:

你是一個 on-call SRE。以下是一個 production error:

Error: Connection pool exhausted
Stack trace: [完整 stack trace]
頻率: 過去 10 分鐘發生 47 次
影響範圍: /api/courses 端點

請分析:
1. 最可能的根本原因
2. 立即的緩解措施(不需要改 code 的)
3. 長期修復方案
4. 這個問題是否需要立即修復,還是可以等到明天

層級 3:效能監控(有空再做)

效能問題通常不會讓產品掛掉,但會慢慢侵蝕用戶體驗。

好消息是:如果你的產品部署在 Cloudflare Workers 或 Vercel,你已經有了免費的效能數據。

  • Cloudflare Analytics:request count、response time、error rate、bandwidth
  • Vercel Analytics:Web Vitals(LCP、INP、CLS)
  • Google Search Console:Core Web Vitals(SEO 相關)

這些數據不需要每天看。每週花 10 分鐘掃一眼趨勢就好。 重點是看「有沒有突然變差」,而不是追求每一個毫秒的優化。

層級 4:商業指標(每週看一次)

這不是傳統意義上的「監控」,但對 Solo Builder 來說一樣重要:

  • 每日活躍用戶數
  • 新增註冊數
  • 付費轉換率
  • 流失率

這些指標告訴你產品的健康狀況——不是技術健康,而是商業健康。

用一個簡單的 Google Sheet 或 Notion database 就夠了。不需要花時間建 dashboard。

告警設計:少即是多

監控最常犯的錯是告警太多

如果你每天收到 20 封告警信,你會開始忽略它們。然後真正重要的告警出現時,你也會忽略。

告警的黃金法則

只在「需要你做某件事」的時候才告警。

情境要不要告警原因
網站掛了✅ 告警需要你處理
5xx 錯誤率超過 5%✅ 告警需要你檢查
回應時間超過 3 秒❌ 不告警記錄就好,不緊急
磁碟空間超過 80%✅ 告警需要你清理,但不急
每日用戶數下降 10%❌ 不告警每週 review 時看就好
SSL 憑證即將過期✅ 告警需要你處理(或設定自動更新)
CPU 使用率偶爾 spike❌ 不告警正常現象

告警通知管道

通知管道大概就 Email、Slack/Discord、Telegram Bot、SMS/電話這幾種。Email 適合當所有告警的備份,建議必開;Slack 或 Discord 適合非緊急但需要注意的事,開一個 #alerts 頻道就好;Telegram Bot 手機通知即時,隨時隨地都收得到;SMS 或電話留給網站掛掉這種極度緊急的狀況,只在深夜啟用。

我的設定是:所有告警走 Telegram Bot,只有「網站完全掛掉超過 10 分鐘」才觸發 SMS。

這樣白天我在上班時,Telegram 通知會靜靜地出現在手機上,我空閒時看一下就好。但半夜網站掛了,SMS 會叫醒我。

Self-Healing:讓產品自己修自己

最理想的狀態是:問題發生了,但你根本不需要知道,因為系統自己修好了。

這不是科幻小說。以下是幾個實用的 self-healing 模式:

模式 1:Health Check + 自動重啟

大部分雲端平台都支援 health check:

Cloudflare Workers:Workers 本身是 serverless,不需要重啟;若使用 Durable Objects,可設定 alarm 作為重啟機制。

Cloud Run:設定 liveness probe,不健康時自動重啟 instance:

{
  "livenessProbe": {
    "httpGet": { "path": "/health" },
    "initialDelaySeconds": 10,
    "periodSeconds": 30,
  },
}

模式 2:部署失敗自動 Rollback

# GitHub Actions - 部署後驗證,失敗就回滾
- name: Deploy
  run: wrangler deploy

- name: Health check
  run: |
    sleep 10
    STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://your-site.com/health)
    if [ "$STATUS" != "200" ]; then
      echo "Health check failed! Rolling back..."
      wrangler rollback --message "CI auto-rollback: health check failed"
      exit 1
    fi

模式 3:Circuit Breaker

當外部服務(第三方 API、資料庫)出問題時,不要無限重試,而是快速失敗並降級:

// 簡單的 circuit breaker
class CircuitBreaker {
  private failures = 0;
  private lastFailTime = 0;
  private readonly threshold = 5;
  private readonly resetTimeout = 60_000; // 1 分鐘

  async call<T>(fn: () => Promise<T>, fallback: T): Promise<T> {
    if (this.failures >= this.threshold) {
      if (Date.now() - this.lastFailTime < this.resetTimeout) {
        return fallback; // 降級回應
      }
      this.failures = 0; // 嘗試恢復
    }
    try {
      const result = await fn();
      this.failures = 0;
      return result;
    } catch {
      this.failures++;
      this.lastFailTime = Date.now();
      return fallback;
    }
  }
}

這段 code 的意思是:如果某個外部服務連續失敗 5 次,就暫時放棄呼叫它,改用降級方案(例如快取的舊資料)。一分鐘後再試試看有沒有恢復。

用戶不會看到錯誤頁面,你也不會被半夜叫起來。

AI 輔助故障診斷

當問題真的需要你介入時,AI 是你最好的 on-call 夥伴。

用 Claude Code 診斷問題

凌晨被叫起來的時候,你的腦袋是不清楚的。這時候讓 AI 幫你思考:

我的產品在凌晨 3:47 開始出現以下錯誤:

[貼上錯誤訊息和 log]

環境:
- Cloudflare Workers
- D1 資料庫
- 最近一次部署是昨天下午 3 點

請幫我:
1. 分析最可能的原因(按可能性排序)
2. 每個可能原因的驗證方式
3. 建議的修復步驟
4. 判斷這是否需要立即修復,還是可以等到早上

關鍵是最後一點:判斷要不要現在處理。 很多時候,半夜的問題其實沒那麼緊急——某個非核心功能出錯、某個 edge case 才會觸發的 bug。AI 可以幫你冷靜判斷。

備份策略:你一定會感謝自己的

備份是最無聊的主題,但也是最重要的。

備份的唯一規則

如果你沒有驗證過 restore,就等於沒有備份。

我見過太多人設定了自動備份,安心地跑了一年,等到真的需要 restore 時才發現備份檔案是壞的。

Solo Builder 的最小備份清單

備份對象工具頻率驗證頻率
資料庫D1 自動備份 / Cloud SQL 自動備份每日每月測試 restore
程式碼Git(GitHub/GitLab)每次 commitN/A(Git 就是版本控制)
設定檔Infrastructure as Code(wrangler.jsonc)隨程式碼一起每次部署就是驗證
用戶上傳檔案R2 / Cloud Storage + 跨區複製即時每季抽檢
環境變數和密鑰1Password / Bitwarden有變更時每季確認

自動化備份驗證

用 AI 幫你寫一個簡單的備份驗證腳本:

請幫我寫一個 shell script:

1. 從 D1 備份中 restore 到一個測試 database
2. 執行幾個基本查詢,確認資料完整
3. 比較備份資料的 row count 和 production 的 row count
4. 結果寄到我的 email
5. 刪除測試 database

這個 script 會用 cron 每月跑一次。

休假測試:你的產品能自己活兩週嗎?

這是我用來衡量維運成熟度的測試:

如果你完全消失兩週——不看 email、不登入 server、不部署任何東西——你的產品還能正常運行嗎?

如果答案是「不確定」,你需要補強以下幾個環節:

休假前的 checklist

  • 自動備份有在跑,且最近一次 restore 測試通過
  • 監控告警設定好,會通知到手機
  • SSL 憑證不會在你休假期間過期
  • 沒有需要手動續約的服務(網域、雲端帳單)
  • 客服 auto-reply 已更新,告知回覆會延遲
  • CI/CD pipeline 不需要手動 approve
  • 資料庫不會在兩週內把空間用完
  • 帳單設定了自動扣款

如果你能自信地在每一項打勾,恭喜——你建立了一個真正自動化的產品。

Runbook:寫給未來的你

最後一個建議:把你的維運步驟寫下來。

Runbook 是一份「出了某某問題,按照這些步驟處理」的文件。

你可能覺得「我自己的東西我當然記得怎麼處理」。但相信我,凌晨四點被叫起來的你,和白天清醒的你,是兩個完全不同的人。

AI 幫你寫 Runbook

以下是我的產品架構:
- 前端:Astro,部署在 Cloudflare Pages
- API:Cloudflare Workers
- 資料庫:D1
- 檔案儲存:R2

請幫我建立一份 Runbook,涵蓋以下常見情境:

1. 網站完全無法存取
2. API 回應時間異常
3. 資料庫連線錯誤
4. 部署失敗
5. SSL 憑證問題

每個情境包含:
- 確認問題的步驟
- 排查清單(按可能性排序)
- 修復步驟
- 修復後的驗證方式

把 Runbook 放在你的 repo 裡(例如 docs/runbook.md)。這樣你在半夜打開終端機時,第一件事不是亂猜問題在哪,而是打開 Runbook 按步驟走。

更好的做法是:把 Runbook 也餵給 AI。 當問題發生時,你可以跟 AI 說「參考我們的 Runbook,幫我排查這個問題」,讓 AI 幫你走流程。

真實案例:bobo-blog 的監控架構

我的部落格 bobo-blog 部署在 Cloudflare Workers 上。以下是我的監控設定,給你參考:

層級工具設定
可用性UptimeRobot每 5 分鐘 ping 首頁和 /health
錯誤Cloudflare Workers Analytics監控 4xx/5xx 比例
效能Cloudflare Analytics每週看 P95 回應時間
部署GitHub Actions部署後自動跑 health check

為什麼這麼簡單?因為 Cloudflare Workers 是 serverless——我不需要管 server、不需要監控 CPU 或記憶體、不需要擔心 process crash。平台幫我處理了大部分的維運問題。

這就是 第 6 章:選對平台省 80% 的事 的延伸——選對基礎架構,你的維運負擔會大幅降低。

本章重點回顧

  • 🏗️ 監控四層金字塔:可用性 > 錯誤追蹤 > 效能 > 商業指標,按優先順序建立
  • 🔔 告警的黃金法則:只在「需要你做某件事」時才告警,否則你會開始忽略告警
  • 🔧 Self-healing 模式:health check + 自動重啟、部署失敗自動 rollback、circuit breaker
  • 🤖 AI 是你最好的 on-call 夥伴——半夜被叫起來時,讓 AI 幫你冷靜判斷和排查
  • 💾 備份的唯一規則:沒有驗證過 restore 就等於沒有備份
  • 📋 寫 Runbook,寫給凌晨四點腦袋不清楚的自己
  • 🏖️ 「休假測試」:如果你消失兩週,產品還能活嗎?

下一步

到這裡,你的產品已經穩定運行了——有用戶在用、有客服在處理問題、有監控在守護。

接下來的問題是:這個 side project,值不值得更認真?

如果你開始有穩定的用戶、甚至有人付費了,你可能會想:「我是不是應該把這個東西做大?要怎麼定價?什麼時候該考慮離職全職做?」

下一章,我們來聊從 side project 到 Micro SaaS 的轉變——這是每個 Solo Builder 遲早會面對的抉擇。

👉 第 12 章:從 Side Project 到 Micro SaaS

留言討論

esc
輸入關鍵字搜尋文章...
查看收藏 →