以下のエントリで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

以上。