小さな復元の範囲を決める
Bash、GNU tar、sha256sum、OpenSSHをUbuntuまたはLinux/WSLクライアントで使います。サーバー用と別PCのクライアント用にターミナルを1つずつ開き、変数を維持するため閉じずに進めます。コマンドが失敗したら止めて確認します。
ホーム以下の破棄可能な2ファイルから始めます。Nginx、通信設定、公開内容は変えず、展開もrootでは行いません。任意の差し替えは静的HTTPS手順の2ファイルだけです。
大きなサイトの画像、リダイレクト、読み込む設定、DNS、依存は別途台帳にします。これはマシンやアプリ全体のバックアップではありません。
サイトを変更せず2ファイルを用意する
サーバーで非公開の練習フォルダーを作ります。次のNginx設定は保存用のテキストで、有効化するものではありません。
umask 077
backup_lab=$(mktemp -d "$HOME/ubuntu-vps-backup.XXXXXX")
mkdir -p "$backup_lab/payload/site" "$backup_lab/payload/nginx" "$backup_lab/export"
printf '%s\n' '<!doctype html><html lang="ja"><title>復元の練習</title><h1>復元した静的ページ</h1></html>' > "$backup_lab/payload/site/index.html"
printf '%s\n' 'server {' ' listen 8080;' ' server_name example.test;' ' root /var/www/first-site;' '}' > "$backup_lab/payload/nginx/first-site.conf"
printf '練習用フォルダー: %s\n' "$backup_lab"実際のチュートリアルのページと設定を保存したい場合だけ、次で練習コピーを差し替えます。両方が読み取り可能で、設定に秘密がないことを確認し、同じリリースになるよう取得中のデプロイを止めます。模擬ファイルの練習なら飛ばします。
install -m 600 /var/www/first-site/index.html "$backup_lab/payload/site/index.html"
install -m 600 /etc/nginx/sites-available/first-site "$backup_lab/payload/nginx/first-site.conf"元ファイルを読み取るだけで、TLS秘密鍵やシステム全体は含みません。必要なファイルを増やすなら台帳とチェックサム一覧の両方へ意図して追加します。
アーカイブと2段階のチェックサムを作る
サーバーでファイルのチェックサムを作り、相対パスでアーカイブ化して、アーカイブ自体のチェックサムも記録します。作成中の内容は変更しません。
(
cd "$backup_lab/payload" &&
sha256sum site/index.html nginx/first-site.conf > SHA256SUMS
)
tar -czf "$backup_lab/export/static-site.tar.gz" -C "$backup_lab/payload" site nginx SHA256SUMS
(
cd "$backup_lab/export" &&
sha256sum static-site.tar.gz > static-site.tar.gz.sha256
)
tar -tzf "$backup_lab/export/static-site.tar.gz"
printf 'サーバー側の書き出し先: %s\n' "$backup_lab/export"一覧にsite/、nginx/、対象2ファイル、SHA256SUMSがあることを確認します。外側のチェックサムは転送されたアーカイブ、内側は展開したファイルを照合します。データと期待する値の両方を置換できる攻撃者に対する認証にはなりません。
別のコンピューターへコピーする
クライアントでremote_backupをサーバーが表示した正確な書き出し先へ変更します。IP、アカウント、鍵も実際のものにします。203.0.113.10は文書用で、REPLACEはmktempが生成した末尾ではありません。
umask 077
recovery_dir=$(mktemp -d "$HOME/ubuntu-vps-restore.XXXXXX")
remote_backup=/home/deploy/ubuntu-vps-backup.REPLACE/export
scp -i ~/.ssh/ubuntu_vps "deploy@203.0.113.10:$remote_backup/static-site.tar.gz" "$recovery_dir/"
scp -i ~/.ssh/ubuntu_vps "deploy@203.0.113.10:$remote_backup/static-site.tar.gz.sha256" "$recovery_dir/"新しい接続先のホスト鍵を信頼できる経路で確認します。転送がSSHで失敗するなら接続診断を使い、鍵確認を無効にしません。
SCPの通信はSSHで保護されますが、tar.gz自体は圧縮であり暗号化ではありません。保存先のアカウントとストレージを保護し、必要なら保存時暗号化を使います。同じVPS内の別フォルダーはサーバー外コピーになりません。
検証して新しい空フォルダーへ復元する
クライアントで展開前にアーカイブを確認します。sha256sumがOKなら進み、失敗なら調査または再転送します。失敗を隠すため期待値を上書きしません。
(
cd "$recovery_dir" &&
sha256sum -c static-site.tar.gz.sha256
)
tar -tzf "$recovery_dir/static-site.tar.gz"信頼できるこのアーカイブを、新しく作ったフォルダーへ展開します。keep-old-filesは既存ファイルの置換を拒み、no-same-ownerは保存時の所有者を復元しません。展開先を/へ変えたりsudoで実行したりしないでください。
restore_dir=$(mktemp -d "$recovery_dir/restored.XXXXXX")
tar -xzf "$recovery_dir/static-site.tar.gz" -C "$restore_dir" --keep-old-files --no-same-owner
(
cd "$restore_dir" &&
sha256sum -c SHA256SUMS
)
cat "$restore_dir/site/index.html"site/index.htmlとnginx/first-site.confの両方がOKとなり、復元したページ見出しが出ることを確認します。ファイルの内容を確認するテストで、本番の所有者、ACL、サービス、全依存を確認するものではありません。
ファイル復元とサービス復旧を分ける
戻した設定はまだ無効なテキストです。別の代替サーバーでパス、include、モジュール、権限、証明書を確認し、組み立てたNginx設定をテストしてから再読み込みします。その環境へ外部HTTP/HTTPSで接続します。元のサーバーの構文テストでは復元先は検証できません。
TLS秘密鍵は含めていません。再発行か、別途保護された証明書バックアップを計画します。稼働中のDBファイルをこのtar手順で直接コピーせず、DBが対応する整合性のある保存・復元を使います。
スナップショットも保持期間、障害の影響範囲、復元手順を確認します。存在するだけで、書き出したサイトが別ホストに戻る証明にはなりません。
目標と実際の結果を記録する
RPOは許容できるデータ損失を時間で表す目標、RTOはサービスを戻す目標時間です。小さな静的情報サイトならRPO 24時間、RTO 60分などを仮定できますが、これは実測結果ではありません。毎日のバックアップも、成功し復元可能なコピーが残って初めて意味があります。
表を横にスクロールすると、残りの項目を確認できます。
| 記録 | 確認できること |
|---|---|
| 取得時刻とリリースID | どの版へ戻せるか |
| 独立した保存先と保持期間 | どこにどのくらい残るか |
| アーカイブとファイルの照合 | 対象バイト列が戻ったか |
| 復元の開始・終了 | 定義した作業の実時間 |
| 不足ファイル、権限、依存 | サービス復旧前の残作業 |
| 代替環境への外部HTTPS | サイトが実際に復帰したか |
アクセス、VM作成、設定、証明書、必要ならDNSまで含めて全工程を計測します。ローカルの高速な展開は障害復旧のベンチマークではありません。複数世代を適切に保持し、失敗通知と保存・復元支援の費用も確認します。
よくある質問
元サイトを消して試す必要がありますか?
ありません。別の空フォルダーに展開して照合すれば、停止を起こさずファイルコピーを試せます。サービス全体は別の代替環境で検証します。
チェックサム成功でサイト全体を保存できたと分かりますか?
対象一覧のファイルだけを確認します。含め忘れた画像、DB、秘密、DNSは検出できないため、台帳と復旧後の機能確認が必要です。
同じVPSにコピーすれば十分ですか?
サーバー外のコピーにはなりません。別の保存先から取り出して、復元できることを確認します。
模擬ファイルのGNUアーカイブとチェックサム処理はWindowsのGit Bashでローカル検証されたものです。Ubuntuサーバー、遠隔SSH転送、証明書復旧、Nginx有効化をその試験で実行したわけではありません。