AI

障害ページ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"

機能比較表

比較項目UpptimeCachetGatus
ライセンスMITBSD-3Apache-2.0
サーバー不要✅(GitHub Actions)
カスタムドメイン
インシデント管理GitHub Issues✅ 高機能
メトリクス表示
JSONレスポンス検証
サブスクライバー通知
API
最小RAM0MB(GitHub)512MB50MB
GitHub Stars14k+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検証・APIGatus
Slack通知重視Gatus

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。