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:
機能比較表
| 比較項目 | Metabase | Apache Superset | Redash |
|---|---|---|---|
| ライセンス | AGPL-3.0 | Apache-2.0 | BSD-2 |
| ノーコード探索 | ✅ 優秀 | ✅ | ❌ |
| SQLラボ | ✅ | ✅ 高機能 | ✅ |
| 埋め込み | ✅ JWT | ✅ | ✅ |
| 自動レポート | ✅ | ✅ | ✅ |
| クロスフィルター | ❌ | ✅ | ❌ |
| Supabase接続 | ✅ PostgreSQL | ✅ PostgreSQL | ✅ PostgreSQL |
| 最小RAM | 1.5GB | 2GB | 1GB |
| GitHub Stars | 38k+ | 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_librariesにpg_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 |
| エンジニア向けシンプルSQL | Redash |
| Next.jsへの埋め込み | Metabase |