誰もがバックアップを持っています。いざ復元しようとするまでは。フォルダーは空っぽ、cron ジョブは 3 月に止まっていた、あるいはアーカイブが今まさに壊れたディスクの上にあった。restic はその大半を解決します。手元で暗号化し、データの各断片を一度だけ保存し、ファイル 1 つの復元をサーバー全体のバックアップと同じくらい簡単にしてくれます。
Ubuntu や Debian で、私たちが本当に信頼できる構成を紹介します。
1. restic をインストールする
apt update && apt install -y restic
restic self-update
ディストリビューションのパッケージは古くなりがちです。self-update で最新版を取得します。
2. リポジトリの置き場所を決める
リポジトリは、守ろうとしているサーバーの上に置いてはいけません。よくある選択肢は 2 つです。
- SFTP 経由の別サーバー:
sftp:backup@203.0.113.20:/srv/restic/web1 - S3 互換のオブジェクトストレージ:
s3:https://s3.example.com/my-bucket/web1
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 プランで足ります。
コメント
まだコメントはありません。最初になりましょう。