BitnamiRedmineをcronで自動的にバックアップ

AWS上でRedmineを運用しているので、
せっかくなのでAWS_S3上でバックアップをとっておきたい。

（AWS_S3: AWSが提供しているクラウドストレージみたいなもの）

ということでコマンドと設定方法をメモしておきます。

**注意！！：バックグラウンドでバックアップした場合、添付ファイルがバックアップできていないようです。原因は現在調査中。**

##0.前提
・AWS上でRedmine（Linuxベース）を立ち上げている
・AWSのS3を契約している

なお、この記事のRedmineはBitnamiAMIを利用しています。
参考される場合はご注意ください。

##1.AWSアカウントのアクセスキー取得
Redmineから定期的にS3へアクセスするために必要なアクセスキーを用意します。
すでに作成している場合は「アクセスキーID」「シークレットアクセスキー」をメモしておいてください。

>AWSログイン > 右上のユーザ名 > 認証情報
アクセスキー > 新しいアクセスキーの作成 > キーファイルのダウンロード


![スクリーンショット 2015-07-30 1.31.04のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/85214/0095410a-fa42-1f2c-43b8-c3cc15710886.png "スクリーンショット 2015-07-30 1.31.04のコピー.png")

ダウンロードしたファイルは安全な場所にセキュアな方法で保管しておいてください。
紛失すると…ああ考えただけで恐ろしい。
##2.s3cmdの準備
s3cmdとは、S3へアクセスする便利コマンドです。（そのまま）
というわけで初期設定を行います。
すでに終わっている人は飛ばしてください。

まずはインストールしましょう。
> \$ apt-cache search s3cmd
> \$ sudo apt-get install s3cmd


s3cmdの初期設定
> $ s3cmd --configure


・[Access Key] 先ほどのアクセスキー
・[Secret Key] 先ほどのシークレットキー
・[Encryption password] なしでもいいです。
・[Use HTTPS protcol] yes推奨
他はデフォルトでいいです。

プロキシの設定が必要な場合は.s3cfgの中に設定値があるので修正してください。
.s3cfgの場所は初期設定時のログに表示されているはずです。

##３.バックアップ実行コマンド作成

###3-1.バックアップ対象のRedmineDBをチェック
RedmineのDB設定ファイルを除いてみましょう。
まずはそれっぽいものを出力して確認してみる。
>Redmineのインストールディレクトリ以下で検索してみる
 $ sudo find /opt/bitnami/apps/redmine/ -name "database.yml" -print


私の場合はRedmineディレクトリ内の config/database.yml を覗きました。
データベース名、パスワード名をメモしておきましょう。
>$ cat /opt/bitnami/apps/redmine/htdocs/config/database.yml
 production:
  adapter: mysql2
  database: **********
  host: localhost
  username: hoge
  password: **********
  encoding: utf8


###3-2.バックアップ対象のS3バケット名をチェック
S3へアクセスする際のURLを調べておきます。

![スクリーンショット 2015-07-30 14.09.48のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/85214/23aece7d-bfcc-55ee-e3a2-45cf735a666e.png "スクリーンショット 2015-07-30 14.09.48のコピー.png")

例えばバケット名が「example-bucket」の場合、
アクセスする際のURLは「s3://example-bucket/」となるので覚えておきましょう。

