Featured image of post バックアップツールの見直し(rsnapshotからBackrestへ切替検討)

バックアップツールの見直し(rsnapshotからBackrestへ切替検討)

BackrestをDockerで入れたので作業メモ。復元用にホストにresticをバイナリで入れておく必要があるのでその点は注意

これまでLinuxサーバーのバックアップにはrsnapshotを使っていましたが、GUIで設定出来るようにしたいとか外付けHDDを必要なときだけ接続してバックアップ出来るようにしたいとかあって、バックアップツールの見直しを検討。
色々比較したけど扱いやすそうなresticをBackrestで操作するのを基本にしようと環境を構築してみた。

ツール

Backrest

Backrestは、resticをWeb GUIから操作するための管理ツール。
バックアップ処理自体はresticが行ってその管理をBackrestが行う形式。

  • バックアップジョブの設定
  • スケジュール管理
  • 保持世代の設定
  • prune/checkなどのメンテナンス
  • スナップショットの確認
  • 復元

をGUIで行える。
復元も一括操作くらいなら大丈夫そうだけど、個別の世代のファイルを検索かけながら見つけて復元するような使い方は結構難しそうだったので復元が必要な場合はresticを直接CLIで操作してやることで対応する想定。

restic

機能として以下のようなものがあり、rsnapshotではハードリンクで対応していた世代重複の排除をブロック単位での重複排除で出来るようになっているみたい。

  • 暗号化
  • 重複排除
  • 圧縮
  • スナップショット管理
  • 世代管理
  • リポジトリ整合性チェック
  • ローカルディスク、SFTP、S3など多様な保存先への対応

圧縮に関してはあまり期待していない。というのもバックアップ対象が圧縮済みのものが多いのでおそらくほとんど差がでないはず。

独自形式で保存されるけど、restic mountコマンドでスナップショットをディレクトリにマウント出来る。 マウントして中身を通常のシェルから操作可能な状態に出来るのでrsnapshotとそんなに変わらない感覚でファイル単位での復元も可能そう。

インストール

バックアップ用Docker

今回は以下の方針

  • バックアップ用にBackrestをDocker(Docker compose)で構築運用
  • リストアようにホスト側にresticを入れる

Backrestは公式のGitHubページを参照して、公式のDocker composeファイルの記載内容を少しだけ修正して実行。

以下が公式に挙がっているcomposeファイルの内容だけど

  • Volumesの特にバックアップ対象と、出力先のマウント設定
  • TZ設定

あたりだけ修正して実行すれば良い。
バックアップ用としてrootで起動したいのでユーザは指定しない。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
services:
  backrest:
    image: ghcr.io/garethgeorge/backrest:latest
    container_name: backrest
    hostname: backrest
    volumes:
      - ./backrest/data:/data
      - ./backrest/config:/config
      - ./backrest/cache:/cache
      - ./backrest/tmp:/tmp
      - ./backrest/rclone:/root/.config/rclone # Mount for rclone config (needed when using rclone remotes)
      - /path/to/backup/data:/userdata  # Mount local paths to backup
      - /path/to/local/repos:/repos     # Mount local repos (optional for remote storage)
    environment:
      - BACKREST_DATA=/data
      - BACKREST_CONFIG=/config/config.json
      - XDG_CACHE_HOME=/cache
      - TMPDIR=/tmp
      - TZ=America/Los_Angeles
    ports:
      - "9898:9898"
    restart: unless-stopped

ホスト用restic

ホスト用のresticはUbuntu 24.04LTSなのでaptで入れてもいいんだけど、aptで入れるとかなり古いバージョンになってしまいBackrestのdockerでlatestにするとバージョンがかなり違うため相性問題が出ると嫌なので、最新のバイナリをインストールしておく。
バイナリは公式からDLしてインストール。

1
2
sudo install -m 0755 restic /usr/local/bin/restic
restic version

でインストールしてバージョンが表示されればOK。

restic mountを使えるようにするにはfuseがインストールされている必要があるということなのでこれはaptで入れておく。
自分の環境では入っていた。

1
which fusermount 

でなければ

1
sudo apt install fuse3

で良いらしい。

バージョンを上げたい場合は、

1
sudo restic self-update

でアップデート出来るらしいので、次回からはバイナリを探しに行く必要は無いみたい。

設定

docker composeで起動したらブラウザからアクセスすると各種設定を要求されるので適当に入れておく。

バックアップの設定としては、まずバックアップの保存先の指定として「リポジトリ」を作成する。そしてバックアップ元の指定とかスナップショット件数の設定とかは「プラン」で指定・作成する。試していないけど一つのプランで複数のパスが指定できるので、一つのリポジトリに対して複数のバックアップ元を指定することも出来るはず。

その他、プランごとに実行タイミングを変えられるので、一つのリポジトリを対象に複数のプランを設定することも可能なはず。現時点では必要なくて試していないけど。

バックアップデータのマウント

バックアップしたデータをシェルからアクセス出来るようにするには

1
sudo restic -r /snapshot_path mount /mnt/restic

でマウント出来る。
実行後、リポジトリを作成した際に設定したパスワードを要求されるので入力するとマウントされる。注意点として、実行中しかアクセスできないので別ターミナルを開いてアクセスするとかの工夫は必要。

Docker Composeファイルを見ればわかるけれど標準だとrootで実行されるため、バックアップデータはrootで保存される。なので、マウントするときにはsudoが必要だし、マウント後にファイルアクセスするにもsudoが必要。
いくつか対策は考えられるけど、rootで管理したほうがいいとは思うので問題がなければこのまま運用してみる予定。

今後に向けた備考

8TBのHDDが4台?5台?ほど余っているので、定期的に外にバックアップするようにしたい。

このような環境の場合、間違ってマウントされていない状態でマウントポイントにバックアップしてしまうのを防ぐ必要があるので、Backrestのhook処理に

1
mountpoint -q /mnt/backup-usb || exit 1

みたいな感じでマウントの確認チェックを入れておく必要がある。
リポジトリの以下の部分にこの手の設定を入れればいいはず。

Hooks設定項目