バックアップ

おはようございます。waturaです。突然ですがバックアップは大切です。バックアップは1つではなくていくつも取るべきです。
そして、ときおりバックアップから復元する方法を復習しておくべきです。
さもなくば。。。

バックアップで使っているもの

BlueskyやGotosocial(Mastodon)をセルフホストしているので、バックアップはしっかり取る必要があります。

データのありか

  • Postgresql

  • SQLite

  • その他ファイル類

SNS以外にも細々バックアップをとっておきたいものや、設定ファイル自体もバックアップをとりたかったのでとっています。

ツール

  • systemd

  • Restic

  • pg_dumpall

これらを使ってバックアップをとっています。
バックアップするファイルや接続に使う環境変数は以下のファイルに保存しています。

  • /etc/restic/backup.files

  • /etc/restic/backup.env

/etc/systemd/system/restic.service

バックアップは10件くらいに抑えています。なお、Cloudflare R2の無料tierで運用しています。

[Unit]
Description=Restic backup
After=syslog.target
After=network-online.target

[Service]
Type=oneshot
User=restic
ExecStart=/usr/bin/restic backup --files-from /etc/restic/backup.files
EnvironmentFile=/etc/restic/backup.env
AmbientCapabilities=CAP_DAC_READ_SEARCH

[Install]
WantedBy=multi-user.target

これをsystemctl start resticとかで、実行すると1回だけ実行できます。

タイマー実行

/etc/systemd/system/restic.timer
12時に実行するようにしてみています。

[Unit]
Description=Run Restic at 12:00 AM
[Timer]
OnCalendar=--* 0:00:00
[Install]
WantedBy=timers.target

Psqlのバックアップについては、pg_dumpallを呼び出すスクリプトを使ってresticに渡しています。
ChatGPTにワンライナーをリファクタリングして!って渡したコードを貼っておきます。


#!/usr/bin/env bash

# スクリプトのパラメータとしてホスト名を指定します。
HOST_NAME=$1

# PostgreSQLの全データベースをダンプするコマンド
PG_DUMP_CMD="/usr/bin/sudo -u postgres /usr/bin/pg_dumpall --clean"

# gzipを使用してダンプファイルを圧縮するコマンド
GZIP_CMD="gzip --rsyncable"

# resticを使用してバックアップを作成するコマンド
RESTIC_CMD="/usr/bin/restic backup --host ${HOST_NAME} --stdin --stdin-filename postgres-${HOST_NAME}.sql.gz"

# ダンプ、圧縮、バックアップのプロセスを実行
${PG_DUMP_CMD} | ${GZIP_CMD} | ${RESTIC_CMD}

こんな感じなのを毎日実行してバックアップを取るようにしました。

戻す時は、psqlで流し込みとかファイルを置き換えるとかになります。

という感じで、バックアップを取るようにしました。

セルフホストで動いているサービスは基本、dockerで動いているので、物理的に壊れてもすぐに復帰できそうな感じになりました。

まとめ

  • バックアップは大切

  • リストアも大切

  • resticを使ってCloudFlare r2にアップロード

  • systemdで毎日自動実行

という感じでセルフホストRPiのバックアップを行っています。