###3-3.バックアップコマンドを作成
こちらの[S3にバックアップする記事](http://www.mori-soft.com/2008-08-15-01-36-37/2008-12-07-09-39-26/122-ec2-subversionredmine-55)を参考にさせていただきました。

Redmineでバックアップする対象は２つありますので、
どちらもバックアップしていきます。
・DB（チケットなどの内容）
・添付ファイル

説明を兼ねてコードを転載します。
やっていることは主に以下になります。
・SQLのdump
・dumpしたものをzip圧縮してS3へアップ
・まだS3へアップしていないものだけS3へアップ
・アップログを圧縮してS3へアップ


```bash:backup.sh
#!/bin/sh

# -----------------------------------------------------------
# バックアップファイルを何日分残しておくか
period=7
# バックアップファイルを保存するディレクトリ
dirpath='/home/bitnami/work/backup'
logFile=$dirpath/lastLog.log

# ファイル名を定義(※ファイル名で日付がわかるようにしておきます)
filename=`date +%y%m%d`

# mysqldump実行
# 手順3-1でメモしたパスワードとDB名をここで入力
# mysqldump のパスは各自で調べてください
DUMP_CMD=/opt/bitnami/mysql/bin/mysqldump
$DUMP_CMD --opt --password=[パスワード] [DB名] > $dirpath/$filename.sql

# パーミッション変更
chmod 700 $dirpath/$filename.sql

# 圧縮
zip $dirpath/$filename.zip $dirpath/$filename.sql

# 古いバックアップファイルを削除
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/$oldfile.sql
rm -f $dirpath/$oldfile.zip

# -------------------------------------------------------------
#
# backup to s3 bucket
#
# written by Junichi MORI, 2012/12/5
#
 
S3Cmd=/usr/bin/s3cmd
 
# If SourcePath end with /, sync copies files in SourcePath to S3Bucket.
# If SourcePath end without / and this is a directories,
# sync makes folder in S3Bucket and copies files in SourcePath.
#SourcePath=/opt/bitnami/backup/repositories
#バックアップするファイル
SourcePath=/home/bitnami/work/backup/$filename.zip
#S3先のバックアップディレクトリ
S3bkupdir=`date +%y%m`
#S3のURLパス
# *********にS3のバケット名を入れる
S3Bucket=s3://*********/$S3bkupdir/
#s3cmdのコンフィグファイル
S3Config=/home/bitnami/.s3cfg

# sync S3
echo '---------mysql backup start-----------' > $logFile

cmd="$S3Cmd sync -r -c $S3Config $SourcePath $S3Bucket"
echo $cmd >> $logFile
$cmd >> $logFile
echo '---------mysql backup end-----------' >> $logFile

# ------------------------------------------------------------
# 添付ファイルを未バックアップ分を検出してバックアップする
# redmineの添付ファイル管理ディレクトリ
DirPath='/opt/bitnami/apps/redmine/htdocs/files'

lastList=$dirpath/already_backup_files.list
tempList=$dirpath/files.list
diffFile=$dirpath/diff.list

# 現在の添付ファイル一覧を作成
chmod 700 $lastList
find $filesDirPath -type f -print > $tempList
chmod 700 $tempList

# 差分をとってファイル出力
diff $tempList $lastList | egrep '^<' | perl -pe 's/^<\s//g' > $diffFile
chmod 700 $diffFile

# ファイルの内容を配列に格納、ひとつずつアップロード
uploadTargets=($(cat $diffFile))
S3BucketPath=s3://****************

echo '---------file backup start-----------' >> $logFile
for obj in "${uploadTargets[@]}"; do
    S3BucketFile=($(echo $obj | sed s/'\/opt\/bitnami\/apps\/redmine\/htdocs\/'/''/g))
    cmd="$S3Cmd sync -r -c $S3Config $obj $S3BucketPath/$S3BucketFile"
    echo $cmd >> $logFile
    $cmd >> $logFile
done
echo '---------file backup end-----------' >> $logFile

# lastDiff 入れ替え
rm $lastList
mv $tempList $lastList

# ---------------------------------------------------
# sync S3 log
zip $logFile.zip $logFile
cmd="$S3Cmd sync -r -c $S3Config $logFile.zip $S3Bucket$filename.log.zip"
echo $cmd
$cmd


```

S3Bucketには、バックアップ対象のS3名称が入るので、
それぞれ調べて入れてください。

例が悪く、２箇所あるのでご注意を。。。

###3-4. テスト
>\$ . ./backup.sh

特にエラーがないことを確認後、
ブラウザからS3の中を覗いてみましょう。

一通りアップされていればOKです。

###3-5. python-masic のWARNINGが出る場合（[参考](http://scribble.washo3.com/linux/s3cmd%E3%81%A7%E8%AD%A6%E5%91%8A%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%8C%E5%87%BA%E3%82%8B.html)）
以下WARNINGが表示される場合には、
言われた通りにpython-magicをインストールしましょう。
  >WARNING: Module python-magic is not available. Guessing MIME types based on file extensions.
  
  一応searchしてからインストール。
  >\$ apt-cache search python-magic
  >\$ sudo apt-get install python-magic


##4.cronに登録
[こちら](http://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/db/mysql/mysqldump%E3%81%A8cron%E3%81%A7%E3%81%AE%E8%87%AA%E5%8B%95%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97)を参考にさせていただきました。
ほぼ同じです。

>$ crontab -e
0 3 * * * ./backup.sh
crontab: installing new crontab

## x.課題

バックアップデータがS3にあげっぱなしで、溜まり続けます（笑）
また、Redmineの全プロジェクトの添付ファイルがそのまま転送されちゃうので、
利用環境によってはセキュリティ的にマズイ気もします。
でも個人利用しかしてないので今のところ問題なし。

ひとまず設定は以上ということで。
残りは課題とします。

お疲れ様でした！