Forgejoのデータのバックアップ&リストア
以下のエントリでForgejoのバックアップ&リストア手順を示します。
DatabaseにPostgreSQLを使用した手順になります。
手動でのバックアップ&リストア、スクリプト化の順に説明します。
Forgejoのセットアップ・PostgreSQLの設定は、 以下エントリの手順を想定しています。
UbuntuLinuxにForgejoをセットアップする手順
https://takemikami.com/2024/03/18/UbuntuLinuxForgejo.html
ForgejoのDBでPostgreSQLを利用する設定方法
https://takemikami.com/2024/03/31/ForgejoDBPostgreSQL.html
試した環境:
- Ubuntu Linux 22.04.3
- Forgejo 1.21.7
- PostgreSQL 14.11
想定環境:
- データディレクトリ: /var/lib/forgejo/data
- PostgreSQLのDB名: forgejo
バックアップ
手動でのバックアップ手順を示します。
サービスを停止します。
sudo systemctl stop forgejo
forgejoユーザになり、バックアップ用のディレクトリを作ります。
sudo su - forgejo
BACKUP_TIMESTAMP=$(date +%Y%m%d%H%M%S)
mkdir -p ~/backup/${BACKUP_TIMESTAMP}
ファイルをバックアップします。
cd /var/lib/forgejo/data
tar czf ~/backup/${BACKUP_TIMESTAMP}/forgejo-data.tar.gz ./
データベースをバックアップします。
pg_dump -d forgejo > ~/backup/${BACKUP_TIMESTAMP}/forgejo-db
gzip ~/backup/${BACKUP_TIMESTAMP}/forgejo-db
参考: 26.1. SQLによるダンプ | PostgreSQL
https://www.postgresql.jp/document/14/html/backup-dump.html
サービスを再開します。
sudo systemctl start forgejo
リストア
手動でのリストア手順を示します。
サービスを停止します。
sudo systemctl stop forgejo
リストア用のバックアップファイルを特定します。
RESTORE_TIMESTAMP=$(sudo su - forgejo -c "ls ~/backup/ | sort | tail -1")
ファイルをリストアします。
tar zxf ~/backup/${RESTORE_TIMESTAMP}/forgejo-data.tar.gz -C /var/lib/forgejo/data
データベースを再作成します。
sudo su - postgres -c psql
> drop database forgejo;
> CREATE DATABASE forgejo WITH OWNER forgejo TEMPLATE template0 ENCODING UTF8 LC_COLLATE 'C.UTF-8' LC_CTYPE 'C.UTF-8';
データベースにデータをロードします。
sudo su - forgejo
cd ~/backup/${RESTORE_TIMESTAMP}
gunzip forgejo-db.gz
psql forgejo < forgejo-db
gzip forgejo-db
サービスを再開します。
sudo systemctl start forgejo
スクリプト化
バックアップとリストア処理をスクリプト化します。
バックアップスクリプト
バックアップ手続きを記載したスクリプトを作成します。
バックアップは3世代分、保存しています。
実運用では、バックアップしたファイル群を、クラウドストレージなど別の場所にもコピーしておくことをおすすめします。
backup_forgejo.sh
#!/bin/sh
BACKUP_TIMESTAMP=$(date +%Y%m%d%H%M%S)
systemctl stop forgejo
su - forgejo -c "mkdir -p ~/backup/${BACKUP_TIMESTAMP} \
&& cd /var/lib/forgejo/data && tar czf ~/backup/${BACKUP_TIMESTAMP}/forgejo-data.tar.gz ./ \
&& /usr/bin/pg_dump -d forgejo > ~/backup/${BACKUP_TIMESTAMP}/forgejo-db && gzip ~/backup/${BACKUP_TIMESTAMP}/forgejo-db \
&& cp ~/custom/conf/app.ini ~/backup/${BACKUP_TIMESTAMP}/app.ini \
&& cd ~/backup/ && ls | sort | head -n -3 | xargs rm -rf"
systemctl start forgejo
スクリプトに実行権限を与えて、定期的に実行するようにcrontabに仕込みます。
リストアスクリプト
リストア手続きをスクリプトにまとめると、以下のようになります。
リストアが必要な時に、これを実行します。
restore_forgejo.sh
#!/bin/sh
RESTORE_TIMESTAMP=$(sudo su - forgejo -c "ls ~/backup/ | sort | tail -1")
read -p "restore forgejo from ${RESTORE_TIMESTAMP} ok? (y/N): " yn
case "$yn" in [yY]*) ;; *) echo "abort." ; exit ;; esac
sudo systemctl stop forgejo
sudo su - postgres -c "\
psql -c \"DROP DATABASE forgejo;\" \
&& psql -c \"CREATE DATABASE forgejo WITH OWNER forgejo TEMPLATE template0 ENCODING UTF8 LC_COLLATE 'C.UTF-8' LC_CTYPE 'C.UTF-8';\""
sudo su - forgejo -c "\
rm -rf /var/lib/forgejo/data/* && tar zxf ~/backup/${RESTORE_TIMESTAMP}/forgejo-data.tar.gz -C /var/lib/forgejo/data \
&& cd ~/backup/${RESTORE_TIMESTAMP} && gunzip forgejo-db.gz && psql forgejo < forgejo-db && gzip forgejo-db.gz"
sudo systemctl start forgejo
以上。