第 17a 章 コンプライアンス、ストレージ & 運用 管理画面: #/protect/overview

バックアップ & 復元 (nextxch Protect): 証拠エクスポート、構成、データ、復元、プロバイダー移行

nextxch Protect は、証拠保全、バックアップ、復元に必要な機能を管理画面の [バックアップ & 復元] にまとめています。Ed25519 署名付きマニフェストによる証拠能力のある EML エクスポート、バージョン管理付きの構成バックアップ、暗号化された増分データ バックアップ (ディレクトリ、SMB 共有、または Object Lock 付き S3)、GoBD アーカイブ・削除済みアイテム・データ バックアップからのメールボックスへの復元、初回起動時のベアメタル リカバリ、さらにプロバイダー移行のための復元とライブ同期を備えたパイプライン デプロイです。すべてサーバーに組み込まれており、アドオン製品も外部サービスも必要ありません。

運用のヒントとアーキテクチャに関する注記

導入の順序: まず [バックアップ & 復元] > [構成] でバックアップ キーを設定し (12 文字以上のパスフレーズまたは回復キー、サインインしたサーバー管理者のみ)、サーバーの外に保管してください。構成バックアップとデータ バックアップは同じキーを使用します。サーバーは公開部分のみを保存するため、バックアップを書き込めますが読み取ることはできません。ライセンス: 構成バックアップ、証拠エクスポートの検証、Webmail のセルフサービス、初回起動時の復元、構成のパイプライン復元はすべてのエディションに含まれます。データ バックアップ、証拠エクスポート、復元ジョブ、パイプライン復元のデータ部分、ライブ同期は Business 以上です。

1. クイック スタート: キー、ターゲット、初回バックアップと検証

ターゲットとスケジュールは [バックアップ & 復元] > [スケジュール & ターゲット] で設定します (サーバー管理者のみ)。nextxch-cli は API キーまたは管理者ログインでサインインします。

リファレンス / 構成
# 1. Admin > Backup & Recovery > Configuration: set up the backup key
#    (passphrase of 12+ characters or recovery key, keep it safe outside the server)
# 2. Schedules & targets: add a target (directory, SMB share \\nas\backup\nextxch or S3) and "Test"
# 3. Back up the configuration (every tier) and take it along as a file:
nextxch-cli config backup --label "before migration" -o nextxch-config.zip

# 4. Data backup (Business): full first, then incremental by schedule
nextxch-cli backup run --target nas --full
nextxch-cli backup list --target nas

# 5. Verify, with the passphrase including decryption of the sample
export NEXTXCH_BACKUP_PASSPHRASE='...'
nextxch-cli backup verify --target nas --passphrase-env NEXTXCH_BACKUP_PASSPHRASE --limit 200

2. 証拠能力のあるエクスポート: ZIP、マニフェスト、署名、検証

メッセージはバイト単位でそのまま .eml として ZIP に格納されます。manifest.json には、各ファイルの SHA-256、サイズ、アーカイブ ハッシュ、整合性の状態、保持、リーガル ホールドが記載されます。manifest.json.sig はマニフェストの正確なバイト列に対する Ed25519 署名で、サーバー シークレットから導出され、すべてのクラスター ノードで同一です。GET /api/compliance/exports/public-key はサインインなしで公開鍵を返します。decrypt オプションは保存時の暗号化のみを解除します (ServerAdmin と ComplianceAuditor のみ、それ以外は 403 DECRYPT_NOT_ALLOWED)。一般的な S/MIME や OpenPGP の復号ではありません。単一ダウンロード GET /api/compliance/messages/{id}/raw は、ハッシュを HTTP ヘッダー X-Nextxch-Sha256、X-Nextxch-Stored-Sha256、X-Nextxch-Integrity、Repr-Digest として返します。エクスポートは Business 以上、検証はすべてのエディションで利用できます。

リファレンス / 構成
nextxch-evidence-20261111-0930-1a2b3c4d.zip
  messages/000001-<archiveId>.eml     original message, byte for byte
  messages/000002-<archiveId>.eml
  SHA256SUMS.txt                      verifiable with sha256sum -c
  manifest.json                       format nextxch-evidence-export/1, scope (incl. caseReference), items[]
  manifest.json.sig                   Ed25519: algorithm, keyId, publicKey, signedSha256, signature
  README.txt

