Linux 伺服器

Uptime Kuma 搭建網站與伺服器監控:Docker 安裝、Nginx HTTPS 反向代理與 Telegram 告警

7 個步驟 8 分鐘閱讀 72 次閱讀 0
本文目錄

從客戶口中才得知網站已經宕機一小時,是最糟糕的故障發現方式。Uptime Kuma 是一款免費、可自建的監控工具,可以每隔幾秒到幾分鐘檢查一次網站、埠、Ping 和 DNS,在 SSL 證書到期前提醒你,釋出狀態頁,並通過 Telegram、郵件等數十種渠道傳送告警。本文介紹如何用 Docker 安裝 Uptime Kuma、通過 Nginx 配置 HTTPS 訪問,以及設定 Telegram 通知。

監控程式要部署在與被監控伺服器不同的伺服器上,最好位於不同地區。如果監控程式和被監控的機器或網路一起宕機,就不會有任何人收到通知。在另一個 IMIDC 機房部署一台小型 VPS(例如用香港監控東京)就足夠了。

步驟 1:安裝 Docker

按照 Docker 安裝教程安裝 Docker 和 Docker Compose。Uptime Kuma 的資源佔用很低:1 核 CPU、512 MB 至 1 GB 記憶體就足以執行幾百個監控項。

步驟 2:啟動 Uptime Kuma

Web 介面監聽 3001 埠。將其繫結到 127.0.0.1,可以在前面配置好 Nginx 和 HTTPS 之前,不讓它暴露在公網上。

docker run -d --name uptime-kuma --restart=always \
  -p 127.0.0.1:3001:3001 \
  -v uptime-kuma:/app/data \
  louislam/uptime-kuma:1

docker ps --filter name=uptime-kuma
curl -I http://127.0.0.1:3001

:1 標籤對應長期維護的穩定版本線。升級到新的大版本前,請先檢視專案在 GitHub 上的釋出說明,因為大版本升級可能會遷移資料庫。

步驟 3:通過 Nginx 釋出為 HTTPS 訪問

將 status.example.com 這樣的子域名解析到監控伺服器,申請證書(參見使用 Certbot 或 acme.sh 申請免費 SSL 證書),然後反向代理到容器。Uptime Kuma 使用 WebSocket,因此必須設定 Upgrade 相關請求頭。

server {
    listen 443 ssl;
    http2 on;
    server_name status.example.com;

    ssl_certificate     /etc/letsencrypt/live/status.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/status.example.com/privkey.pem;

    location / {
        proxy_pass         http://127.0.0.1:3001;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}
nginx -t && systemctl reload nginx

開啟 https://status.example.com 並立即建立管理員帳號;第一個訪問初始化頁面的人會成為管理員。

步驟 4:新增監控項

  • HTTP(s):檢查 URL 及其狀態碼。使用 HTTP(s) - Keyword 還能確認頁面中包含指定關鍵詞,從而發現那些仍然返回 200 狀態碼的錯誤頁面。
  • TCP 埠(TCP Port):檢查服務能否正常建立連線,例如 22 埠的 SSH、3389 埠的 RDP 或 3306 埠的 MySQL。
  • Ping:基本的連通性檢查。部分網路會丟棄 ICMP 包,因此重要伺服器建議優先使用 TCP 檢查。
  • DNS:確認某條記錄仍然解析為預期的值。

檢查間隔設為 60 秒、重試 2 到 3 次是比較均衡的設定:真正的故障幾分鐘內就會報告,偶爾丟一個包也不會把你半夜吵醒。在 HTTP 監控項中開啟 Certificate Expiry Notification,即可在 SSL 證書到期前收到提醒。

步驟 5:傳送告警到 Telegram

先建立一個機器人(bot),並獲取接收告警的聊天 ID(chat ID)。

# 1. In Telegram, talk to @BotFather, send /newbot and copy the token
# 2. Send any message to your new bot (or add it to a group and post there)
# 3. Read the chat ID from the bot's updates
curl -s "https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates" | grep -o '"chat":{"id":-\?[0-9]*'

在 Uptime Kuma 中開啟 Settings → Notifications → Setup Notification,選擇 Telegram,貼上機器人 token 和 chat ID,點選 Test 進行測試,然後勾選 Default enabled 和 Apply on all existing monitors。群組的 chat ID 以負號開頭。

步驟 6:建立狀態頁

在 Status Pages 中可以釋出一個公開頁面,展示所選監控項的狀態,方便客戶和你自己的團隊檢視。狀態頁可以使用獨立域名,計劃維護期間還可以釋出維護公告。

步驟 7:備份與更新

# Back up the data volume (monitors, history, settings)
docker run --rm -v uptime-kuma:/data -v "$PWD":/backup alpine \
  tar czf /backup/uptime-kuma-$(date +%F).tgz -C /data .

# Update to the latest release of the same major version
docker pull louislam/uptime-kuma:1
docker rm -f uptime-kuma
docker run -d --name uptime-kuma --restart=always \
  -p 127.0.0.1:3001:3001 -v uptime-kuma:/app/data louislam/uptime-kuma:1

常見問題

經常因為短暫抖動收到告警,但其實並沒有宕機?

將重試次數調到 3 次,重試間隔設為 30 到 60 秒。這樣只有連續多次檢查失敗後,監控項才會被標記為宕機。

Ping 一直失敗,但網站可以正常訪問?

伺服器或其防火牆丟棄了 ICMP 包。請改用 TCP 埠或 HTTP 監控。

能否監控網站在中國大陸的訪問情況?

Uptime Kuma 測量的是從它所在位置訪問的情況。如需瞭解中國大陸使用者的訪問體驗,可以在回國線路優質的伺服器(例如香港 CN2 GIA 伺服器)上再執行一個例項,或者使用網路測試工具從多個地點進行測試。

如果按以上步驟操作後問題仍未解決,請提交工單聯絡 IMIDC 7×24 技術支援,並附上伺服器 IP、系統版本、執行過的命令和完整報錯資訊,方便工程師快速定位。

這篇文章有幫助嗎?

相關教程