Redmineのファイル一式の日次バックアップ。
バージョン 2 (手動人形, 2023/02/10 15:25) → バージョン 3/13 (手動人形, 2023/02/10 15:29)
## 概要
Redmineのメンテナンスの中で重要となるDBのバックアップは記載しました。
ここでは、それ以外のファイル一式をバックアップするスクリプトを作成することで不測の事態に備えます。
### バックアップ対象となるファイル群
基本的に、以下のファイル群が残っていれば復旧は(理論上)可能です。
- /Redmine格納ディレクトリ/plugins配下一式
- /Redmine格納ディレクトリ/files配下一式
- /Redmine格納ディレクトリ/public/themes配下一式
- /Redmine格納ディレクトリ/config/database.yml
- /Redmine格納ディレクトリ/config/configuration.yml (メール設定などで設定している場合)
- /Redmine格納ディレクトリ/config/additional_environment.rb (プラグインなどで追記している場合)
## 本記事で扱うこと
1. 先に述べたバックアップ対象となるファイル群の定期バックアップを行うシェルスクリプトを作成します。
1. バックアップ時、パスワードが書かれているコンフィグに関してはその箇所をマスクします。(これもスクリプトに組み込みます)
1. 動作を確認し、cronに設定して日次でバックアップを行います。
## 動作を確認した環境
- Ubuntu 20.04 LTS
- Redmine 4.2
### 実施前提
- 利用しているRedmine環境の容量を確認し、バックアップ先に十分な空き容量があることを確認してください。
- 本スクリプトは「全てのデータを一時的なバックアップディレクトリにコピーした上で圧縮し、そのディレクトリは削除する」処理を取っています。その容量も加味してください。
- バックアップ元(Redmine格納ディレクトリ)の所有者が全てRedmine実行ユーザ(通例はwww-data)となっていることを確認してください。
- また、本記事において、Redmineの格納ディレクトリは/home/www-data/redmineと一般的な構成と異なっております。
## 確認した手順
- Redmineが稼働しているUbuntuサーバのターミナル上での操作です。
### さっくりとした手順
1. バックアップディレクトリを作成します。
1. バックアップスクリプトを作成します。(環境に合わせて修正します)
1. crontabに登録します。
#### バックアップディレクトリ作成
```bash
sudo mkdir -p /home/backup/redmine
# 運用に合わせて指定ください
sudo chown -R www-data:www-data /home/backup/redmine
# Redmineディレクトリの所有者に設定します
cd /home/backup/redmine && pwd
# 指定したディレクトリに移動します
```
#### スクリプト作成
以下の内容を教義・信仰に沿ったエディタで作成します。
- スクリプト内容
- スクリプト名:redmine_daily_backup.sh
- 実行ユーザ:Redmineの所有者 (通例はwww-dataです)
```bash
#!/bin/bash
### ▼ここからはスクリプトの変数を定義します。""の記述は自身の環境に合わせて修正ください。▼ ###
backup_dir="/home/backup/redmine"
# ↑バックアップ先のディレクトリを指定します。
redmine_dir="/home/www-data/redmine"
# ↑バックアップ元のRedmineが格納されているディレクトリを指定します。
current_date=$(date +%Y%m%d)
backup_name="redmine_backup_${current_date}"
zip_file="redmine_backup.${current_date}.zip"
# ↑ ファイルに付与する日付/作業ディレクトリ名/バックアップファイル名を指定します。
### ▲変数はここまでです▲ ###
mkdir "${backup_dir}/${backup_name}"
# 一時的なバックアップディレクトリを作成します。
cp -R "${redmine_dir}/plugins" "${backup_dir}/${backup_name}"
cp -R "${redmine_dir}/files" "${backup_dir}/${backup_name}"
cp -R "${redmine_dir}/public/themes" "${backup_dir}/${backup_name}"
# Redmineのバックアップディレクトリバックアップディレクトリにコピーします。
cp $redmine_dir/config/database.yml $backup_name
sed -i 's/password:.*/password: "type your db password"/' $backup_name/database.yml
# マイグレーション時に必要となるdatabase.ymlをコピーします。この時、パスワードが書かれている行をマスクします。
if [ -f $redmine_dir/config/configuration.yml ]; then
cp $redmine_dir/config/configuration.yml $backup_name
sed -i 's/password:.*/password: "type your password"/' $backup_name/configuration.yml
fi
# メール設定などでconfiguration.ymlを設定している場合、これもコピーします。(存在しない場合はコピーしません)
# 同様にパスワードが書かれていたらその行はマスクします。
if [ -f $redmine_dir/config/additional_environment.rb ]; then
cp $redmine_dir/config/additional_environment.rb $backup_name
fi
# プラグイン設定などでadditional_environment.rbを設定している場合、これもコピーします。(存在しない場合はコピーしません)
cd "${backup_dir}"
zip -r "${zip_file}" "${backup_name}"
# バックアップディレクトリをzip形式で圧縮します。
rm -rf "${backup_dir}/${backup_name}"
# 一時的なバックアップディレクトリを削除します。
find "${backup_dir}" -type f -name "redmine_backup.*.zip" -mtime +10 -delete
# 10世代前に作られたzipファイルを削除します。ディスク容量などに合わせて調整ください。
```
- 実行権限の付与
```bash
chmod +x redmine_daily_backup.sh
```
#### 動作確認
```bash
sudo -u www-data bash redmine_daily_backup.sh
```
以下を確認します。
- エラーなく実行できること
- redmine_backup.実行日付.zip形式でファイルが作成されること
- sudo -u www-data unzip redmine_backup.実行日付.zipでファイルが解凍されディレクトリに移動できること
- ymlファイルのパスワードが「type your (db) password」と本来のパスワードが上書きされていること
### Crontab設定
#### Cron登録
```bash
sudo crontab -e -u www-data
```
#### 登録内容例
```
5 0 * * * /home/backup/redmine/redmine_daily_backup.sh
# 実行時刻、頻度などは自分の運用形態に合わせます。
```
#### Cron登録確認
```bash
sudo tail -20 /var/log/cron.log
```
操作時刻に
- BEGIN EDIT
- REPLACE
- END EDIT
が表示されれば設定は完了です。
### 動作確認日
2023/02/08
Redmineのメンテナンスの中で重要となるDBのバックアップは記載しました。
ここでは、それ以外のファイル一式をバックアップするスクリプトを作成することで不測の事態に備えます。
### バックアップ対象となるファイル群
基本的に、以下のファイル群が残っていれば復旧は(理論上)可能です。
- /Redmine格納ディレクトリ/plugins配下一式
- /Redmine格納ディレクトリ/files配下一式
- /Redmine格納ディレクトリ/public/themes配下一式
- /Redmine格納ディレクトリ/config/database.yml
- /Redmine格納ディレクトリ/config/configuration.yml (メール設定などで設定している場合)
- /Redmine格納ディレクトリ/config/additional_environment.rb (プラグインなどで追記している場合)
## 本記事で扱うこと
1. 先に述べたバックアップ対象となるファイル群の定期バックアップを行うシェルスクリプトを作成します。
1. バックアップ時、パスワードが書かれているコンフィグに関してはその箇所をマスクします。(これもスクリプトに組み込みます)
1. 動作を確認し、cronに設定して日次でバックアップを行います。
## 動作を確認した環境
- Ubuntu 20.04 LTS
- Redmine 4.2
### 実施前提
- 利用しているRedmine環境の容量を確認し、バックアップ先に十分な空き容量があることを確認してください。
- 本スクリプトは「全てのデータを一時的なバックアップディレクトリにコピーした上で圧縮し、そのディレクトリは削除する」処理を取っています。その容量も加味してください。
- バックアップ元(Redmine格納ディレクトリ)の所有者が全てRedmine実行ユーザ(通例はwww-data)となっていることを確認してください。
- また、本記事において、Redmineの格納ディレクトリは/home/www-data/redmineと一般的な構成と異なっております。
## 確認した手順
- Redmineが稼働しているUbuntuサーバのターミナル上での操作です。
### さっくりとした手順
1. バックアップディレクトリを作成します。
1. バックアップスクリプトを作成します。(環境に合わせて修正します)
1. crontabに登録します。
#### バックアップディレクトリ作成
```bash
sudo mkdir -p /home/backup/redmine
# 運用に合わせて指定ください
sudo chown -R www-data:www-data /home/backup/redmine
# Redmineディレクトリの所有者に設定します
cd /home/backup/redmine && pwd
# 指定したディレクトリに移動します
```
#### スクリプト作成
以下の内容を教義・信仰に沿ったエディタで作成します。
- スクリプト内容
- スクリプト名:redmine_daily_backup.sh
- 実行ユーザ:Redmineの所有者 (通例はwww-dataです)
```bash
#!/bin/bash
### ▼ここからはスクリプトの変数を定義します。""の記述は自身の環境に合わせて修正ください。▼ ###
backup_dir="/home/backup/redmine"
# ↑バックアップ先のディレクトリを指定します。
redmine_dir="/home/www-data/redmine"
# ↑バックアップ元のRedmineが格納されているディレクトリを指定します。
current_date=$(date +%Y%m%d)
backup_name="redmine_backup_${current_date}"
zip_file="redmine_backup.${current_date}.zip"
# ↑ ファイルに付与する日付/作業ディレクトリ名/バックアップファイル名を指定します。
### ▲変数はここまでです▲ ###
mkdir "${backup_dir}/${backup_name}"
# 一時的なバックアップディレクトリを作成します。
cp -R "${redmine_dir}/plugins" "${backup_dir}/${backup_name}"
cp -R "${redmine_dir}/files" "${backup_dir}/${backup_name}"
cp -R "${redmine_dir}/public/themes" "${backup_dir}/${backup_name}"
# Redmineのバックアップディレクトリバックアップディレクトリにコピーします。
cp $redmine_dir/config/database.yml $backup_name
sed -i 's/password:.*/password: "type your db password"/' $backup_name/database.yml
# マイグレーション時に必要となるdatabase.ymlをコピーします。この時、パスワードが書かれている行をマスクします。
if [ -f $redmine_dir/config/configuration.yml ]; then
cp $redmine_dir/config/configuration.yml $backup_name
sed -i 's/password:.*/password: "type your password"/' $backup_name/configuration.yml
fi
# メール設定などでconfiguration.ymlを設定している場合、これもコピーします。(存在しない場合はコピーしません)
# 同様にパスワードが書かれていたらその行はマスクします。
if [ -f $redmine_dir/config/additional_environment.rb ]; then
cp $redmine_dir/config/additional_environment.rb $backup_name
fi
# プラグイン設定などでadditional_environment.rbを設定している場合、これもコピーします。(存在しない場合はコピーしません)
cd "${backup_dir}"
zip -r "${zip_file}" "${backup_name}"
# バックアップディレクトリをzip形式で圧縮します。
rm -rf "${backup_dir}/${backup_name}"
# 一時的なバックアップディレクトリを削除します。
find "${backup_dir}" -type f -name "redmine_backup.*.zip" -mtime +10 -delete
# 10世代前に作られたzipファイルを削除します。ディスク容量などに合わせて調整ください。
```
- 実行権限の付与
```bash
chmod +x redmine_daily_backup.sh
```
#### 動作確認
```bash
sudo -u www-data bash redmine_daily_backup.sh
```
以下を確認します。
- エラーなく実行できること
- redmine_backup.実行日付.zip形式でファイルが作成されること
- sudo -u www-data unzip redmine_backup.実行日付.zipでファイルが解凍されディレクトリに移動できること
- ymlファイルのパスワードが「type your (db) password」と本来のパスワードが上書きされていること
### Crontab設定
#### Cron登録
```bash
sudo crontab -e -u www-data
```
#### 登録内容例
```
5 0 * * * /home/backup/redmine/redmine_daily_backup.sh
# 実行時刻、頻度などは自分の運用形態に合わせます。
```
#### Cron登録確認
```bash
sudo tail -20 /var/log/cron.log
```
操作時刻に
- BEGIN EDIT
- REPLACE
- END EDIT
が表示されれば設定は完了です。
### 動作確認日
2023/02/08