AI

BIダッシュボードOSS比較:Metabase vs Apache Superset vs Redash でデータ可視化をセルフホスト

オープンソースラボ編集部2026年6月13日

BIダッシュボードOSS比較:Metabase vs Apache Superset vs Redash でデータ可視化をセルフホスト

TableauはCreator月$75・LookerはEnterprise月数万円と高額で、データアナリストが増えるほどコストが膨らみます。Metabase(最も使いやすい)・Apache Superset(高機能・SQLファースト)・Redash(シンプル・SQLメイン)はOSSのBIダッシュボードツールで、Supabase・BigQuery・PostgreSQLのデータを美しいチャートでセルフホスト可視化できます。

BIダッシュボードツールの選定理由

  • コスト削減: Tableauは月$75/ユーザー。10人チームで月750ドル。セルフホストで無料化
  • SQLで直接分析: 非エンジニアのビジネスチームがSQLを書かずにデータを探索したい
  • Supabase連携: 既存のSupabaseのPostgreSQLに直接接続してダッシュボードを作りたい
  • 自動レポート: 毎週月曜日にKPIレポートをSlack/メールに自動送信したい
  • 埋め込み: Next.jsアプリ内にチャートを埋め込んでユーザーに分析画面を提供したい

主要ツールの概要

Metabase

最も普及しているOSSのBIツールです。GitHubスター38k+。「ノーコードでデータ探索」を重視した設計で、SQLを知らないビジネスチームでも直感的にグラフを作れます。PostgreSQL・MySQL・BigQuery・Snowflake・MongoDBなど50以上のデータソースに対応。

# MetabaseをDockerで起動(PostgreSQLをメタデータDB・Supabaseをデータソースに使用)
version: "3"

services:
  metabase:
    image: metabase/metabase:latest
    restart: always
    ports:
      - "3000:3000"
    environment:
      MB_DB_TYPE: postgres
      MB_DB_DBNAME: metabase
      MB_DB_PORT: "5432"
      MB_DB_USER: metabase
      MB_DB_PASS: metabase_pass
      MB_DB_HOST: postgres
      MB_SITE_URL: https://data.yoursite.com
      MB_EMAIL_SMTP_HOST: smtp.sendgrid.net
      MB_EMAIL_SMTP_PORT: "587"
      MB_EMAIL_SMTP_USERNAME: apikey
      MB_EMAIL_SMTP_PASSWORD: your-sendgrid-key
      MB_EMAIL_FROM_ADDRESS: reports@yoursite.com
    depends_on:
      - postgres

  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: metabase
      POSTGRES_USER: metabase
      POSTGRES_PASSWORD: metabase_pass
    volumes:
      - metabase_db:/var/lib/postgresql/data

volumes:
  metabase_db:
// Metabase Embedding API でNext.jsにチャートを埋め込む
// app/components/MetabaseChart.tsx
import jwt from "jsonwebtoken";

function generateMetabaseToken(resourceType: "question" | "dashboard", resourceId: number) {
  const METABASE_SECRET_KEY = process.env.METABASE_SECRET_KEY!;

  const payload = {
    resource: { [resourceType]: resourceId },
    params: {},
    exp: Math.round(Date.now() / 1000) + 60 * 10, // 10分間有効
  };

  return jwt.sign(payload, METABASE_SECRET_KEY);
}

// Server Component: チャートのiframe URLを生成
export function MetabaseChart({ questionId }: { questionId: number }) {
  const token = generateMetabaseToken("question", questionId);
  const iframeUrl = `${process.env.METABASE_URL}/embed/question/${token}#bordered=true&titled=true`;

  return (
    <iframe
      src={iframeUrl}
      width="100%"
      height="400"
      allowTransparency={true}
      frameBorder={0}
      style={{ border: "none" }}
    />
  );
}

// ダッシュボードに埋め込む(パラメータ付き)
export function MetabaseDashboard({
  dashboardId,
  userId,
}: {
  dashboardId: number;
  userId: string;
}) {
  const METABASE_SECRET_KEY = process.env.METABASE_SECRET_KEY!;

  const payload = {
    resource: { dashboard: dashboardId },
    params: { user_id: userId },  // フィルタパラメータ
    exp: Math.round(Date.now() / 1000) + 60 * 10,
  };

  const token = jwt.sign(payload, METABASE_SECRET_KEY);
  const iframeUrl = `${process.env.METABASE_URL}/embed/dashboard/${token}`;

  return (
    <iframe src={iframeUrl} width="100%" height="800" frameBorder={0} />
  );
}
-- SupabaseをMetabaseのデータソースとして接続する際の読み取り専用ユーザー作成
-- Supabase SQL Editorで実行

