バックアップとリストア
セルフホスティングの Nodaro を 1 つのコマンドでバックアップし、別のコマンドでリストアして、安全にダウングレードする方法です。アーカイブの中身と、そのキーの守り方も説明します。
セルフホスティングの Nodaro は、1 つのコマンドでバックアップし、もう 1 つのコマンドでリストアします。バックアップのアーカイブには、スタックが作り直せないものがすべて入ります。データベース、メディア、インスタンスの暗号化キー、.env です。データベースのマイグレーションは前方向にしか進まないため、リストアはダウングレードの唯一の方法でもあります。以前のバージョンに戻すには、アップデートの前に取ったバックアップをリストアします。
バックアップの内容
tools/community-backup.sh は、1 つの tar.gz アーカイブを書き出します。
| アーカイブ内のファイル | 内容 |
|---|---|
db.dump | pg_dump のカスタム形式による Postgres のデータです。ワークフロー、ユーザー、ジョブ、メディアのレコードが含まれます |
minio-data.tar | 生成したメディアです。画像、動画、オーディオが含まれます |
encryption-key | プロバイダーキーと SNS のログイントークンを暗号化する、インスタンスのキーです。このキーなしでリストアしたデータベースには、誰にも読めない行が残ります。 |
env | .env です。プロバイダーキーとシークレットが含まれます |
manifest.json | アプリのバージョンとバックアップの日時です。リストア用のスクリプトが使います |
Redis は意図的に含めていません。Redis が保持するのは、一時的なジョブの状態だけだからです。
アーカイブは認証情報そのものです
アーカイブには、.env と暗号化キーが含まれます。スクリプトは、ファイルのアクセス権を所有者だけに制限します(chmod 600)。この設定を変えずに、アーカイブはパスワードと同じように保管してください。Windows では、chmod は実質的に効果がありません。ファイルを同期フォルダーや共有ドライブに置かないでください。ほかの人もそのコンピューターを使う場合は、NTFS のアクセス許可で制限してください。
バックアップを取る
スタックを起動したまま、docker-compose.community.yml があるインストールディレクトリで、次を実行します。
tools/community-backup.sh
# -> ./backups/nodaro-backup-<date>-v<version>.tar.gz| オプション | 動作 |
|---|---|
tools/community-backup.sh /path/to/backups | アーカイブを別のディレクトリに書き出します |
COMPOSE_FILE=my-compose.yml tools/community-backup.sh | 別の名前の Compose ファイルを使います |
スクリプトは、アーカイブに入れたものを表示します。暗号化キーが見つからない場合は、そのことを目立つように表示し、エラーで終了するので、スケジュール実行のジョブでも気付けます。そのアーカイブでは、プロバイダーキーをリストアできません。
データベースのダンプは、常に整合性が保たれています。一方、バックアップの実行中に書き込まれたメディアは、アーカイブに入らないことがあります。メディアのスナップショットの整合性を確実に保つには、先にアプリを停止します。
docker compose -f docker-compose.community.yml stop nodaroWindows では、Git for Windows がインストールするシェル、Git Bash からスクリプトを実行してください。PowerShell や WSL の bash では、コンテナのパスが壊れます。
バックアップのタイミング
メジャーバージョンのアップデート(最初の数字が変わるもの)の前には、必ずバックアップを取ります。それとは別に、データの重要度に見合ったスケジュールでも取ってください。次の cron の設定は、そのまま使えます。
0 3 * * * cd /path/to/install && tools/community-backup.sh >> backup.log 2>&1バックアップをリストアする
tools/community-restore.sh backups/nodaro-backup-<date>-v<version>.tar.gzリストアは、データベースとメディアをアーカイブの内容で置き換えます。そのため、何かに手を付ける前に、RESTORE と入力するよう求めます。そのあと、次の処理を行います。
- アプリと、データベースのクライアントである
authとrestを停止します。これらが開いている接続があると、リストアが妨げられるためです。 - Postgres をリストアし、終了コードを当てにせず、実際に動作することを確認します。Supabase のイメージから無害なメッセージがいくつか出力されますが、これは想定どおりです。
- メディアをリストアし、バケットが元に戻り、MinIO が正常に動いていることを確認します。次に暗号化キーをリストアし、ボリューム上のサイズを確認します。続いて、既存の
.envがあれば別の場所に退避してから、.envをリストアします。確認に失敗すると、スクリプトはアプリを起動する前に止まります。正しいキーがないままアプリを起動すると、新しいキーが作られ、リストアしたプロバイダーキーはすべて二度と読めなくなるためです。 - すべてを再び起動し、アプリ自身のヘルスチェックを待ちます。スクリプトが成功を報告するのは、アプリが起動してからです。起動しなかった場合は、エラーで終了します。
完了したら、http://localhost:3000/setup を開きます。すべてのカードが緑になっているはずです。
バージョンをダウングレードする
マイグレーションのロールバックはありません。以前のバージョンに戻すには、次の手順を実行します。
- 上記の手順で、アップデートの前に取ったバックアップをリストアします。
NODARO_IMAGEかdocker-compose.community.ymlで、古いイメージ(たとえばghcr.io/nodaroai/nodaro-community:v1.25.1)に固定します。vX.Y.Z形式の厳密なタグが指すイメージは、変わることがありません。docker compose -f docker-compose.community.yml up -d nodaroを実行します。
タグについては、アップデートを参照してください。
マネージド構成のバックアップ
Compose スタックを使わない構成では、状態を持つものが 4 つあります。
| 対象 | 保護の方法 |
|---|---|
| Supabase の Postgres:ワークフロー、プロフィール、ジョブ、メディアのレコード | 有料プランで使える Supabase のポイントインタイムリカバリを使うか、定期的に pg_dump を実行します。これが最も重要なバックアップです。 |
| ストレージのバケット:生成した画像、動画、オーディオ | バケットのバージョニングと、保持期間の長いライフサイクルルールを有効にして、削除したファイルを復元できるようにします。災害復旧が必要な場合は、リージョン間レプリケーションも追加します。 |
| Redis | バックアップするものはありません。Redis が保持するのは、一時的なジョブの状態だけです。Redis を失うと実行中の処理は失敗しますが、それ以外はすべて、次の起動時に Postgres から復旧します。 |
インスタンスの暗号化キー(NODARO_ENCRYPTION_KEY) | Postgres のバックアップと一緒に保管します。このキーがないと、リストアした行のうち、プロバイダーキー、SNS のログイントークン、Webhook 出力(Webhook Output)の認証情報を読めません。その場合、タイルには missing と表示され、キーを入力し直す必要があります。ほかに壊れるものはありません。 |
マイグレーションや復旧の最中に Postgres が停止していると、API はデータベースに接続できるまで再起動を繰り返します。Postgres が復旧したら、Nodaro のコンテナを再起動してください。
トラブルシューティング
the db service is not runningと表示される:先にスタックを起動します。docker compose -f docker-compose.community.yml up -dを実行してください。- リストア後、プロバイダーキーが
missingと表示される:データベースが、対応するencryption-keyなしで、または別のキーでリストアされています。キーを含むアーカイブからリストアするか、/setupでキーを入力し直してください。 - リストアの検証に失敗した:スクリプトは、中途半端にリストアされたデータベースを黙って残すことはしません。リストアをもう一度実行してください。何度も失敗する場合は、アーカイブが途中で切れている可能性があります。元のファイルとサイズを比べてください。
- Windows でのバックアップ中に
could not read the encryption keyと表示される:Git Bash を使っていないか、アプリのコンテナが動いていません。スタックを起動した状態で、Git Bash からもう一度バックアップを実行してください。スクリプトが警告したアーカイブは、バックアップとして使えません。 media restore verification FAILEDまたはencryption key verification FAILEDと表示される:スクリプトは意図的に停止し、アプリを起動していません。表示されたボリュームを確認し、原因(多くの場合、停止したコンテナか空きのないディスク)を取り除いてから、リストアをもう一度実行してください。何度実行しても安全です。
よくある質問
関連ページ
アップデート
データベース
プロバイダーキー
トラブルシューティング
最終更新