オンプレミス環境で運用しているプリザンター+PostgreSQLのバックアップ方法/自動化について構築した内容になります。
今回、自分の環境で実際に構築している メイン/サブ構成でのバックアップ運用を整理してまとめてみました。
環境
メインとサブを同じ環境とします。
- Ubuntu 22.04
- Pleasanter 1.4.15.0
- PostgreSQL 16.8
作業はWindows11のPCからVSCodeのリモートSSHで作業しています。
メインサーバー
一時間に一回cronを実行してバックアップを保存します。
そのdumpをサブへコピーもします。
定期実行の設定
# バックアップフォルダを作り、所有者のみ書き込みとして、postgresを所有者します
sudo mkdir -p /web/pleasanter/backup
sudo chmod 755 /web/pleasanter/backup
sudo chown postgres:postgres /web/pleasanter/backup
# .pgpassを設定します(パスワード入力を省略)
# postgresユーザーのホームに.pgpassを設定します(パスワード入力を省略)
sudo -u postgres nano /var/lib/postgresql/.pgpass
localhost:5432:*:postgres:パスワード
# 所有者のみ読み書きにします
sudo -u postgres chmod 600 /var/lib/postgresql/.pgpass
# フォルダを作成してスクリプトを作ります
sudo mkdir /web/pleasanter/backup_sh
sudo nano /web/pleasanter/backup_sh/pg_backup.sh
# スクリプトは下段参照
# 権限付与
sudo chmod 755 /web/pleasanter/backup_sh/pg_backup.sh
# postgresユーザーcronに登録
sudo crontab -u postgres -e
# 毎時00分に実行
0 * * * * /web/pleasanter/backup_sh/pg_backup.sh
# 手動実行したい場合
sudo -u postgres /web/pleasanter/backup_sh/pg_backup.sh
# cron の動作確認方法(ログの見方)
sudo grep postgres /var/log/syslog
# バックアップファイルの確認
sudo ls -l /web/pleasanter/backup
スクリプト内容
データベースとロール情報のバックアップを保存して、サブへコピーしています。
ロール情報は通常変更するようなことでないので、入れなくていいと思います。
データ容量も大したことなくて、リストアも簡単そうなのでフルバックアップにしています。
運用により差分バックアップの方がいい事もあると思います。
#!/bin/bash
# === 設定 ===
DATE=$(date '+%Y%m%d-%H%M%S')
DBNAME="Implem.Pleasanter"
SAVEPATH="/web/pleasanter/backup/"
PREFIX_DB="Pleasanter-"
PREFIX_ROLE="Pleasanter-role-"
# コピー先サーバー
REMOTE_USER="postgres"
REMOTE_HOST="192.168.11.12"
REMOTE_DIR="/web/pleasanter/backup/"
# === データベース本体のバックアップ ===
/usr/bin/pg_dump -Fc -U postgres -h localhost -p 5432 "$DBNAME" \
> "${SAVEPATH}${PREFIX_DB}${DATE}.dump"
# === ロール情報のバックアップ ===
/usr/bin/pg_dumpall --roles-only -U postgres -h localhost \
> "${SAVEPATH}${PREFIX_ROLE}${DATE}.dump"
# === バックアップファイルをリモートへコピー ===
scp "${SAVEPATH}${PREFIX_DB}${DATE}.dump" \
"${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}"
scp "${SAVEPATH}${PREFIX_ROLE}${DATE}.dump" \
"${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}"
# === 古いバックアップ削除(30日より古いもの) ===
find $SAVEPATH -type f -name "${PREFIX_DB}*.dump" -mtime +30 -exec rm -f {} \;
find $SAVEPATH -type f -name "${PREFIX_ROLE}*.dump" -mtime +30 -exec rm -f {} \;
ssh接続
メインからサブへコピーするのにssh接続の鍵設定が必要になります。
# ufwなどの制限があれば許可するようにします
sudo ufw status verbose
# メイン側でoutをsshだけ許可するようにします
sudo ufw allow out 22/tcp
サブ側はinをsshだけ許可しておきます
sudo ufw allow 22/tcp
# メイン側で鍵作成
sudo -u postgres ssh-keygen -t ed25519
# 確認
sudo -u postgres ls -l /var/lib/postgresql/.ssh/
# メインからサブへ公開鍵を渡します
sudo -u postgres ssh-copy-id postgres@192.168.11.12
# ssh接続の確認
sudo -u postgres ssh postgres@192.168.11.12
サブサーバー
サブ側のcron
メインからコピーされたバックアップファイルを削除するcronを作ります。
メインのスクリプトから削除を入れても同じ事はできるようです。
sudo nano /web/pleasanter/backup_sh/pg_backup.sh
# cronに登録(postgresユーザーで)
sudo crontab -u postgres -e
# 毎日0時0分に実行
0 0 * * * /web/pleasanter/backup_sh/pg_backup.sh
#!/bin/bash
# === 設定 ===
SAVEPATH="/web/pleasanter/backup/"
PREFIX_DB="Pleasanter-"
PREFIX_ROLE="Pleasanter-role-"
# === 古いバックアップ削除(30日より古いもの) ===
find $SAVEPATH -type f -name "${PREFIX_DB}*.dump" -mtime +30 -exec rm -f {} \;
find $SAVEPATH -type f -name "${PREFIX_ROLE}*.dump" -mtime +30 -exec rm -f {} \;
リストア
バックアップしたファイルを使うだけでリストアについては特別なことはないです。
別環境に移す場合はロールの復元が必要なので注意する。
プリザンターのバージョンが違ったら、マイグレーション必要になるので注意する。
cd /web/pleasanter/Implem.CodeDefiner
sudo -u pleasanter /usr/local/bin/dotnet Implem.CodeDefiner.dll _rds /l "ja" /z "Asia/Tokyo"