サイトが 1 時間ダウンしていたことを顧客からの連絡で知るのは、障害の気付き方として最悪です。Uptime Kuma は無料のセルフホスト型監視ツールで、Web サイト、ポート、Ping、DNS を数秒~数分間隔でチェックし、SSL 証明書の期限が切れる前に警告し、ステータスページを公開し、Telegram やメールをはじめ数十種類のチャネルにアラートを送信できます。この記事では、Docker でインストールし、Nginx 経由で HTTPS 化して、Telegram 通知を設定するまでを解説します。
Docker インストールガイドの手順に従って Docker と Docker Compose をインストールします。Uptime Kuma の要件はごくわずかで、数百件程度の監視なら CPU 1 コアと 512 MB~1 GB のメモリで十分です。
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 リリースを確認してください。
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 を開き、すぐに管理者アカウントを作成してください。セットアップページに最初にアクセスした人が管理者になります。
チェック間隔 60 秒、リトライ 2~3 回がちょうどよいバランスです。実際の障害は数分以内に通知され、パケットが 1 つ失われた程度で夜中に起こされることはありません。HTTP の監視では Certificate Expiry Notification を有効にすると、SSL 証明書の期限が切れる前に警告を受け取れます。
ボットを作成し、アラートの送信先となるチャット 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 はマイナス記号で始まります。
Status Pages では、選択した監視項目の状態を表示する公開ページを作成できます。顧客向けにも社内チーム向けにも便利です。独自のドメインで公開したり、計画メンテナンスの際にお知らせを掲載したりすることもできます。
# 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 秒に増やしてください。これで、連続して何度か失敗した場合にのみダウンと判定されるようになります。
サーバーまたはそのファイアウォールが ICMP を破棄しています。代わりに TCP Port や HTTP の監視を使ってください。
Uptime Kuma は、自身が動作している場所から測定します。中国からのアクセス状況を把握するには、香港 CN2 GIA サーバーなど中国向けの回線品質が良いサーバーで 2 つ目のインスタンスを運用するか、複数の拠点からネットワークテストツールを使ってください。
上記の手順で解決しない場合は、サポートチケットを送信して IMIDC の 24 時間 365 日対応テクニカルサポートへご連絡ください。サーバー IP、OS バージョン、実行したコマンド、エラー全文を添えていただくと、より迅速に調査できます。