---
title: "データベース"
description: "メタデータ(meta)データベースは、ファイルから導出できないものを保持します。デフォルトはSQLite、チーム利用ではMETA_DB_URLでPostgresを指定します。"
---

# データベース

Notariumでは、ノートはファイルであり、検索インデックスとグラフはそこから再構築されます。しかし、状態の一部は**ファイルから導出できません**。それを保持するのが独立したメタデータ(meta)データベースです。デフォルトでは、これはデータルート配下のSQLiteファイル `<DATA_DIR>/meta.db` です。`META_DB_URL` 変数は、外部のPostgresを指し示すときにのみ必要になります。

## メタデータデータベースが保持するもの

| データ | なぜファイルから導けないのか |
|---|---|
| ノートの識別子 | `notarium-id` ↔ パスのレジストリ。移動やリネームを経ても維持されます。 |
| バージョン履歴 | リビジョンログ(バージョンのスナップショット、編集の出所)は、gitではなくアプリ自身が管理します。 |
| ユーザーとアクセス権 | アカウント、ロール、メンバーシップ、トークン。 |
| リネーム履歴 | スペースとプロジェクトの旧スラッグに対するエイリアス。以前のアドレスが解決され続けるようにするためです。 |

これらはいずれも `.md` ファイルだけからは復元できません。だからこそ、メタデータデータベースは必ず[バックアップ](/docs/self-hosting/backup/)に含めます。このデータベースにはスペースのレジストリもありますが、そちらは派生物です。スペースのアイデンティティはそのルートに置かれたマーカーファイルに宿り、スキャンによって復元されます([File-first](/docs/concepts/file-first/))。エンジンの派生インデックス(`<DATA_DIR>/engine`)にいたっては、失われても次回起動時にファイルから再構築されるだけです。

バージョンとその出所について詳しくは、[コンセプト:バージョニング](/docs/concepts/versioning/)を参照してください。

## スキーマとマイグレーション

メタデータデータベースのスキーマを管理するのはアプリケーション自身です。マイグレーションは**起動時に**適用され、そのための専用コマンドはありません。適用済みマイグレーションの台帳はデータベース自身が持っており、ビルドはそれを見て相手が何であるかを把握します。

起動が受け入れる状態は、次の三つだけです。

- **空のデータベース** — 基本スキーマが展開され、台帳への記録も同じトランザクションで書き込まれます。
- **台帳が、期待される台帳の正確なプレフィックスになっているデータベース** — バージョン、名前、チェックサムを突き合わせたうえで、不足している残りが適用されます。
- **台帳を持たない、空ではないデータベース** — 起動は**fail closed(安全側に倒して失敗)** します。スキーマを一切変更せず、アプリケーションからクエリを投げる前の段階で止まります。

最後のケースは意図的なものです。ビルドは、見覚えのないデータベースのバージョンを推測しませんし、台帳の印を自分で押すこともしません。それは黙ってデータを壊す行為だからです。手元にそうしたデータベースがある場合(たとえば基本スキーマより古いインスタンス)は、まずそのバージョンの正規の手順でアップグレードと確認を済ませ、そのうえでこの境界を越えさせてください。

> [!important] ロールバックとは、バックアップからのリストアのこと
> Notariumにおけるデータのロールバック手段は、検証済みのアーカイブであって、逆方向のSQLマイグレーションではありません。バックアップを取って検証するのは、アップグレードの**前**です。[バックアップとリストア](/docs/self-hosting/backup/)を参照してください。

## SQLite(デフォルト)

設定不要です。デフォルトでは、メタデータデータベースは `sqlite:<DATA_DIR>/meta.db`、つまり `/data` ボリューム上のファイルです。専用のサービスは不要で、設定すべきものは何もありません。個人インスタンスや、**単一**コンテナ上の小規模なチームには、これで十分です。

## Postgres(チームと共有状態向け)

状態をコンテナの外に切り出すには — 共有ストレージ、耐障害性、あるいはメンテナンスのために — Postgresを指定します。

```bash
# .env
META_DB_URL=postgres://user:pass@db:5432/notarium
```

Postgresが必要になるのは、状態がコンテナのライフサイクルから独立して存在しなければならない場合です。その場合も、ノート自体は依然として `<DATA_DIR>/spaces` 配下のファイルのままで、そこから導出できないものだけがデータベースに入ります。

> [!important] `password` モードはメタデータデータベースに依存する
> `AUTH_MODE=password` モードでは、アカウントとトークンのためにメタデータデータベースが必要です。そしてそれはデフォルトですでに存在しています(データルート配下のSQLite)。`META_DB_URL` を別途設定する必要はなく、Postgresへ移行するときにだけ指定します。メタデータデータベースなしで動作するのは `AUTH_MODE=none` のみです。[認証](/docs/self-hosting/authentication/)を参照してください。

> [!note] 単一インスタンス
> 状態をPostgresへ移しても、それ自体で水平スケーリングが有効になるわけではありません。Notariumは単一インスタンスとして動作し、ロードバランサーの背後に複数インスタンスを配置する構成はサポートされません([本番環境](/docs/self-hosting/production/)を参照)。