-- 読み取り専用ロールを作成
CREATE ROLE metabase_reader WITH LOGIN PASSWORD 'strong-password-here';

-- publicスキーマの読み取り権限を付与
GRANT USAGE ON SCHEMA public TO metabase_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO metabase_reader;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO metabase_reader;

-- 機密テーブルへのアクセスを制限
REVOKE SELECT ON auth_users FROM metabase_reader;

Apache Superset

Airbnbが開発したSQLファーストの高機能BIプラットフォームです。GitHubスター62k+。40種類以上のビジュアライゼーション・SQLラボ(高機能クエリエディタ)・ダッシュボードフィルター・クロスフィルタリングに対応し、大規模なデータ分析チームでの使用実績が多いです。

# Apache SupersetをDockerで起動
version: "3"

services:
  superset:
    image: apache/superset:latest
    restart: always
    ports:
      - "8080:8088"
    environment:
      SUPERSET_SECRET_KEY: "your-32-char-secret"
      DATABASE_DIALECT: postgresql
      DATABASE_HOST: postgres
      DATABASE_PORT: "5432"
      DATABASE_DB: superset
      DATABASE_USER: superset
      DATABASE_PASSWORD: superset_pass
    depends_on:
      - postgres
      - redis
    command: >
      /bin/sh -c "
        superset db upgrade &&
        superset fab create-admin --username admin --firstname Admin --lastname User --email admin@example.com --password admin &&
        superset init &&
        superset run -h 0.0.0.0 -p 8088 --with-threads --reload
      "

  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: superset
      POSTGRES_USER: superset
      POSTGRES_PASSWORD: superset_pass
    volumes:
      - superset_db:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine

volumes:
  superset_db:
# SupersetのREST APIでダッシュボードを動的に操作
# Python(DagsterやAirflowから呼び出す例)
import requests

SUPERSET_URL = "https://superset.yoursite.com"

# 認証トークンを取得
def get_superset_token():
    res = requests.post(f"{SUPERSET_URL}/api/v1/security/login", json={
        "username": "admin",
        "password": "your-admin-password",
        "provider": "db",
    })
    return res.json()["access_token"]

# チャートのCSVデータをエクスポート
def export_chart_data(chart_id: int, token: str):
    res = requests.get(
        f"{SUPERSET_URL}/api/v1/chart/{chart_id}/data/",
        headers={"Authorization": f"Bearer {token}"},
    )
    return res.json()

# 使用例: データパイプライン完了後にSupersetのキャッシュを更新
token = get_superset_token()
requests.post(
    f"{SUPERSET_URL}/api/v1/chart/warm_up_cache",
    headers={"Authorization": f"Bearer {token}"},
    json={"chart_id": 42},
)

Redash

SQLクエリとビジュアライゼーションに特化したシンプルなBIツールです。GitHubスター26k+。「SQLを書いてグラフにする」という直線的なワークフローで、エンジニアが素早くデータ確認ダッシュボードを作るのに向いています。

# RedashをDockerで起動
version: "3"

services:
  server:
    image: redash/redash:latest
    command: server
    environment:
      REDASH_DATABASE_URL: postgresql://redash:redash_pass@postgres:5432/redash
      REDASH_REDIS_URL: redis://redis:6379/0
      REDASH_SECRET_KEY: "your-secret"
      REDASH_MAIL_SERVER: smtp.sendgrid.net
      REDASH_MAIL_PORT: "587"
      REDASH_MAIL_USE_TLS: "true"
      REDASH_MAIL_USERNAME: apikey
      REDASH_MAIL_PASSWORD: your-sendgrid-key
      REDASH_MAIL_DEFAULT_SENDER: reports@yoursite.com
    ports:
      - "5000:5000"
    depends_on:
      - postgres
      - redis

  scheduler:
    image: redash/redash:latest
    command: scheduler
    environment:
      REDASH_DATABASE_URL: postgresql://redash:redash_pass@postgres:5432/redash
      REDASH_REDIS_URL: redis://redis:6379/0
      REDASH_SECRET_KEY: "your-secret"
    depends_on:
      - postgres
      - redis

  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: redash
      POSTGRES_USER: redash
      POSTGRES_PASSWORD: redash_pass
    volumes:
      - redash_db:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine

volumes:
  redash_db:

機能比較表

