Linuxサーバー

Uptime Kuma で Web サイトとサーバーを死活監視:Docker での導入、HTTPS リバースプロキシ、Telegram 通知

7 ステップ 9 分で読めます 73 回閲覧 0
目次

サイトが 1 時間ダウンしていたことを顧客からの連絡で知るのは、障害の気付き方として最悪です。Uptime Kuma は無料のセルフホスト型監視ツールで、Web サイト、ポート、Ping、DNS を数秒~数分間隔でチェックし、SSL 証明書の期限が切れる前に警告し、ステータスページを公開し、Telegram やメールをはじめ数十種類のチャネルにアラートを送信できます。この記事では、Docker でインストールし、Nginx 経由で HTTPS 化して、Telegram 通知を設定するまでを解説します。

監視ツールは、監視対象とは別のサーバー、できれば別のリージョンで運用してください。監視ツールが停止したマシンやネットワークと同じ場所にあると、誰にも通知が届きません。IMIDC の別ロケーションにある小規模な VPS(たとえば香港から東京を監視)で十分です。

ステップ1:Docker をインストール

Docker インストールガイドの手順に従って Docker と Docker Compose をインストールします。Uptime Kuma の要件はごくわずかで、数百件程度の監視なら CPU 1 コアと 512 MB~1 GB のメモリで十分です。

ステップ2:Uptime Kuma を起動

Web インターフェースはポート 3001 で待ち受けます。127.0.0.1 にバインドしておけば、HTTPS 対応の Nginx を前段に置くまでインターネットからはアクセスできません。

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 Port:サービスが接続を受け付けるかをチェックします。たとえば SSH の 22 番、RDP の 3389 番、MySQL の 3306 番などです。
  • Ping:基本的な疎通確認です。ICMP を破棄するネットワークもあるため、重要なサーバーには TCP チェックをおすすめします。
  • DNS:レコードが想定どおりの値に解決されることを確認します。

チェック間隔 60 秒、リトライ 2~3 回がちょうどよいバランスです。実際の障害は数分以内に通知され、パケットが 1 つ失われた程度で夜中に起こされることはありません。HTTP の監視では Certificate Expiry Notification を有効にすると、SSL 証明書の期限が切れる前に警告を受け取れます。

ステップ5:Telegram にアラートを送信

ボットを作成し、アラートの送信先となるチャット 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 を選択してボットトークンとチャット ID を貼り付け、Test をクリックしてから Default enabled と Apply on all existing monitors を有効にします。グループのチャット 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 秒に増やしてください。これで、連続して何度か失敗した場合にのみダウンと判定されるようになります。

Web サイトは表示されるのに Ping が常に失敗する

サーバーまたはそのファイアウォールが ICMP を破棄しています。代わりに TCP Port や HTTP の監視を使ってください。

中国本土からのサイトの表示状況を監視できますか?

Uptime Kuma は、自身が動作している場所から測定します。中国からのアクセス状況を把握するには、香港 CN2 GIA サーバーなど中国向けの回線品質が良いサーバーで 2 つ目のインスタンスを運用するか、複数の拠点からネットワークテストツールを使ってください。

上記の手順で解決しない場合は、サポートチケットを送信して IMIDC の 24 時間 365 日対応テクニカルサポートへご連絡ください。サーバー IP、OS バージョン、実行したコマンド、エラー全文を添えていただくと、より迅速に調査できます。

この回答はお役に立ちましたか?

関連チュートリアル