−25%

Windows 年払い、10月31日まで。 プランを見る

EQVPS

restic で VPS をバックアップする方法(暗号化・サーバー外保管)

restic による暗号化・重複排除つきの VPS バックアップ。S3 互換ストレージや別サーバーのリポジトリ、systemd タイマー、保持ルール、復元テストまで。

誰もがバックアップを持っています。いざ復元しようとするまでは。フォルダーは空っぽ、cron ジョブは 3 月に止まっていた、あるいはアーカイブが今まさに壊れたディスクの上にあった。restic はその大半を解決します。手元で暗号化し、データの各断片を一度だけ保存し、ファイル 1 つの復元をサーバー全体のバックアップと同じくらい簡単にしてくれます。

Ubuntu や Debian で、私たちが本当に信頼できる構成を紹介します。

1. restic をインストールする

apt update && apt install -y restic
restic self-update

ディストリビューションのパッケージは古くなりがちです。self-update で最新版を取得します。

2. リポジトリの置き場所を決める

リポジトリは、守ろうとしているサーバーの上に置いてはいけません。よくある選択肢は 2 つです。

3. 認証情報を保存する

タイマーとシェルが同じ設定を使えるよう、root だけが読めるファイル 1 つにまとめます。

cat > /root/.restic-env <<'EOF'
export RESTIC_REPOSITORY="s3:https://s3.example.com/my-bucket/web1"
export RESTIC_PASSWORD_FILE="/root/.restic-pass"
export AWS_ACCESS_KEY_ID="your-key-id"
export AWS_SECRET_ACCESS_KEY="your-secret"
EOF
openssl rand -base64 32 > /root/.restic-pass
chmod 600 /root/.restic-env /root/.restic-pass

ここで /root/.restic-pass の中身をパスワードマネージャーにコピーしてください。これがなければバックアップは復号できません。あなたにも、他の誰にも。

4. 初期化して最初のバックアップを取る

source /root/.restic-env
restic init
restic backup /etc /home /root /srv /var/www \
  --exclude-caches --exclude '/root/.cache'
restic snapshots

パスは実際にデータがある場所に合わせてください。Docker のボリュームは /var/lib/docker/volumes に、アプリのデータは /srv や /opt にあることが多いです。

5. データベース:先にダンプ、それからバックアップ

稼働中のデータベースの生ファイルをバックアップしてはいけません。バックアップの直前にダンプを取ります。

mkdir -p /var/backups/db
sudo -u postgres pg_dump -Fc mydb > /var/backups/db/mydb.dump

/var/backups/db をバックアップ対象に加えます。ダンプについては PostgreSQL のガイドで詳しく扱っています。

6. systemd でスケジュールする

ここでは cron よりタイマーが有利です。journal にログが残り、予定時刻にサーバーが止まっていた場合も後から実行してくれます。

# /etc/systemd/system/restic-backup.service
[Unit]
Description=restic backup

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'source /root/.restic-env && restic backup /etc /home /root /srv /var/www /var/backups/db --exclude-caches && restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune'
# /etc/systemd/system/restic-backup.timer
[Unit]
Description=Daily restic backup

[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true

[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now restic-backup.timer
systemctl list-timers restic-backup.timer

forget --prune は日次 7 個、週次 4 個、月次 6 個のスナップショットを残し、残りを削除します。データベースのダンプ手順があるなら、ExecStartPre= の行に書いてください。

7. 実際に何かを復元する

「バックアップはある」を事実に変えるのがこの手順です。ディレクトリを 1 つ一時フォルダーに戻して中身を見ます。

source /root/.restic-env
restic restore latest --target /tmp/restore-test --include /etc/nginx
ls -la /tmp/restore-test/etc/nginx
restic check

今一度やって、その後も数か月ごとに繰り返しましょう。restic check はリポジトリの構造を検証し、復元はデータが本当にそこにあることを証明します。

restic と Managed Backups

この 2 つは競合しません。Managed Backups はサーバー全体の復元ポイントを毎日作り、ダッシュボードから巻き戻せます。失敗したアップグレードからすばやく立ち直る手段です。料金は月 $2 で、年間プランにはすべて無料で含まれます。restic は自分で管理するストレージにファイル単位のサーバー外コピーを残します。先週の火曜に消したファイルが問題のときや、私たちのインフラの完全に外側にコピーを置きたいときに効いてきます。

機密データを扱うならディスク全体の暗号化と組み合わせるか、自前のバックアップ先を運用する暗号化ストレージの活用例を参考にしてください。たいていの小さなサーバーとそのバックアップ処理には Micro プランで足ります。

よくある質問

restic のパスワードをなくしたらどうなりますか?

バックアップは永久に失われます。restic はすべてをクライアント側で暗号化し、復旧用の鍵はありません。パスワードはバックアップ対象のサーバーだけでなく、パスワードマネージャーに保管してください。

リポジトリはどこに置くべきですか?

そのサーバー自身以外ならどこでも。S3 互換のオブジェクトストレージ、SFTP 経由の別の VPS、自宅のマシンなどです。同じディスク上のバックアップは、そのディスクと運命を共にします。

restic でデータベースをバックアップするには?

先にダンプを取り、そのダンプをバックアップします。PostgreSQL なら 'pg_dump -Fc'、MySQL なら 'mysqldump --single-transaction'。稼働中のデータベースのファイルをそのままコピーすると、起動しないバックアップになることがあります。

バックアップはどのくらい容量を使いますか?

思うより少なく済みます。restic はファイルをチャンクに分け、各チャンクを一度だけ保存するので、ほとんど変化のないサーバーの日次スナップショットでは変更分しか増えません。

それでも Managed Backups は必要ですか?

解決する問題が違います。Managed Backups はサーバー全体の日次の復元ポイントで、ダッシュボードから巻き戻せます。restic は自分で管理するファイル単位のサーバー外コピーです。両方使う人も多いです。

コメント

まだコメントはありません。最初になりましょう。

コメントを残す

コメントは表示される前にモデレートされます。