比較項目MetabaseApache SupersetRedash
ライセンスAGPL-3.0Apache-2.0BSD-2
ノーコード探索✅ 優秀
SQLラボ✅ 高機能
埋め込み✅ JWT
自動レポート
クロスフィルター
Supabase接続✅ PostgreSQL✅ PostgreSQL✅ PostgreSQL
最小RAM1.5GB2GB1GB
GitHub Stars38k+62k+26k+

BIダッシュボードと連携するデータパイプラインの構築はopen-source-data-pipeline(/categories/devops)を参照。可視化データの元となるログ管理はdevopsカテゴリ(/categories/devops)でまとめています。

FAQ

Q. MetabaseをNext.jsアプリに埋め込む際のセキュリティリスクと対策は?

A. Metabaseの埋め込みはJWTトークンで認証するため、適切に実装すれば安全です。主なリスクと対策: ①トークンの有効期限: JWTのexpは10〜60分に設定。長すぎると漏洩リスク増。②シークレットキーの管理: METABASE_SECRET_KEYは環境変数で管理し、クライアントサイドには絶対に渡さない。Server Componentまたは/api/metabase-tokenルートで生成すること。③パラメータインジェクション: ダッシュボードのロックパラメータをlockedParametersに追加して、ユーザーが他のユーザーのデータを見られないようにする。④iframeのCSP設定: Content-Security-Policyヘッダーでframe-ancestorsを自社ドメインのみに制限。⑤埋め込みを有効化する設定: 管理画面→パブリック共有→埋め込みをONにしないと動かないため、本番環境の設定変更を忘れずに。

Q. Apache Supersetで1億行のデータを可視化するとパフォーマンスはどうなりますか?

A. Supersetはデータを直接クエリするため、パフォーマンスはデータソース側のチューニングに依存します。①ClickHouseを使う: 1億行の集計クエリを秒単位で処理できる列指向DB。Supersetは公式ClickHouseコネクタを提供。②キャッシュ設定: SupersetのCACHE_DEFAULT_TIMEOUTを設定してRedisでクエリ結果をキャッシュ。同じチャートを複数人が開いても1回しかDBにクエリしない。③非同期クエリ: CELERY_RESULT_BACKENDを設定して重いクエリをバックグラウンドで実行し、完了時にUIを更新。④マテリアライズドビュー: PostgreSQLのマテリアライズドビューで事前集計してSupersetからクエリする。Supabaseの場合: DBのshared_preload_librariespg_stat_statementsを追加してスロークエリを特定し、Indexを最適化するのが第一歩です。

Q. RedashはMetabaseと比べてどんなチームに向いていますか?

A. Redashが向いているチーム: ①全員がSQLを書けるエンジニア・データアナリストチーム②「グラフUIよりもSQLを書いて素早く確認したい」ニーズ③シンプルなダッシュボードで十分で、Metabaseのノーコード機能が不要④Pythonスクリプトをデータソースとして使いたい(Redashはカスタムデータソースを書ける)。Metabaseが向いているチーム: ①マーケター・セールスなどSQLを書かないビジネスチームも使う②フォルダ・パーミッション管理が必要な大きなチーム③顧客向けの埋め込みダッシュボードを作りたい。実用的な選択: まずMetabaseで始めて、SQLヘビーユーザーが出てきたらSupersetのSQLラボを補完的に使うのがよくあるパターンです。

Q. SupabaseのデータをMetabaseで可視化する際、RLSはどう扱いますか?

A. MetabaseはPostgreSQLに直接接続するため、SupabaseのRLS(Row Level Security)はバイパスされます。これは設計上の特性です。対策: ①専用の読み取りユーザーを作成: CREATE ROLE metabase_readerで最小権限のユーザーを作り、見せて良いテーブルのみGRANT SELECTする②ビューで制限: CREATE VIEW public_articles AS SELECT * FROM articles WHERE status='published'のように公開可能なデータのみのビューを作り、そのビューのみ権限付与③スキーマ分離: Metabase用のスキーマを別途作り、そこにマテリアライズドビューを置く④レポート用テーブル: 定期的に集計済みのレポートテーブルを作成し(RLS不要)、そちらをMetabaseに接続。機密データ(個人情報・決済情報)が含まれるテーブルへのSELECT権限は絶対に付与しないのが鉄則です。

まとめ

ユースケース推奨ツール
ノーコード・非エンジニア向けMetabase
高機能SQLラボ・大規模チームApache Superset
エンジニア向けシンプルSQLRedash
Next.jsへの埋め込みMetabase

関連外部リソース

他の記事も読む

Let's Build Together

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

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