バックアップと障害復旧
これはトレード/金融アプリです: データベースはトレーディングアカウント、コピープロファイル、prop-firm チャレンジ、監査チェーン、データ保護キーリングを保有しています。それを失うことはお金を失い、規制/監査義務を破ります。それをバックアップし、復元が機能することを証明してください。
ターゲット
| メトリック | ターゲット | 意味 |
|---|---|---|
| RPO(最大データロス) | ≤ 5 分 | ポイントインタイム復旧(連続 WAL)、夜間ダンプのみではなく。 |
| RTO(最大ダウンタイム) | ≤ 1 時間 | 復旧時間 + アプリを復元されたデータベースに再指す。 |
| バックアップ保有期間 | ≥ 35 日 | 遅く発見された破損 + 月間監査ウィンドウをカバー。 |
| 復元ドリル | 月次 | テストされていないバックアップはバックアップではありません。 |
バックアップする必要があるもの
- Postgres データベース — すべてのアプリデータ(シングル論理データベース
appdb)。 - データ保護キーリング — データベース内に永続化(
PersistKeysToDbContext<DataContext>)し、PFX 暗号化経由(App:DataProtectionCertBase64)。 DB バックアップで乗車ですが、保護証明書 + その パスワード(App:DataProtectionCertPassword)は DB 外に保存されたシークレットです — シークレットマネージャーでバックアップしてください。証明書がなければ復元後のシークレット(cTID パスワード、Open API トークン、ノードシークレット、AI キー)を復号化できません。
管理 Postgres(推奨)
両方のクラウド IaC パスは組み込み PITR で管理 Postgres をプロビジョン — 有効化 + 保有期間を検証:
- Azure(
deploy/azure/main.bicep、フレキシブルサーバー):backup.backupRetentionDays(≥ 35)およびgeoRedundantBackupコンプライアンスが必要なところを設定します。ポイントインタイム復旧で新規サーバーに復旧、その後アプリのappdb接続文字列を更新します。 - AWS(
deploy/aws、RDS Postgres、Terraform):backup_retention_period(≥ 35)およびbackup_windowを設定します。自動バックアップ + オプションのクロスリージョンコピーを保ちます。RestoreDBInstanceToPointInTime で復旧、その後アプリを再指します。
管理 PITR は アプリ変更なしで ≤ 5 分 RPO を与えます — アプリは新しい接続文字列のみが必要です。(そして既存の再試行実行戦略、scaling.mdを参照、カットオーバーブリップを許容します)。
自己ホスト型 Postgres
- 連続アーカイビング(PITR): WAL アーカイビング(
archive_mode=on、archive_commandをオブジェクトストレージに)+ 定期的pg_basebackupを有効化します。復旧 = ベースバックアップを復旧 + WAL をターゲット時間にリプレイ。これが RPO ターゲットを満たすものです。 - 論理ダンプ(二次): 移植性 / 部分復旧用に夜間
pg_dump -Fc appdbをボックス外ストレージに。単独では RPO ターゲットに十分ではありません。 - 保存中のバックアップを暗号化; データベースホスト外に保存します。
復元ドリル(月次実行)
- 最新のバックアップ(「今 − 10 分」に PITR)をスクラッチデータベース に復旧します。本番環境ではなく。
- 一時的なアプリインスタンス(または psql セッション)をそれに指します。
- スキーマを検証:
dotnet ef migrations listはペンディング移行を表示しない、アプリは起動して/health-ready になります。 - 監査チェーンを検証
IAuditTrailVerifier(改ざん防止AuditChainInterceptorチェーン)経由で完全でなく — 復元後の破損チェーンは破損または改ざんを意味します。 - シークレット復号化が機能するか(例:Open API 許可が復号化される)を確認 — データ保護証明書 + パスワードが正しく復元されたことを証明。
- ドリル結果を記録(RTO と比較した時間)、スクラッチデータベースを破棄します。
ステップ 1–4 をシードバックアップを Testcontainer に復旧、dotnet ef migrations list + 監査チェーン検証を実行するところで CI で自動化、壊れたバックアップ回帰が必要になる前に検出されます。
実際の復元後
- DB を復旧(インシデント直前に PITR)。
- データ保護証明書 + パスワードが、インシデント前に使用されているのと同じものであることを確認してください。
- アプリ
appdb接続文字列を再指します。レプリカをロールします。 - スタートアップはアドバイザリロック(scaling.md を参照)の下で移行を実行 — N レプリカで安全です。
- Copy/prop-firm スーパーバイザーはリースを再クレームし、ブローカーからの再シンク(cTrader がソースの真実)、開いているポジションが自動的に再統合 — 古いローカル状態から信頼は何もありません。
- 監査チェーン + 最近のトレーディングデータをスポットチェック。