障害ページOSS比較:Upptime vs Cachet vs Gatus でサービス稼働状況を公開
オープンソースラボ編集部 ・ 2026年6月13日
障害ページOSS比較:Upptime vs Cachet vs Gatus でサービス稼働状況を公開
サービスダウン時にユーザーへの説明が遅れると、SNSへの苦情・サポート問い合わせ急増・信頼失墜につながります。Upptime(GitHub Actions駆動・ゼロサーバー)・Cachet(Laravel製・高カスタマイズ)・Gatus(Go製・高速)はオープンソースのステータスページツールで、外形監視・インシデント管理・Slack通知まで自前で構築できます。
ステータスページツールの選定理由
- 信頼性向上: Atlassian Statuspageは月$29〜。自社ドメインで無料公開したい
- 自動外形監視: 定期的にHTTPリクエストを投げてレスポンスタイムとステータスコードを記録したい
- インシデント管理: 障害発生時の状況報告・復旧進捗をリアルタイム更新したい
- Slack/メール通知: ダウン検知時に即座にチームとユーザーに通知したい
- SLA追跡: 月次の稼働率(99.9%等)を自動計算して公開したい
主要ツールの概要
Upptime
GitHubリポジトリとGitHub Actionsだけで動くゼロインフラのステータスページです。GitHubスター14k+。サーバー不要・DBなし・無料。GitHub Actionsが5分ごとにエンドポイントを監視し、ダウン時はIssueを自動作成、GitHub Pagesで稼働状況を公開します。
# .upptime/config.yml(最小構成)
owner: your-github-username
repo: status-page
sites:
- name: メインサイト
url: https://yoursite.com
- name: API
url: https://api.yoursite.com/health
expectedResponseBody: '"status":"ok"'
- name: 管理画面
url: https://admin.yoursite.com
method: GET
expectedStatusCode: 200
status-website:
cname: status.yoursite.com # カスタムドメイン設定
name: Your Service Status
description: リアルタイムのサービス稼働状況
notifications:
- type: slack
webhook_url: $SLACK_WEBHOOK_URL
- type: email
to: team@yoursite.com
from: status@yoursite.com
transport:
service: sendgrid
apiKey: $SENDGRID_API_KEY
# Upptimeのセットアップ(GitHub CLIを使用)
# 1. テンプレートからリポジトリを作成
gh repo create your-org/status-page --template upptime/upptime --public
# 2. Secrets を設定(GH_PATは repo + workflow スコープが必要)
gh secret set GH_PAT --body "ghp_your_token"
gh secret set SLACK_WEBHOOK_URL --body "https://hooks.slack.com/..."
# 3. GitHub Actionsが自動起動→5分後に最初の監視が実行される
// Upptime APIでダッシュボードに稼働状況バッジを表示
// app/components/StatusBadge.tsx
export async function StatusBadge() {
const res = await fetch(
"https://raw.githubusercontent.com/your-org/status-page/master/history/summary.json",
{ next: { revalidate: 300 } } // 5分キャッシュ
);
const summary = await res.json();
const allUp = summary.every((site: { status: string }) => site.status === "up");
return (
<a href="https://status.yoursite.com" className="flex items-center gap-2">
<span className={`w-2 h-2 rounded-full ${allUp ? "bg-green-500" : "bg-red-500"}`} />
<span>{allUp ? "全システム正常稼働" : "一部障害発生中"}</span>
</a>
);
}
Cachet
PHP(Laravel)製の高機能ステータスページです。GitHubスター13k+。コンポーネント管理・インシデントレポート・メトリクス表示・サブスクライバーへのメール通知に対応。Statuspageに最も近い機能セットを持ちます。
# Cachetをdocker-composeで起動
version: "3"
services:
cachet:
image: cachethq/docker:latest
ports:
- "8000:8000"
environment:
DB_DRIVER: pgsql
DB_HOST: postgres
DB_DATABASE: cachet
DB_USERNAME: cachet
DB_PASSWORD: cachet_pass
APP_KEY: "base64:your-32-char-secret-key-here"
APP_URL: https://status.yoursite.com
CACHE_DRIVER: redis
SESSION_DRIVER: redis
QUEUE_DRIVER: redis
REDIS_HOST: redis
MAIL_DRIVER: smtp
MAIL_HOST: smtp.sendgrid.net
MAIL_PORT: 587
MAIL_USERNAME: apikey
MAIL_PASSWORD: your-sendgrid-key
depends_on:
- postgres
- redis
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: cachet
POSTGRES_USER: cachet
POSTGRES_PASSWORD: cachet_pass
volumes:
- cachet_db:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
cachet_db:
# Cachet APIを使ってインシデントを自動作成(GitHub Actionsから)
# .github/workflows/incident.yml
name: Report Incident
on:
workflow_dispatch:
inputs:
name:
description: インシデント名
required: true
message:
description: 状況説明
required: true
jobs:
create-incident:
runs-on: ubuntu-latest
steps:
- name: Create incident via Cachet API
run: |
curl -X POST https://status.yoursite.com/api/v1/incidents -H "X-Cachet-Token: ${{ secrets.CACHET_API_TOKEN }}" -H "Content-Type: application/json" -d '{
"name": "${{ github.event.inputs.name }}",
"message": "${{ github.event.inputs.message }}",
"status": 2,
"visible": 1,
"component_id": 1,
"component_status": 2
}'
Gatus
Go製の軽量サービス監視ツールです。GitHubスター6.5k+。YAML設定で複数エンドポイントの監視条件(ステータスコード・レスポンスタイム・JSONレスポンス内容)を細かく定義でき、ダッシュボードを自動生成します。APIもあるためNext.jsのサイトに稼働状況を埋め込み可能です。
# Gatusをdocker-composeで起動
version: "3"
services:
gatus:
image: twinproduction/gatus:latest
ports:
- "8080:8080"
volumes:
- ./gatus-config.yaml:/config/config.yaml
environment:
SLACK_WEBHOOK_URL: https://hooks.slack.com/services/xxx
# gatus-config.yaml
web:
port: 8080
storage:
type: postgres
path: postgresql://gatus:gatus_pass@postgres:5432/gatus
alerting:
slack:
webhook-url: "${SLACK_WEBHOOK_URL}"
default-alert:
enabled: true
failure-threshold: 3
success-threshold: 2
description: "Healthcheck failed"
endpoints:
- name: メインサイト
url: https://yoursite.com
interval: 1m
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 500" # 500ms以下
alerts:
- type: slack
- name: API Health
url: https://api.yoursite.com/health
interval: 30s
conditions:
- "[STATUS] == 200"
- "[BODY].status == ok" # JSONレスポンスのチェック
- "[RESPONSE_TIME] < 200"
alerts:
- type: slack
- name: Supabase Database
url: https://ucceyqlkrzojulwyryia.supabase.co/rest/v1/articles?limit=1
interval: 5m
method: GET
headers:
apikey: your-anon-key
Authorization: Bearer your-anon-key
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 1000"
機能比較表
| 比較項目 | Upptime | Cachet | Gatus |
|---|---|---|---|
| ライセンス | MIT | BSD-3 | Apache-2.0 |
| サーバー不要 | ✅(GitHub Actions) | ❌ | ❌ |
| カスタムドメイン | ✅ | ✅ | ✅ |
| インシデント管理 | GitHub Issues | ✅ 高機能 | ❌ |
| メトリクス表示 | ❌ | ✅ | ✅ |
| JSONレスポンス検証 | ❌ | ❌ | ✅ |
| サブスクライバー通知 | ❌ | ✅ | ❌ |
| API | ❌ | ✅ | ✅ |
| 最小RAM | 0MB(GitHub) | 512MB | 50MB |
| GitHub Stars | 14k+ | 13k+ | 6.5k+ |
Gatusの外形監視と連携するエラー通知のセットアップはdevopsカテゴリ(/categories/devops)でまとめています。ステータスページのデプロイ先としてのVercel活用はlow-codeカテゴリ(/categories/low-code)も参照してください。
FAQ
Q. Upptimeの監視頻度はGitHub Actionsの無料枠に影響しますか?
A. はい、影響します。デフォルトの5分間隔で監視する場合: 1ヶ月あたり約8,640回のワークフロー実行になります。GitHub Actionsの無料枠は月2,000分(パブリックリポジトリは無制限)。Upptimeのワークフローは通常1回あたり1〜2分かかるため、プライベートリポジトリでは月8,640〜17,280分を消費します(無料枠を大幅に超える)。対策: ①リポジトリをPublicにする(GitHub Actionsが無制限)②監視間隔を10分に変更(schedule: "*/10 * * * *")③GitHub Pro ($4/月) では月3,000分に増加。パブリックリポジトリで運用するのが最もコスト効率が良い方法です。
Q. Cachetで複数コンポーネント(APIサーバー・DBなど)を管理する方法は?
A. Cachetは「コンポーネント」と「コンポーネントグループ」で管理します。設定手順: ①管理画面→Components→Add Componentで各サービス(APIサーバー・DB・CDNなど)を追加②Component Groupで「バックエンド」「フロントエンド」などグループ化③各コンポーネントのステータスを5段階(Operational・Performance Issues・Partial Outage・Major Outage・Unknown)で設定④Cachet APIを使いCI/CDから自動更新: PUT /api/v1/components/{id} で status を変更。GitHub Actionsのデプロイ後に自動でステータスを更新するワークフローを組むことで、デプロイと連動した稼働状況管理が可能です。
Q. GatusのダッシュボードをNext.jsのサイトに埋め込む方法は?
A. GatusはREST APIを提供しています。APIエンドポイント: GET /api/v1/endpoints/statusesでall statusesを取得。Next.jsへの埋め込み例: fetch("https://gatus.yoursite.com/api/v1/endpoints/statuses", { next: { revalidate: 60 } })で1分キャッシュ付きで取得し、サイトのフッターやサポートページに稼働状況バッジとして表示できます。CORSの設定: Gatusの設定でweb.cors.allow-origins: ["https://yoursite.com"]を追加することでクロスオリジンからのAPIアクセスが許可されます。
Q. ステータスページのURLはどのドメインで公開するのがベストですか?
A. SEOとユーザー体験の観点から推奨: ①status.yoursite.com(サブドメイン方式)が最も一般的でユーザーが直感的に見つけやすい②メインサイトと別のCDN/ホスティング(例: Vercelでメインサイト、GitHub Pagesでステータスページ)に置くことで、メインサイトが落ちてもステータスページを見られる③Cloudflareのプロキシを使いメインドメインのDNSでサブドメインを管理すれば、ステータスページのホスティング先を後から変更しやすい。避けるべき設定: メインサイトと同じサーバーでステータスページを動かす(メインサイトがダウンするとステータスページも見えなくなる)。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| ゼロインフラ・GitHub管理 | Upptime |
| 高機能・インシデント管理 | Cachet |
| 軽量・JSON検証・API | Gatus |
| Slack通知重視 | Gatus |