複数のs3アカウントと多数のバケットを横断的に管理することを目的に開発したwebツール。
各ディレクトリに README を残したり、チームで 1 つの共有ノートを書いたりもできます。
Local UserまたはOIDC SSOでログインでき、Pipelineは人とは別のService Account keyを使います。既存LAN運用から移行できるよう認証無効モードも残していますが、外部公開では使用しません。
- 横断ブラウズ — 複数の S3 互換ストレージ (接続) を登録し、バケット / ディレクトリを辿る
- プレビュー — テキスト / 画像 / 音声 / MP4動画 /
tar・tar.gz・tar.xzの中身を、ダウンロードせずその場で確認 - URL コピー — ファイルの Web URL (共有リンク) / S3 URL / ダウンロードをワンクリック
- ディレクトリ README — 各ディレクトリに Markdown のメモを残せる (履歴つき)
- チーム共有ノート — Mado 全体で 1 つの Markdown メモ (履歴つき)
- 波形 / スペクトログラム — 音声ファイルの波形とスペクトログラムをその場で確認 (解析結果はキャッシュ)
- 同期プレイヤー — 複数の音声ファイルを並べて同期再生し聴き比べる
- 配下の集計 — ディレクトリ配下のオブジェクト数と合計サイズを数える (サブディレクトリ / 拡張子別の内訳つき)
- 容量メトリクス — コネクション内の全バケットの容量・オブジェクト数と合計を定期取得し、Rechartsで増減を確認
- 移送の見積もり — その集計をもとに「他の接続へ移したら費用と時間はどれくらいか」を並べて比較。AWS S3 はストレージクラスも選べる
- 接続ごとの権限 — 「一覧は見せるがダウンロードと README 書き戻しは禁止」のように、接続単位で操作を絞れる
- Dataset Lineage — OpenLineageの
Dataset → Job → Datasetと、版ごとのDatasetVersion → Run → DatasetVersionをReact Flowで辿る - 認証とRBAC — Local User / OIDC SSO、Viewer・Curator・Operator・Admin、監査ログ
- Service Account key — PipelineのOpenLineage送信用(namespace限定)と、Prometheusのmetrics読み取り用のkeyを一度だけ表示して発行
ダッシュボードのURLをブラウザで開き、SSOまたは管理者が作成したLocal Userでログインします。AUTH_MODE=disabledの既存LAN環境ではログイン画面を出しません。
上部のタブで Home / Storage / Settings を切り替えます。
初回は接続が無いので、まず Settings → 「+ 追加」 で S3 互換ストレージを登録します。
- 名前 — 一覧での表示名
- エンドポイント / リージョン
- アクセスキー / シークレットキー — 保存時に暗号化されます (セキュリティ)
- path-style / ListObjects バージョン — 互換ストレージに合わせて選択
- ユーザーからの表示 — 通常は全員、例外だけホワイトリストで利用者を限定
- この接続で許可する操作 — 危険な導線を接続単位で閉じられます (下記)
登録した接続は後から編集・削除でき、Storage タブが開くデフォルト接続もここで変更できます。
接続は既定でログイン済みの全ユーザーに表示されます。一部だけ隠したい場合は
ホワイトリストを選び、利用を許可するユーザーを選択します。許可されていないユーザーには
接続一覧・転送候補・関連ジョブが表示されず、StorageやDataLineageのURLを直接開いても
存在を明かさないため404になります。connections:manage権限を持つ管理者は、空の
ホワイトリストを修正できるよう常にアクセスできます。
Glacier Deep Archive のように 一覧には出るが GetObject すると失敗する / 復元課金が発生する バケットや、書き戻したくない本番バケットを登録したときのためのトグルです。既定はすべて許可で、危険な接続だけ後から落とします。
| 項目 | オフにすると |
|---|---|
| バケット / オブジェクトの一覧 | この接続では何も見られなくなる (完全に凍結したいとき用) |
| ファイルのプレビュー | テキスト / 画像 / 音声 / MP4動画のプレビューが開かない |
| ファイルのダウンロード | DL ボタンと行メニューのダウンロードが消える |
| 圧縮ファイルを開く | tar / tar.gz / tar.xz の中身を開けない |
| 音声情報・波形の表示 | 音声解析 (ファイル全体の読み込み) が走らない |
| スペクトログラムの表示 | スペクトログラム画像を出さない |
| README の読み込み | ディレクトリ README のセクションと README 検索が消える |
| README の編集 | 「編集 / 作成」が消える (読み込みがオフだと選べません) |
オフにした操作は画面から導線が消えるだけでなく、共有 Web URL を直接開いても 403 で止まります。接続capabilityはRBACに重ねる防御層で、connections:manage権限を持つUserだけがSettingsから変更できます (セキュリティ)。
Settings の接続一覧には、制限のかかっている接続に「制限: …」が表示されます。
タグは接続ごとではなく Mado 全体の表示トグルです (Settings → 機能)。オフにしても登録済みのタグは消えません。
Storage タブはデフォルト接続を自動で開きます。別の接続に切り替えるときは右上の CONN メニュー、デフォルトの変更は Settings の各接続行の「デフォルトにする」から。
- ディレクトリをクリックして潜る / パンくずで戻る
- 上部の検索ボックスで 前方一致 検索 (再帰検索オプションあり)
- 一覧が多いときは下部のページャでめくる
- 一覧の上と README の見出しに、その情報を S3 から取得した時刻が出ます。取得から1時間を過ぎると経過時間で色が付きます (1〜3時間は緑、3〜6時間は黄、6〜12時間は橙、12〜24時間は赤、24時間以上は暗い赤で時刻が赤地)。一覧では表の上の帯、ファイル一覧の左端の線と地の色も同じ色になります。古いと気づいたら ↻ で取り直してください
ファイルの行をクリックすると 右側にプレビュー が開きます (テキスト / 画像 / 音声 / MP4動画)。
- プレビューの 左端の境界をドラッグ して幅を調整できます (リストを圧縮せず上に重なる形で広がる)。変更した幅は記憶され、ヘッダの
↔で既定幅に戻せます - ヘッダの DL で元ファイルをダウンロード
- テキスト / JSON は 「内容をコピー」 で全文をクリップボードへ
アーカイブを開くと 中のエントリ一覧 が表示されます。エントリをクリックすると個別にプレビュー (テキスト / 画像 / 音声 / MP4動画) でき、テキストは 「内容をコピー」 で全文コピーできます。
各行の ⋯ メニュー から:
- Web URL をコピー — そのファイルのプレビューを直接開く共有リンク (LAN / VPN 内の相手に渡せる)
- S3 URL をコピー —
s3://バケット/キー - このファイルをダウンロード
各ディレクトリの上部に S3 README が表示されます。編集 (✎) で Markdown を書き、履歴 (⏱) で過去の版を確認できます。長い README は折りたたまれ、「すべて表示」で展開します。
Home は Mado 全体で 1 つの Team note (Markdown)。メンバー全員で追記していく共有メモで、編集 / 履歴 が使えます。
一覧の上部にある 「配下を集計する」 で、そのディレクトリ配下のオブジェクト数と合計サイズを数えます (ListObjects だけを使うので、ファイルは 1 つもダウンロードしません)。54 万キー規模でも数分で終わりますが、重い接続では Settings のトグルで禁止できます。
集計が終わると、同じモーダルの 「移送の見積もり」 タブで「このデータを他の接続へ移すとどうなるか」を比較できます。
バケット直下ではREADMEの下にある 「バケットの容量メトリクスを見る」 から、接続内の
全バケットを縦に並べた容量履歴画面を開けます。画面上部には全バケットの容量・オブジェクト数の
合計と計測済み件数も表示します。定期計測は初期状態で無効で、周期はコネクション編集画面で
6時間〜7日から選びます。設定変更と 「今すぐ全バケットを計測」 は
connections:manage権限を持つUserだけが実行できます。完全なバケット全体走査だけが履歴になり、
途中終了した値はグラフへ混ぜません。
各バケットのカードには 「直下のディレクトリ別」 の内訳も出ます。同じ全体走査で数えた、
バケット直下のディレクトリの容量上位50件です (追加のS3リクエストはありません)。容量・割合・
前回からの増減を並べ、行を開くとそのディレクトリの推移グラフを表示します。
コネクション編集の 「バケットのメトリクス集計を許可する」 は既定で有効です。
無効にすると強制計測を止め、定期計測の有効化と周期設定も操作できなくなります。
走査の1ページ件数はコネクションごとに100/250/500/1,000件から選べます。
既定は1,000件で、S3互換実装の一覧応答が遅い場合だけ小さくします。
| 列 | 内容 |
|---|---|
| 所要 | 楽観〜悲観のレンジ。両端の帯域とオブジェクト数から出す |
| 初期 | 移動元から出す費用 (egress) + 取り出し + リクエスト料金 |
| 月額 | 移動先に置き続けたときの追加コスト |
行を開くと内訳と注意書きが出ます。移動元から出す費用を隠していないのが要点で、AWS から数十 TB 出すと、そのまま置き続けるより高くつくことがあります。
数字の精度について:
- オブジェクト数を見ています。 一般の料金計算ツールは「何 GB か」しか受け取りませんが、実際にはリクエスト料金も所要時間もオブジェクト数で決まります。平均サイズが小さいと帯域ではなくリクエストが律速になり、GB だけの見積もりは桁で外れます
- 所要時間は必ずレンジで出します。 接続ごとの帯域は Settings で実測値に置き換えられます (既定は当て推量です)
- 目的は桁と大小関係を合わせることであって、請求書を再現することではありません。無料枠や既存の使用量との合算は考慮していません
社内ストレージ (AWS / Wasabi 以外) は費用 0 として扱います。「金は掛からないが容量は有限」という実際の判断軸に寄せるため、容量を設定しておくと収まらない移送に警告が出ます。
AWS の料金 API から取得して DB にキャッシュしています。脚注に取得日が出るので、古ければ 「単価を更新」 を押してください。しばらく更新されていなければ、見積もりを開いたついでに裏で取り直します (その回の表示は古い単価のままで、次回から反映されます)。
外向きの通信ができない環境でも見積もりは出ます。 その場合はリポジトリに同梱されたカタログが使われ、脚注に「同梱の YYYY-MM-DD 版(まだ取得していません)」と出ます。費用 0 が「無料」なのか「単価を引けていない」のかを取り違えないよう、出所は必ず表示されます。
ただし、更新で新しくなるのは AWS の単価だけです。 以下は料金 API から取れないため手で持っており、更新しても変わりません。
- AWS の最小保存期間と最小課金サイズ、Glacier 系のオブジェクトごとの加算 (40KB)
- Glacier Deep Archive のストレージ単価 (同額の別クラスの値で代用)
- Wasabi のすべて (Wasabi は料金 API を公開していません)
これらは脚注の「一部の値は料金 API から取れないため手入力です」を開くと、何を手で持っているか・いつ一次ソースで確認したか・出典が読めます。候補の行を開けば、その移動先の単価が手入力かどうかも出ます。実際の契約単価があれば 接続の設定でストレージ単価を上書きしてください (そちらが優先されます)。
LineageでnamespaceとDataset/Job名を指定すると、MarquezのOpenLineage projectionをグラフ表示します。ノードを選ぶとRegistry正本の版、manifest/hash、保存場所、Git SHA、container、config、model、metricsを確認できます。
Pipelineへの導入方法、DatasetとVersionの分け方、OpenLineage event例、既存データのbackfill、S3接続とのbindingは
docs/lineage.mdにまとめています。Lineageを新しく生やす前にこのガイドを確認してください。
- logical表示:
Dataset → Job → Dataset - versions表示: 明示したDatasetVersion UUIDから
Version → Run → Version - 「最新らしい版」は推測しません。版表示には明示version IDが必要です
- Registryが正本で、Marquez停止中は警告を表示します。MadoからMarquezへ直接書き込みません
AdminのAccessではLocal UserとService Accountを作成し、OpenLineage送信用にlineage:writeと許可namespaceを持つkey、Prometheus収集用にmetrics:readだけを持つkeyを発行できます。Madoのデータを返すkeyは読み取り専用です。keyの秘密部分は発行時に一度だけ表示されます。
Settings の一番下 About に、バージョン・稼働中のコミット (GitHub リンク) ・リポジトリが表示されます。
- Docker + Docker Compose v2
- macOS / Linux (dev は macOS Docker Desktop を想定)
- LAN / VPN 内利用前提。インターネット公開は想定していない
# 1. .env を用意
cp .env.example .env
# 2. ENCRYPTION_KEY を生成して .env に書く (32 byte hex)
openssl rand -hex 32
# 3. 起動 (--build はコミット情報を About に焼くため初回 / 更新時に推奨)
docker compose -f compose.dev.yaml up -d --build
# 4. 初回Local Adminを作成(対話入力。既知の初期passwordは存在しない)
docker compose -f compose.dev.yaml exec api-internal \
npm run auth:bootstrap-admin:dev -- --username admin
# 5. ブラウザで http://localhost:5173dev の DB パスワードは未設定なら開発用の既定値で動きます。初回起動時のみ db/init/00-init.sh が dashboard_rw / dashboard_ro / mado_lineage ロールと dashboard_test DB を作成します。作り直したいときは down -v で volume を消してから上げ直してください。
| 変数 | 必須 | 説明 |
|---|---|---|
PORT |
yes | api コンテナの listen ポート (compose 側で 3000 に上書き) |
DATABASE_URL_RW |
yes | dashboard_rw 接続 URL。compose 内なので host は postgres |
DATABASE_URL_RO |
yes | dashboard_ro 接続 URL |
DATABASE_URL_RW_TEST |
no | テスト用。host から接続するので localhost。未設定なら default に fallback |
POSTGRES_PASSWORD |
prod:yes / dev:no | postgres スーパーユーザのパスワード。prod は未設定だと起動失敗、dev は既定 postgres |
DASHBOARD_PASSWORD |
prod:yes / dev:no | dashboard_rw / dashboard_ro のパスワード。DATABASE_URL_* のパスワードと一致必須。dev 既定 CHANGEME |
LINEAGE_DB_PASSWORD |
prod:yes / dev:no | Internet向けapi-lineage専用の最小権限DB role。英数字hexの生成値を推奨 |
ENCRYPTION_KEY |
yes | storage_connections の S3 認証情報を AES-256-GCM で暗号化するキー (32 byte hex) |
ALLOWED_ORIGINS |
yes | CSRF 防御。write 系で許容する Origin (カンマ区切り)。dev: http://localhost:5173 / prod: ダッシュボードを開く URL |
MADO_ENV |
no | development / test / production。本番composeはproductionを固定し、安全でない認証設定を起動時に拒否 |
AUTH_MODE |
no | disabled / local / oidc / hybrid。MADO_ENV=productionでは未設定・disabledを起動時に拒否 |
AUTH_COOKIE_SECURE |
no | HTTPS本番はtrue必須。__Host- session cookieを使う |
OIDC_ISSUER_URL / OIDC_CLIENT_ID / OIDC_CLIENT_SECRET / OIDC_REDIRECT_URI |
oidc/hybrid | OIDC discovery issuer、client、callback URL |
OIDC_ALLOWED_GROUPS |
oidc/hybrid | ログインを許可するAuthentik group(カンマ区切り)。空は起動時に拒否 |
OIDC_ROLE_MAPPING_JSON |
no | Authentik groupからviewer / curator / operator / adminへの対応。設定時はログインごとに同期 |
OIDC_AUTO_LINK_VERIFIED_EMAIL |
no | email_verified=trueの既存Local Userを自動連携(default false)。特権Local Userは自動連携しない |
OIDC_POST_LOGOUT_REDIRECT_URI |
no | Authentik logout後の戻り先。未指定時はcallbackと同じoriginの/ |
DATASET_REGISTRY_URL |
lineage | Dataset Registry API URL |
DATASET_REGISTRY_TOKEN |
lineage | Mado→Registry内部Bearer token。Pipeline keyとは別物 |
MARQUEZ_URL |
lineage | read-onlyで参照するMarquez URL |
PREVIEW_TEXT_LIMIT |
no | テキストプレビュー最大バイト (default 65536) |
PREVIEW_TAR_ENTRY_LIMIT |
no | tar 内 1 ページのエントリ最大数 (default 200) |
PREVIEW_TARXZ_BYTE_LIMIT |
no | tar.xz の解凍バイト上限 (default 256MiB) |
MEDIA_CONCURRENCY |
no | media-worker が同時実行する ffmpeg 解析数の上限 (default 3) |
MEDIA_ANALYZE_TIMEOUT_SEC |
no | 音声 1 ファイルあたりの解析タイムアウト秒 (default 300) |
MEDIA_CACHE_MAX_AGE_DAYS |
no | 解析結果キャッシュ (media_cache) の保持日数 (default 30) |
MEDIA_SPECTROGRAM_MAX_WIDTH |
no | スペクトログラム画像の最大幅 (px) (default 4096) |
⚠️ POSTGRES_PASSWORD/DASHBOARD_PASSWORD/LINEAGE_DB_PASSWORDは DB ボリュームの初回作成時のみ 反映されます。既存 DB のパスワード変更は env ではなくpsqlのALTER ROLEが必要です (詳細はdb/README.md)。生成例:openssl rand -hex 24
移送の見積もりに使う単価は、AWS の料金 API から取得して pricing_cache テーブルに 1 行だけキャッシュします (使い方)。
- 取得は
pricing.refreshジョブとして media-worker が実行します。外向きに HTTPS が出られる必要があります (calculator.awsとpricing.us-east-1.amazonaws.com) - 更新の間隔は
app_settingsのpricing_refresh_days(既定 1 日)。これより古くなると、見積もりを開いたときに裏で更新ジョブが投入されます。表示はその回だけ古い単価のままです - 出られない環境でも壊れません。 取得が失敗しても同梱カタログ (
api/pricing/catalog.ts) で見積もりは出ます。失敗しても次の投入までは間隔が空くので、ジョブが失敗で埋まることもありません - 同梱カタログを新しくするには、外に出られるマシンで
cd api && npm run pricing:fetchを回して結果をコミットします - いま何を使っているかは
GET /api/internal/pricingでも確認できます (出所・取得日・直近の失敗理由)
⚠ この機能は
db/migrations/020_pricing_cache.sqlを使います。既存の DB には手で適用が必要です (db/README.mdの「Applying a migration to an existing database」)。
既存DBには021_auth.sql以降の未適用migrationを番号順に適用します。ただし028は旧APIが参照する列を削除するため、既存環境では新APIを先に起動してから028を適用してください(021〜027は従来どおりコード起動前に適用できます)。029は未使用の既知bootstrap credentialを削除し、OpenLineage API専用DB roleを追加します。新規導入では既定passwordを持つAdminを残さないため、Webを公開する前に次のoffline bootstrapを必ず実行します。
初期Adminを明示的に再設定する場合は、対話的なbootstrapコマンドを使います(パスワードを引数やshell historyへ残しません)。
docker compose -f compose.prod.yaml exec api-internal \
npm run auth:bootstrap-admin -- --username adminpasswordはTTYからのみ読み、引数・環境変数・ログには渡しません。初回bootstrap時も入力した一時passwordは初回ログインで変更必須です。平常時はOIDC Adminを使う構成でも、IdP障害用に独立したLocal Adminを1つ維持してください。
PipelineはMADO_API_HOSTNAMEのPOST /api/openlineage/v1/lineageへService Account keyをBearer送信します。Madoがprofile/scope/namespaceを検証し、keyを除いたprincipal envelopeをRegistryへ転送します。production nginxはintranet UI用:8080とOpenLineage専用:8081を分離し、:8081ではこのPOSTだけを受け付け、その他のpath/methodを404にします。Composeは両listenerをhostのloopbackへだけpublishし、MDX edgeではbrowser用MADO_HOSTNAMEと公開API用MADO_API_HOSTNAMEを別TLS vhostとして終端します。
Service Account keyでMado自身のデータを読む入口は/api/mado/にまとめ、すべて読み取り専用(GETのみ)にしています。PrometheusはMADO_HOSTNAMEのGET /api/mado/metrics/<領域>を、metrics:readのService Account keyをBearer送信して読みます。現在の領域は容量メトリクスの/api/mado/metrics/capacityだけです。この入口はintranet用:8080にだけ置き、:8081では404です。scrape設定と出力するmetricsはdeploy/mdx/README.mdを参照してください。
MadoはSemVerを採用し、最初の正式版候補をv1.0.0とします。GitHub上のannotated tagだけがrelease workflowを起動し、通常のmain pushや社内deployからOSS releaseが始まることはありません。
公開時は同一commitからLinux amd64/arm64対応のcompiled OCI imageを3つ作り、GHCRへ配置します。
ghcr.io/aida0710/mado-api:<tag>: internal APIとOpenLineage APIghcr.io/aida0710/mado-media-worker:<tag>: ffmpeg workerghcr.io/aida0710/mado-web:<tag>: Web UIと用途別nginx入口
GitHub Releaseには、image digestを固定したCompose、DB初期化・全migration、設定例、licenseをまとめたbundleとSHA-256を添付します。OCI imageにはSBOMとbuild provenanceを付与します。release本文はdocs/releases/、公開手順と安全条件はdocs/releasing.mdを正本とします。
OSS releaseと社内環境へのdeployは独立しています。release workflowはdeployment hostへ接続しません。
./deploy.sh # main を pull し、compose.prod.yaml で再ビルド + 再起動deploy.sh は稼働中コミットを About に焼くため git 情報を build に渡します。dev との差分:
- nginx のintranet UI入口を
127.0.0.1:8080、OpenLineage専用入口を127.0.0.1:8081へpublishし、どちらも用途別のhost reverse proxyを必須にする (api コンテナはホスト非公開) - api は image build 時の
tsc成果物 (dist/) をnodeで実行 - nginx と api は non-root user で動作
- 全コンテナが
restart: unless-stopped - prod は
POSTGRES_PASSWORD/DASHBOARD_PASSWORDが.envに無いと起動しません (弱い既定値の埋め込み防止)
このダッシュボードは認証を備えていますが、公開入口のTLSとネットワーク制御は引き続き必要です:
- 外部公開前にHTTPS必須。標準配布bundleはloopback上のHTTP入口へ用途別TLS proxyを接続します。Browser側TLS終端後に
AUTH_COOKIE_SECURE=trueとAUTH_MODE=local|oidc|hybridを設定します。 - MDXでは
compose.mdx.yamlのedgenginxがbrowser用TLSを終端します。証明書取得・UFW・自動更新はdocs/mdx-tls.mdを参照してください。 - Web UI、
/api/auth/、/api/internal/、/api/mado/はintranet内に閉じます。外部公開するhost TLS proxyは127.0.0.1:8081だけへ接続し、OpenLineage ingest以外を公開しません。公開入口には送信元IP 10 req/s(burst 50)・全体50 req/s(burst 200)のrate limit、送信元20・全体200のconnection limit、2 MiB body上限、timeout、Cache-Control: no-storeを設定済みです。 - productionは認証無効で起動できません。初期・一時passwordの変更完了前は、直接APIを呼んでも通常機能を利用できません。
- Browser sessionとService Account key(PipelineのOpenLineage送信、Prometheusのmetrics読み取り)を分離し、API keyはhashだけを保存します。keyはscopeごとに発行し、Madoのデータを返すscopeは読み取りだけです。
- RBACと接続capabilityを重ね、監査ログには成功して実際に状態が変わった操作だけを残します。閲覧、認証拒否、失敗した操作、同じ値の再保存、既存ジョブへの合流は記録しません。変更操作は開始時にdurableなintentを置き、失敗・変更なしなら破棄します。password/token/OIDC code/OpenLineage event本体は保存しません。
- sessionの利用時刻、login attempt、response cache、API keyの最終利用時刻など、認証・cache維持のための内部更新は操作監査の対象外です。
ENCRYPTION_KEYでstorage_connectionsの S3 認証情報を保存時暗号化 (AES-256-GCM)。DB ダンプだけ漏れても解読不能。- CSRF 防御: write 系 (POST/PUT/DELETE) は
ALLOWED_ORIGINSと Origin/Referer を照合し、不一致なら 403。 - PG ロール分離: ブラウザ由来の経路は
dashboard_rw/dashboard_roを使い分け、Postgres レベルでDROP TABLE等を防ぐ。 - 接続ごとのcapabilityはRBACとは別層です。Adminであっても接続側で無効なdownload等は実行できません。
- 接続先の制限(SSRF対策): 接続のエンドポイントに、loopback・link-local(cloud metadataを含む)・IPv4-mapped IPv6でそれらを表したアドレスは使えません。RFC1918とIPv6 ULAは使えます。DNS名は接続のたびに名前解決の結果を確かめ、拒否するアドレスだけを指していれば接続しません。検査が今より緩かった頃に保存した接続も、使う時点で
409になります。アップデートの前に、既存の接続のエンドポイントがloopbackなどを指していないかを確かめてください。 - 接続ホワイトリストは通常接続を全員公開のまま保ち、例外の接続だけUser単位で隠します。非許可時は一覧・Storage API・DataLineage解決・関連job・転送候補を404相当で隠します。DataLineageの手動登録では許可されていない接続を保存場所に使えず(Registryへ紐付けていない接続と同じ
422)、Dataset・Versionの詳細でも見えない接続のIDは出しません。
Authentikとの接続、JIT User、group RBAC、Front/Back-channel logoutの登録値は
docs/authentik.mdにまとめています。
dev / prodとも、ブラウザsession用api-internalとPipeline key用api-lineageを別processにします。Dataset metadataの正本はRegistry、Marquezはoutboxから再構築できるprojectionです。
┌─ docker compose ──────────────────────────────┐
Browser ─:5173 ─►│ front (vite dev / dev) │
またはhost proxy│ または │
│ nginx :8080 (intranet UI / prod) │
│ └─► /api/internal/* → api-internal (Hono) │
│ └─► /api/auth/* → api-internal │
│ └─► /api/mado/* → api-internal │
Pipeline ─TLS proxy─► nginx :8081 (POST ingest only) │
│ └─► /api/openlineage/v1/lineage → api-lineage│
│ ├─► media-worker │
│ │ (ffmpeg) │
│ postgres │
└───────────────────────────────────────────────┘
公開ポート: dev=5173
host loopback: prod UI=:8080 / OpenLineage=:8081
| サービス | dev | prod |
|---|---|---|
front |
vite dev (HMR) |
(なし、nginx に焼き込み) |
nginx |
(なし、Vite proxy が代替) | :8080 静的配信・内部API・/api/mado/ + :8081 OpenLineage POST専用 |
api-internal |
tsx watch internal.ts |
node dist/internal.js |
api-lineage |
tsx watch lineage.ts |
node dist/lineage.js |
media-worker |
tsx watch worker.ts |
node dist/worker.js |
postgres |
postgres:16-alpine (127.0.0.1:5432) |
postgres:16-alpine (compose 内部のみ) |
docker compose -f compose.dev.yaml up -d --build # 起動 (About のコミット表示には --build)
docker compose -f compose.dev.yaml logs -f # ログ追跡
docker compose -f compose.dev.yaml down # 停止 (volume 残す)
docker compose -f compose.dev.yaml down -v # 停止 + DB volume 削除ソース変更は bind mount で反映: front/ → vite HMR / api/ → tsx watch 再起動。
cd front && npm install && cd ..
cd api && npm install && cd ..host 上で直接実行 (postgres コンテナだけ立っていれば良い):
docker compose -f compose.dev.yaml up -d postgres
cd api && npm test && npm run lint
cd front && npm test && npm run lint- ロゴ (
front/public/mado-icon.png): "Window" icon by Inmotus Design on Icons8。Icons8 の無料利用規約により attribution を明記。
Mado is licensed under the Apache License 2.0.