Busabase
Busabase is an open-source (MIT) database and workspace for AI agents — data, docs, skills, and apps in one place. Run it locally, self-host it inside your network, or use Busabase Cloud, and turn age
翻訳待ち
官民共存型オープンデータ管理システム — 表記ゆれ正規化つきマージエンジンを備えたオープンデータ基盤 (AGPL-3.0)
Loading the full README.
Read the full README ↗官民共存型オープンデータ管理システム — 行政と民間が双方向にデータを持ち寄り、 住所などの表記ゆれを自動で名寄せ・マージして、公開カタログと REST API で利活用するための基盤です。
既存の CKAN / Socrata / OpenDataSoft などが「行政が一方向に公開する」モデルであるのに対し、 OpenData Bridge は 官民双方向の持ち寄り + 表記ゆれ正規化つきマージエンジン を差別化の核としています。
公開インスタンス: **https://opendata-bridge.vercel.app**(サービス紹介は /about)
| 機能 | 概要 |
|---|---|
| 組織・認証 | 組織(行政 / 民間)単位のアカウント。セッションは署名付き JWT(HttpOnly Cookie)。 |
| データセット管理 | CSV アップロード、メタデータ(タイトル・説明・ライセンス・タグ・更新頻度・公開範囲)管理。 |
| 外部データソース連携 | 外部の REST API(JSON)や CSV の URL をデータセットに関連付け、手動 / 定期(毎日)で取り込み。取得結果は CSV アップロードと同じ実体に書き込まれるため、カタログ・マージ・公開 API がそのまま使える。 |
| 承認フロー | 下書き → 承認待ち → 公開 / 差し戻し。公開は組織の ADMIN のみ承認可能。 |
| 公開カタログ | 公開データセットをキーワード・組織種別・タグ・自治体(都道府県 / 市区町村) で横断検索。CSV ダウンロード対応。 |
| 地域メタデータ | データセットに「対象地域」、組織に「所在地」を設定。対象地域が未設定のデータセットは組織の所在地で絞り込まれる。市区町村は総務省の全国地方公共団体コード(47 都道府県 / 1,741 市区町村)に基づくマスタから選択。 |
| マージエンジン | 2 つのデータセットをキー列 + 正規化レベルで名寄せ結合。マージ型は 項目拡張型(片方の行をすべて残して列を足す)と 共通抽出型(両方にある行だけ残す)の 2 種。住所・カナ・電話・日付などの表記ゆれを吸収し、双方向のカバー率などの指標とアンマッチ例を提示。結果は出典(来歴)と版を保持した新データセットとして保存し、元データの更新に追従できる。詳細は docs/design/merge-design.md。 |
| REST API v1 | API キー(Bearer)認証で公開データセットの一覧・メタデータ・本体(JSON / CSV)を取得。呼び出し量を自動計測。 |
別システムのデータベースが公開している API を、データセットに 関連付けて随時引き込む 仕組みです。CSV アップロードを置き換えるものではなく、同じ器を埋める 2 つ目の経路として 共存します。
CSV アップロード ─┐
├─→ storage の datasets/{id}.csv ─→ カタログ / ダウンロード / マージ / REST API v1
外部 API 取り込み ─┘
取得したデータは既存の CSV ストレージ(lib/storage.ts)へ書き出されます。この一点に
揃えているため、下流の機能は一切変更していません。API 取り込みのデータセットも、
そのままマージエンジンの入力にでき、公開カタログにも載り、REST API v1 からも読めます。
| 項目 | 対応内容 |
|---|---|
| 取得方式 | REST API(JSON)/ CSV の URL |
| 認証 | なし / Bearer トークン / 任意のヘッダ / クエリパラメータ |
| レコード位置 | ドット区切りで指定(CKAN なら result.records)。直下が配列なら省略可 |
| 列マッピング | 取得元のキー → 保存する列名。未指定なら全キーを自動で列にする |
| 同期 | 手動(いつでも)/ 定期(毎日・syncMode = SCHEDULED) |
| 接続テスト | 保存前に取得を試し、列と先頭 10 行を確認できる |
| 履歴 | 成功 / 失敗・行数・所要時間・実行種別を SyncRun に記録 |
設定はデータセット詳細画面 /dashboard/datasets/[id] の「外部データソース」パネルから行います。
定期同期の有効化: CRON_SECRET を環境変数に設定してください(未設定なら定期同期は
503 で無効。手動同期は使えます)。スケジュールは vercel.json の
0 18 * * *(UTC)= 毎日 03:00 JST です。
取り込みの設計上の判断:
lib/sources/fetch.ts)。
クラウドのメタデータ(169.254.169.254)や内部ホストへは到達できません。lib/crypto.ts)。相手に提示する
必要があるためハッシュ化はできませんが、平文では保存しません。画面にも再表示されません。/ — ランディングページ/catalog — 公開データカタログ(検索・フィルタ) / /catalog/[id] — データセット詳細・ダウンロード/signup /login — 組織登録 / ログイン/dashboard — ダッシュボード
/dashboard/datasets — 自組織のデータセット一覧 / new・[id](外部データソース設定を含む)・[id]/edit/dashboard/merge — マージウィザード/dashboard/api-keys — API キー発行・失効・利用量/dashboard/settings — 組織設定DATABASE_URL と直接続の DIRECT_URL を使用)storage/datasets/)/ Supabase Storage(非公開バケット)を環境変数で自動切替(lib/storage.ts)jose(JWT)+ bcryptjscsv-parse / csv-stringify前提:
# 1. 取得
git clone <this-repo>
cd opendata-manage-system
# 2. 依存インストール(postinstall で prisma generate が走ります)
npm ci
# 3. 環境変数を用意
cp .env.example .env
# .env を編集し、以下を設定してください。
# - DATABASE_URL: PostgreSQL の接続文字列(Supabase のプーラー 6543 + ?pgbouncer=true、
# またはローカル PostgreSQL)
# - DIRECT_URL: マイグレーション用の直接続(Supabase の 5432。ローカル PostgreSQL の
# 場合は DATABASE_URL と同じ値でも可)
# - SESSION_SECRET: 十分長いランダム値(例: openssl rand -base64 32)
# SUPABASE_URL / SUPABASE_SERVICE_ROLE_KEY は未設定でOK
# (未設定時は CSV をローカルの storage/datasets/ に保存)
# 4. DB マイグレーション(PostgreSQL に接続してテーブル作成)
npx prisma migrate deploy # prisma/migrations の初期マイグレーションを適用
# (スキーマを変更して作り直す場合は: npx prisma migrate dev)
# 5. シードデータ投入(組織2・ユーザー2・公開データセット4件)
npx prisma db seed
# 6. 開発サーバー
npm run dev # http://localhost:3000
ストレージについて:
SUPABASE_URLとSUPABASE_SERVICE_ROLE_KEYが両方設定されていれば CSV は Supabase Storage(非公開バケット)へ、未設定ならローカルのstorage/datasets/へ 保存されます。どちらを使うかはlib/storage.tsが環境変数だけで自動判定します。
シード投入後、以下のアカウントでログインできます(パスワードは共通で demo1234)。
| メールアドレス | 組織 | 種別 | 権限 |
|---|---|---|---|
[email protected] | 鳥取県庁 | 行政 | ADMIN |
[email protected] | 山陰データラボ株式会社 | 民間 | ADMIN |
投入される公開データセット(すべて PUBLISHED / 一般公開):
1 と 3 は住所が一部同一地点を指しており、マージウィザードで キー列「住所」/ 正規化レベル「住所 (address)」で結合すると 表記ゆれを吸収して 約 40% のマッチ率 で名寄せできます(マージ機能のデモ)。
シードは冪等です。npx prisma db seed を何度実行しても、既存の組織・ユーザー・
データセットと CSV を作り直し、常に上記 4 件の状態になります。
元 CSV は prisma/seed-data/ にコミットされており、実行時に lib/storage.ts 経由で
保存されます(ローカルは storage/datasets/、Supabase 設定時は Supabase Storage の非公開バケット)。
API キーは /dashboard/api-keys で発行します。認証は Bearer 方式です。
curl -H "Authorization: Bearer odb_あなたのキー" \
"http://localhost:3000/api/v1/datasets?q=避難所&org_type=GOVERNMENT"
エンドポイント・認可・エラー形式の詳細は docs/api.md を参照してください。
DB は Supabase Postgres、CSV ファイルは Supabase Storage(非公開バケット) を使います。
ホスティングは Vercel です。Vercel の Marketplace Integration(Supabase) で接続すると、
DB 接続用の環境変数が 自動注入 され、手動で設定するのは SESSION_SECRET だけで済みます。
従来どおり
DATABASE_URL/DIRECT_URLなどを手動設定する方法も引き続き使えます (「B. 手動で環境変数を設定する場合」を参照)。アプリは注入変数・手動変数のどちらでも動くようlib/db-env.tsで接続 URL を解決します。
This is the beginning of the README. Read the rest at the original. Read the full README ↗