Redmineバックアップ環境構築

Redmineのバックアップ環境を構築する
-
今やタスク管理として当たり前になってきたRedmineであるが、何かあったら困るので、ここでチケットとファイル類のバックアップ環境の構築方法を説明します。
今回は、私が実際に行っているバックアップ環境と同じ方法を解説します。イメージ図は下のような感じです。まあ普通です。

![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/166147/2678b8ec-3249-a772-aacb-e1c0025eb2c7.png)


Redmineサーバにある/var/lib/redmine/filesとMariaDB（チケット）をバックアップサーバにバックアップします。（RedmineのチケットはDBに格納されています）
また、両サーバのOSの詳細は以下になります。

```
$cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```

###1. SSHの自動化
まずは、SSHの自動化を行います。バックアップは自動的に行われるので、パスワードをいちいち聞かれてたらたまったもんじゃありません。公開鍵認証を使用してSSHを自動化しましょう。
Redmineサーバで公開鍵を準備します。 途中パスワードを聞かれますが、ここではパスフレーズなしで鍵を作成するため、何も入力せずEnterを押しましょう。

```
公開鍵の準備
$ssh-keygen -t rsa
Enter file in which to save the key: (鍵の保存先が表示される)　Enterを入力
Enter passphrase (empty for no passphrase): Enterを入力（パスフレーズ無しで生成)
same password: Enterを入力
```
これによりid_rsa.pubというファイル（公開鍵）が作成されます。これをバックアップサーバにscpで転送しましょう。

```
$scp ./id_rsa.pub ユーザ名@バックアップサーバホスト名:~/.ssh
```
バックアップサーバに移動（ssh）し、送られてきた公開鍵の設定を行います。

```
$cd ~/.ssh
$mv id_rsa.pub authorized_keys
$chmod 600 authorized_keys
```
これで、SSHの自動化は終わりです。試しにRedmineサーバからバックアップサーバにSSHをしてみましょう。パスワードを聞かれずに、ログインできたと思います。

###2. バックアップ用シェルスクリプトの作成
バックアップを行うシェルスクリプトを作成していきます。シェルスクリプを作成する前に、Redmineサーバのホームディレクトリにredmin_backupディレクトリと、バックアップサーバの/backup/配下 (ルート直下にbackupディレクトリがなかったら作成) にredmin_backupディレクトリを作成しておいてください。
以下のシェルスクリプトを作成します。
ファイル名はわかりやすいように、redmine_backup.shとしておきます。

```shell:redmine_backup.sh

#!/bin/sh
mysqldump -u ユーザ名 -pパスワード データベース名 > ~/redmine_backup/db_`date +%Y%m%d%k%M%S`.dump
tar -cvzf ~/redmine_backup/files_`date +%Y%m%d%k%M%S`.tgz /var/lib/redmine/files
find ~/redmine_backup -name "db_redmine_*" -mtime +30 -exec rm {} \;
find ~/redmine_backup -name "files_*" -mtime +30 -exec rm {} \;

rsync -auz ~/redmine_backup/ ユーザ名@バックアプサーバホスト名:/backup/redmine_backup/
```
このシェルスクリプトについて少し解説をしていきます。
まず一行目について

```
mysqldump -u ユーザ名 -pパスワード データベース名 > ~/redmine_backup/db_`date +%Y%m%d%k%M%S`.dump
```
これは、まあRedmineデータベースのダンプファイルを作成しているだけです。Redmineのデータベースの詳細（ユーザ名, パスワード, データベース名)は以下の場所で確認することができます。

```
$cat /var/lib/redmine/config/database.yml 
```
作成したダンプファイルを、ホームディレクトリのredmin_backupディレクトリ配下に、バックアップした日時をファイル名に付与してリダイレクトしています。
次に二行目で、ファイル類を圧縮して保存しています。

```
tar -cvzf ~/redmine_backup/files_`date +%Y%m%d%k%M%S`.tgz /var/lib/redmine/files
```
/var/lib/redmine/filesにあるディレクトリをtarで圧縮し、ファイル名にバックアップ日時を付与して、先ほどのredmin_backupディレクトリ配下に保存しています。（圧縮しないと容量ならび、バックアップに少し負荷がかかってしまいます。）
3,４行目は、一ヶ月前のダンプファイルと、tgzファイルを削除しています。削除していかなければ、バックアップファイルでサーバ容量がどんどん、吸い取られていきます。まあ30日前までのバックアップファイルがあれば十分だろうということで、mtime + 30としています。一週間分あれば十分という人もいると思うので、適宜変えてください。
最後に、バックアップサーバにredmin_backupディレクトリをコピーしています。

```
rsync -auz ~/redmine_backup/ ユーザ名@バックアプサーバホスト名:/backup/redmine_backup/
```
以上でスクリプトの解説は終わりです。

###3. シェルスクリプトの実行
スクリプトに実行権限を付与し、実行してみましょう。

```
$chmod +x redmine_backup.sh
$./redmine_backup.sh
```
バックアップサーバにしっかりとバックアップされていると思います。

###4. 自動バックアップの設定
最後に、毎日決まった日時に自動でバックアップしてくるように設定します。

```
$crontab -e 
viが立ち上がるので、以下を記載
09 4 * * * /作成したシェルスクリプトまでのパス/redmine_backup.sh
```
上の記述(crontab)について少し解説します。
crontabとは、設定した時間になったら、定期的にコマンドを実行してくれるものです。
上の記述だと毎日AM4:09にシェルスクリプトを実行するような、設定になっています。crontabの書き方については[ここ：crontabの書き方](http://www.server-memo.net/tips/crontab.html)がわかりやすいと思います。
注意：crontabは、余分なスペースがあったり、アスタリスクの数が間違っているとエラーを吐くので、注意をお願いします。特にアスタリスクの数は気をつけてください。

以上でバックアップ環境の構築は終了です。