# Start an export (202, status under GET /api/compliance/exports/{id}):
curl -X POST https://mail.company.com/api/compliance/exports -H "X-Api-Key: $KEY" \
  -H "Content-Type: application/json" \
  -d '{"scope":"mailbox","account":"anna@company.com","sinceUtc":"2026-01-01T00:00:00Z","caseReference":"Case 2026-0815"}'

# Verify offline, without access to the server (exit code 0 valid, 1 invalid/tampered, 2 usage error):
curl -s https://mail.company.com/api/compliance/exports/public-key > nextxch-evidence-key.json
nextxch-cli export verify nextxch-evidence-20261111-0930-1a2b3c4d.zip --public-key <publicKey from the file>
unzip -d export nextxch-evidence-20261111-0930-1a2b3c4d.zip && cd export && sha256sum -c SHA256SUMS.txt

3. 構成バックアップ: 内容、暗号化、差分、部分復元

パッケージには、コードとしての構成 (config/*.yaml)、シークレットを含まない状態ファイル (server/*)、Sieve ルール、および secrets.enc 内の暗号化されたシークレット (AES-256-GCM、データ キーはバックアップ キー向けにラップ。手動バックアップには独自のパスフレーズを追加で設定可能) が含まれます。セクション: config:<area>、dkim、passwords、tls-certificates、api-keys、sieve、server-files、licence。licence、passwords、api-keys は明示的に指定した場合にのみ復元されます。復元は既定でプレビュー付きのドライランです。すべてのエディションで利用でき、REST は /api/v1/config/backups にあります。

リファレンス / 構成
nextxch-cli config list                                   # versions (reason: manual, pre-update, after-change, pre-restore, import)
nextxch-cli config diff 20261101T020000Z-a1b2c3 current             # difference between two versions or to the current state
nextxch-cli config backup --label "before update" --passphrase-env BACKUP_PW -o nextxch-config.zip
nextxch-cli config import -f nextxch-config.zip           # take over a package of another server

# Partial restore: preview first, then apply
nextxch-cli config restore 20261101T020000Z-a1b2c3 --sections dkim,config:domains --domain company.com --dry-run
nextxch-cli config restore 20261101T020000Z-a1b2c3 --sections dkim,config:domains --domain company.com --yes

# REST: POST /api/v1/config/backups/{id}/restore
# {"sections":["dkim","config:domains"],"domain":"company.com","prune":false,"dryRun":true}

4. データ バックアップ: ターゲット、形式、カタログ

各実行で自己完結したバージョンが作成されます: テーブルごとのデータベース スナップショット (プロバイダーに依存しないため、SQLite から PostgreSQL への移行も可能)、状態ファイル、GoBD アーカイブのマニフェスト、参照されるすべての BLOB です。BLOB は SHA-256 でアドレス指定され、転送は 1 回だけです。増分実行では新しいハッシュのみがアップロードされます。すべて NXB1 形式で暗号化して保存されます (チャンク単位の AES-256-GCM、オブジェクト名にバインド)。カタログと BLOB インデックスはシークレットを含まない読み取り可能な JSON で、カタログは証拠エクスポートの Ed25519 キーで署名されます。完全な形式はリポジトリの docs/protect/backup-format.md にあります。Business 以上、REST は /api/admin/protect/backups (サーバー管理者) です。

リファレンス / 構成
<target>/                                 directory, SMB share or s3://bucket/nextxch-backup/
  nextxch-backup.json                       target marker
  keys/backup-key-<keyId>.json              public key + sealed private key
  keys/dk-<dataKeyId>.json                  data key of one run (ECDH wrapped)
  blobs/ab/cd/<sha256>.nxb                  one mail or file content, immutable
  versions/20261111T023000Z-a1b2c3/
    catalog.json  catalog.json.sig          catalog (written last = version complete) + signature
    blobs.ndjson.gz                         blob index of the version
    db/<table>.ndjson.gz.nxb                database snapshot, one file per table
    files/<path>.nxb                        state files of the data directory
    archive-manifest.json.gz.nxb            retention, legal hold, integrity chain

# Settings via REST (PUT /api/admin/protect/backups/settings):
{"verifyEveryHours":24,"verifySampleSize":50,"alertOnFailure":true,"uploadParallelism":4}

# Back up a domain or single mailboxes:
nextxch-cli backup run --target s3-fsn1 --scope domains:company.com,company.at
nextxch-cli backup run --target s3-fsn1 --scope mailboxes:anna@company.com --no-wait

5. メールボックスへの復元: ソース、時点、復元先

ソース: archive (GoBD アーカイブ)、recoverable (削除済みアイテム)、backup (データ バックアップ)。時点は --point (スナップショット ID、day:yyyy-MM-dd、latest) または --as-of で選択します。復元先: original (元のフォルダー)、restored (既定、フォルダー "Wiederhergestellt yyyy-MM-dd"、名前は --label で指定)、account (同じテナントの別のメールボックス、例: 後任者のメールボックス)。重複は SHA-256、Message-ID、UID によってスキップされ、ソースは変更されません。TenantAdmin と ServerAdmin に許可され、ジョブあたり最大 250,000 アイテムです。ジョブは Business 以上、ポリシーと Webmail のセルフサービスはすべてのエディションで利用できます。

リファレンス / 構成
nextxch-cli restore points  --account anna@company.com --source backup
nextxch-cli restore browse  --account anna@company.com --source backup --point latest --folder INBOX --filter "invoice"
nextxch-cli restore preview --account anna@company.com --source archive --as-of 2026-10-31T23:59:59Z --folder "Projects/Plant"
nextxch-cli restore start   --account anna@company.com --source archive --as-of 2026-10-31T23:59:59Z \
  --folder "Projects/Plant" --target restored --label "Plant (restored)"

# Whole mailbox into a successor mailbox:
nextxch-cli restore start --account ben@company.com --source backup --point day:2026-11-01 \
  --target account --target-account successor@company.com --passphrase-env NEXTXCH_BACKUP_PASSPHRASE
nextxch-cli restore jobs --account ben@company.com

# REST: /api/compliance/restore (sources, points, browse, preview, jobs, policy)
# Webmail: GET /api/mail/self-restore, POST /api/mail/self-restore {"ids":[...]}

6. ベアメタル リカバリ: 新規インストールとバックアップで旧サーバーを再現

新規インストール (MSI、Docker、Linux で、テナント、ドメイン、アカウントがそれぞれ最大 1 つ、まだ管理者のサインインがない状態) では、/setup/ のサインインの下に "バックアップから復元" が表示されます: パッケージのアップロード、パスフレーズ、プレビュー、復元、必要に応じてデータ バックアップ、完了して再起動の順に進みます。アクセスには、初回起動時にログと {DataDirectory}/first-run/setup-token.txt に書き込まれるワンタイムのセットアップ トークン (ヘッダー X-Nextxch-Setup-Token) が必要です。または Setup:TrustLoopback=true でサーバー自身からアクセスします。最初の管理者サインインまたは [完了] でウィザードは完全に閉じられます。旧サーバーのバックアップ キーは引き継がれないため、後で改めて設定する必要があります。SQLite の全文インデックスはバックアップに含まれません。復元したメールは、再インデックス後に検索で見つかるようになります。

リファレンス / 構成
# Headless via CLI (same API /api/setup):
export NEXTXCH_SETUP_TOKEN="$(cat /var/lib/nextxch/first-run/setup-token.txt)"
export NEXTXCH_BACKUP_PASSPHRASE='...'
nextxch-cli setup restore --config nextxch-config.zip --data s3://dr-bucket/nextxch/ --prune --dry-run
nextxch-cli setup restore --config nextxch-config.zip --data s3://dr-bucket/nextxch/ --prune --yes

# Unattended on first start (Docker Compose, Kubernetes, MSI):
environment:
  NEXTXCH_RESTORE_FROM: s3://dr-bucket/nextxch/          # .zip, directory, s3://, https:// or config-backup:<id>
  NEXTXCH_RESTORE_PASSPHRASE: ${BACKUP_PASSPHRASE}       # without: configuration without secrets
  NEXTXCH_RESTORE_DATA_FROM: s3://dr-bucket/nextxch/     # optional, location of the data backup
  NEXTXCH_RESTORE_PRUNE: "true"                          # remove bootstrap objects
  NEXTXCH_RESTORE_WITH_CREDENTIALS: "true"               # passwords, API keys, licence (default true)
  NEXTXCH_RESTORE_S3_ENDPOINT: https://fsn1.your-objectstorage.com
  NEXTXCH_RESTORE_S3_ACCESS_KEY: ${S3_KEY}
  NEXTXCH_RESTORE_S3_SECRET_KEY: ${S3_SECRET}
# Result: {DataDirectory}/pipeline-restore/first-start.json ("ok": true = variable is ignored afterwards)
# Helm: restore.from, restore.scope, restore.mapping, restore.passphrase, restore.s3.* (replicaCount: 1)

7. 復元を伴うパイプライン デプロイ (nextxch-cli deploy --restore)

1 つのコマンドまたはパイプライン ステップで、バックアップからサーバーを再構築します: 構成を適用し、データを復元し、チェックを実行し (ハッシュ サンプル、ヘルス、テスト メールは Mailpit またはローカル メールボックスにのみ)、必要に応じて DNS/MX 変更の手順を出力します。DNS が自動的に変更されることはありません。各実行は冪等で、中断後は最後に完了したステップから再開します。マッピング ファイル (kind RestoreMapping、スキーマは GET /api/v1/deploy/mapping-schema) はホスト名、IP アドレス、パスを書き換え、証明書の取得元 (backup、acme、files) を決め、新しいホストのデータベースとストレージを記述します。メール ドメインの名前が変更されることはありません。サインインにはスコープ deploy.restore を持つ連携キーを使用します。構成はすべてのエディション、データ部分は Business 以上です (新規インストールの初回起動時を除く)。データ部分はスコープ all を対象とします。

リファレンス / 構成
# mapping.yaml
apiVersion: nextxch/v1
kind: RestoreMapping
hostnames:
  mail.old-provider.example: mail.company.com
ips:
  203.0.113.10: 198.51.100.20
paths:
  "C:\\Data\\NextxchData": /var/lib/nextxch
certificates:
  mode: acme                      # backup | acme | files
  acme: {contactEmail: hostmaster@company.com}
database:
  provider: Postgres              # must match the new host (Storage__Provider)
  connectionStringEnv: NEXTXCH_PG_CONNECTION
storage:
  blobBackend: S3
  s3: {endpoint: https://fsn1.your-objectstorage.com, bucket: nextxch-mail}

# Plan (dry run, shows every replacement), then restore with checks:
nextxch-cli deploy --restore ./nextxch-config.zip --scope config --map mapping.yaml --dry-run
nextxch-cli deploy --restore s3://dr-bucket/nextxch/ --map mapping.yaml --test-mail mailpit --dns-instructions --yes

# REST: POST /api/v1/deploy/restore (dryRun defaults to true)
# {"source":"s3://dr-bucket/nextxch/","scope":"all","mapping":"...","dryRun":false,"testMail":"mailpit","hashSample":20}
# Local package: POST /api/v1/deploy/restore/upload (application/zip) -> source "upload:<sha256>"
# Runs: GET /api/v1/deploy/restore/runs

8. CI テンプレート: GitHub Actions、GitLab CI、Azure DevOps、Ansible

テンプレートはリポジトリの deploy/ci にあります: 本番環境でのプラン ステージと承認を伴う復元に加え、使い捨て環境に復元して所要時間 (RTO) と状態 (RPO) のレポートを書き出す夜間の DR プローブです。シークレットはマスクされ保護された CI 変数に格納してください。テスト メールはジョブ横の Mailpit コンテナーに送られ、そこから外に出ることはありません。

リファレンス / 構成
deploy/ci/github-actions/nextxch-restore.yml        plan on a throwaway instance, container with restore on first start, checks, DNS step
deploy/ci/github-actions/nextxch-dr-probe.yml       nightly DR probe with RTO/RPO report
deploy/ci/gitlab/.gitlab-ci.yml                     restore (RESTORE_SOURCE, RESTORE_SCOPE, PLAN_ONLY ...) + DR probe (NEXTXCH_PIPELINE=dr-probe)
deploy/ci/azure-devops/azure-pipelines.yml          restore with parameters, deployment job on environment production
deploy/ci/azure-devops/azure-pipelines-dr-probe.yml nightly DR probe, report in the run summary
deploy/ci/ansible/playbook-restore.yml              role nextxch_restore: container (Linux) or MSI (Windows)
deploy/ci/mapping.example.yaml, mapping.schema.json example and JSON Schema of the mapping file

9. プロバイダー移行のためのライブ同期: 長時間の停止ではなく短時間の凍結

完全復元の後、新サーバーは差分実行で旧サーバーに追従します: 旧サーバーはデータ バックアップの書き込みを続け (例: 1 時間ごとに S3 へ)、各実行では最後に取り込んだバージョン以降に変更された BLOB、テーブル行、状態ファイルのみが取り込まれます。進捗は {DataDirectory}/pipeline-restore/live-sync.json にあります。同じコマンドを再度実行しても、何も変わらないか、処理が再開されます。切り替え時には旧サーバーを手動で凍結し (ファイアウォールでメール ポートとクライアント ポートをブロックし、サービスは稼働させたまま、nextxch-cli backup run --full で最終バックアップ)、続いて --cutover --source-frozen で全行比較を行いながらそのバックアップを取り込みます。その後、新サーバーを再起動して DNS を変更します。Business 以上、REST: POST /api/v1/deploy/live-sync、POST /api/v1/deploy/live-sync/cutover、GET /api/v1/deploy/live-sync。

リファレンス / 構成
nextxch-cli deploy --restore s3://dr-bucket/nextxch/ --scope all --yes                          # 1. full restore (baseline)
nextxch-cli deploy --restore s3://dr-bucket/nextxch/ --live-sync --dry-run                      # remaining delta, changes nothing
nextxch-cli deploy --restore s3://dr-bucket/nextxch/ --live-sync --interval 5m --until-cutover  # 2. follow the old server
nextxch-cli deploy --restore s3://dr-bucket/nextxch/ --cutover                                  # 3. instructions for the freeze
# old server: block ports, then  nextxch-cli backup run --full
nextxch-cli deploy --restore s3://dr-bucket/nextxch/ --cutover --source-frozen                  # 4. last backup, last run

設定、既定値 & ベスト プラクティス

設定 / 場所 説明 既定値 本番環境のベスト プラクティス
Konfigurationssicherung: Versionen (#/protect/config) 更新のたびに前もって自動作成されるバージョン (AutoBeforeUpdate)、変更後に自動作成されるバージョン (AutoAfterChanges、DebounceMinutes 後にまとめて作成) に加え、手動バージョン、インポート、およびすべての復元前の安全用スナップショット。 KeepLast 30 · KeepDailyDays 90 · Debounce 10 min 大きな変更の前には、ラベル付きの手動バージョンを作成し、.zip をサーバーの外に保管してください。
Sicherungsschlüssel (Passphrase / Wiederherstellungsschlüssel) ECDH P-256。秘密部分は封印された状態でのみ存在し (PBKDF2-SHA256、600,000 回の反復、AES-256-GCM)、すべてのパッケージに含まれます。キーもパスフレーズもない場合、構成バックアップにシークレットは含まれません。 nicht eingerichtet · Passphrase ab 12 Zeichen 回復キーを印刷し、サーバーとは別の場所に保管してください。回復キーがないとデータ バックアップを読み取れません。
Datensicherung: Aufbewahrung je Ziel 最新の KeepLast 個のバージョンに加え、直近の KeepHourly 時間、KeepDaily 日、KeepWeekly ISO 週、KeepMonthly か月のそれぞれ最新バージョン (UTC)。 3 / 24 / 7 / 4 / 12 ライブ同期中は少なくとも 2 つのバージョンを保持してください。そうしないと差分を計算できません (BASELINE_GONE)。
S3 Object Lock (ObjectLockMode, ObjectLockDays) オブジェクトは Governance または Compliance モードと保持期限日付きで書き込まれます。再利用される BLOB には延長された日付 (現在 + ロック日数の 1.5 倍) が設定されるため、早すぎる時期に削除可能になるオブジェクトをバージョンが参照することはありません。 Normal · 30 Tage ランサムウェア対策には、バージョニングを有効にした専用バケットで Compliance モードを使用してください。ロックされたオブジェクトは、期限日を過ぎた後の実行でのみ削除されます。
Zeitpläne (Frequency, Type, Scope) 毎時、毎日、毎週、増分または完全、ターゲットと範囲 (サーバー、ドメイン、メールボックス) ごと。時刻はサーバーのローカル時刻で、cron 式は使用しません。 Täglich 02:30 inkr. · Sonntag 03:30 voll 用意されているスケジュールには最初はターゲットがありません。ターゲットを割り当てて有効にしてください。そうしないとバックアップは実行されません。
Automatische Prüfung (VerifyEveryHours, VerifySampleSize) 保存されたハッシュ、エンベロープ ヘッダー、キー ファイル、カタログの署名、およびキーなしでのカタログと BLOB インデックスの読み取り可否を検証します。パスフレーズがあれば、サンプルとすべてのテーブル ファイルも復号されます。 alle 24 h · 50 Objekte AlertOnFailure は有効のままにして、失敗したバックアップや検証の実行がアラート送信先に届くようにしてください。
Parallele Uploads je Sicherung (UploadParallelism) S3 およびディレクトリ ターゲットへの同時アップロード数です。 4 (1 bis 32) 高速回線経由の S3 では 8 から 16、低速な SMB 経由の NAS では 2 から 4 程度にします。
SQL Server: ALLOW_SNAPSHOT_ISOLATION nextxch は起動時にスナップショット分離のオンを試みます。オフの場合、テーブルは READ COMMITTED で 1 つずつエクスポートされ (consistency read-committed)、実行時に警告が報告されます。 an, wenn erlaubt 概要画面にはコピー用の SQL ステートメントが表示されます。スナップショット分離を使用すると、データベースのスナップショットはトランザクション的に一貫します。
RecoverableItemsDays (restore-policy.json) 削除された予定、連絡先、タスク、メモが内容を保持する期間です。期間後は同期用に空の廃棄標識 (tombstone) のみが残ります。論理削除されたメールは、完全に消去されるまで残ります。 14 Tage (nach Upgrade 30) 手順書に記載してください: データ バックアップがない場合、削除されたグループウェア アイテムはこの期間を過ぎると内容が失われます。
Selbstbedienung im Webmail (SelfServiceEnabled, SelfServiceDays) ユーザーは削除したメールやグループウェア アイテムを、[削除済みアイテムの復元] で自分で戻せます (1 回あたり最大 500 件)。サーバー全体またはドメインごとに調整でき、0 日は独自の期間を設けないことを意味します。 an · 0 Tage 厳格な規則のあるドメインでは、期間を設定するか、そのドメインでセルフサービスをオフにしてください。
Beweisexport: Rollen, Umfang, Download エクスポートできるのは ComplianceAuditor、TenantAdmin (自分のテナントのみ)、ServerAdmin です。範囲は search、mailbox、range、legalHold で、最大 100,000 メッセージ (上限 250,000) です。ダウンロード リンクの有効期間は 24 時間です。 includeSoftDeleted true · 24 h 必ず案件参照 (caseReference) を指定してください。署名済みマニフェストと監査ログに記録されます。
Setup:TrustLoopback サーバー自身 (ループバック) からセットアップ ウィザードへの要求を、セットアップ トークンなしで許可します。既定では、すべての要求に first-run/setup-token.txt のトークンが必要です。 false 他のローカル ユーザーがいないホストでのみ設定してください。それ以外の場合は、NEXTXCH_SETUP_TOKEN でトークンを渡してください。
Audit-Log & GoBD すべての手順は監査ログに記録されます: config.backup*、data.backup.*、Compliance.EvidenceExport*、Protect.Restore*、Protect.SelfRestore、Protect.RestorePolicy、setup.*、config.restore。[バックアップ & 復元] > [ログ] で確認できます。GoBD アーカイブはどの復元でも変更されません。 aktiv データ バックアップには、保持とリーガル ホールドを含むアーカイブ マニフェストが格納されます。復元後、アーカイブされたすべてのハッシュが検証され、ロックが再設定されます。