bitnamiで構築されたRedmineを別サーバに引っ越し（bitnami解除 , mysql5.5 -> 5.6, CentOS6.7 -> 7.5）

# 作業方針・内容

タイトルのとおりです。

bitnamiで構築したRedmineを他のサービス（webサイトやjava系webアプリ）が稼働するサーバに移動します。

bitnamiは redmineを実行するのに必要なミドルウェア(*）が統合されていますが移行先では使わずに以下のようにします。

[*]bitnamiのredmineに統合されている主なミドルウェア

- webサーバ : 移行先のサーバですでに稼働している **apache 2.4.6** を共有
- databaseサーバ : 外部データベース（RDS for MySQL)を利用 （バージョンは**5.6.34**）
- Ruby : 移行先サーバに新規インストールする。バージョン**2.0.0**は揃える

# 結果

ネットには同様の情報がなく（見つけられず）、移行元と移行先でOSやMySQLのバージョンも違っているので、本当にできるか確信を持てないままの作業でした。

結果、なんとかうまくいきました。

Passengerのビルドエラー、Rakeコマンドエラーを解消するのに苦労しました。一部は移行元のパッケージバージョンをいくつか変更する必要がありました。「途中、やっぱり無理かもしれない。(T_T)」とも思いましたが、移行すれば~~月額1000円の節約になる~~動作が早くなることをモチベーションに頑張りました。

# サーバ基本情報（移行元、移行先）

## 移行元

- さくらVPS 1GB 
- Centos 6.7 ```$ cat /opt/redhat-release```
- **redmine専用**
- **bitnamiで構築**
- redmine 3.1.0.stable
- ruby 2.0.0-p645 ```$ /opt/redmine-3.1.0-0/ruby/bin/ruby -v```
- rails 4.2.3 
- database apapter : mysql2
- plugin : redmine_github_hook（bitbucketと連動）
- mysql 5.5.42    ```$ /opt/redmine-3.1.0-0/mysql/bin/mysql --version```
- apache 2.4.16 ```$  /opt/redmine-3.1.0-0/apache2/bin/apachectl -v```
- passenger-5.0.6

**[参考1]**テーマはカスタマイズしていますが今回は意識することはありませんでした。（Redmineディレクトリをまるごと移動した場合、最初から移行前の状態が復元できます。）

**[参考2]**上記の情報の一部はRedmineから取得できます。（メニュー > 管理 > 情報）
![](https://i.gyazo.com/68463c8121bf32c7e7b84ea2d1e8ce98.png)

## 移行先(移行前の状態）

- 某VPS(3core / 6GB)
- Centos 7.5
- apache 2.4.6
- mysql なし 
- ruby, rails, passenger なし

# 作業手順

おおざっぱに書くと以下のような流れです。

- データベース移行
- Redmine本体移行
- 移行先での環境構築

## データベース移行

まずはデータベースを移行します。

[redmine公式サイトのサポートするデータベース](http://www.redmine.org/projects/redmine/wiki/RedmineInstall#Supported-database-back-ends)の補足に**mysql5.6**以上は既知のissueが3つあることが記載されている。  
一つはMariaDB対応、一つは5.7対応なので今回は無関係。  
残りのissueを読むと並行処理系のテストが常に失敗するということのようでした。

ヘビーな使い方をするわけではないので許容できそうな気がしますが全く動かないのでは困るし引っ越し作業が無駄になってしまうので、まずはデータベースだけ切り替えて試してみます。

手順は以下の通りです。

- 現行のDBサーバからバックアップを取得
- RDSへの接続許可
- MySQLへの接続許可（ユーザ作成と権限付与）
- 取得したバックアップを移行先DBサーバにリストア
- redmineのデータベース定義を移行先DBに変更
- Redmine再起動

## データベースバックアップ
バックアップは、mysqldump(これもbitnamiに含まれている) を使って簡単に取得できます。
以下のコマンドを実行すると、sqlファイルが作成されます。
接続情報は、 **config/database.yml** に記載されています。

```
/opt/redmine-3.1.0-0/mysql/bin/mysqldump -u bitnami -p<your password> -h localhost bitnami_redmine > /usr/local/src/redmine_bk_`date +%Y-%m-%d`.sql
```

## RDS接続許可
AWSコンソールからRDSへの接続許可を設定します。（これをやらないとMySQLの前で接続拒否されるので接続できません）
具体的には 当該インスタンスに紐付いているSecurityGroupのインバウンドで、Redmineが動作しているサーバのIPアドレスを追加します。

![RDSインバウンド許可設定](https://i.gyazo.com/4a59cfad3e71abe2a53737be9611af3a.png)

## RDS上にRedmine用データベースの作成

```
mysql > create database redmine;
```

## ユーザ作成・権限付与

作成したデータベースへへのフルアクセス権限を持つユーザ作成します。
具体的な方法は、ネット上にたくさん掲載されているので参照してください。

## redmine接続設定変更
database.ymlの **host** , **username** , **password** を更新します。

```
vi /opt/redmine-3.1.0-0/apps/redmine/htdocs/config/database.yml
```

## redmine再起動

```
/opt/redmine-3.1.0-0/ctlscript.sh restart
```

## 動作確認
チケットを追加して意図した移行先のデータベースに登録されているか確認します。
以下は issue テーブルで確認するクエリです。

```
 select id, subject from issues order by id desc LIMIT 1\G
```

ちゃんと追加されている。なんとかなりそうなので引っ越しを実行。

# Redmine本体の引っ越し

バックアップリスト手順だと files フォルダをバックアップするだけだが今回は**rsync**を使ってごっそり引っ越しました。
redmineが格納されているのは**htdocs**ディレクトリです。

```
rsync -av /opt/redmine-3.1.0-0/apps/redmine/htdocs  <server ipaddress or domain>:/home/<your user>/
```

# 移行先での作業

## /opt下にredmine-3.1.0として配置

```
mv /home/<your user>/htdocs /opt/redmine-3.1.0
```

## Redmineディレクトリのオーナ変更

いろいろやる時に権限エラーが出たので作業するユーザを所有者とする。（最後にapacheに所有者を変更します）

```
sudo chown -R <your user>  /opt/redmine-3.1.0
```

## config/database.yml の設定

移行前に設定していればそのまま利用。

## CentOSパッケージインストール

実際には本節と次節以降（gemパッケージインストールとpassengerビルド）で実行エラー、インストールエラーが多発していったりきたりしました。

本節と次節の記載は最終的な状態とコマンド履歴を突き合わせて、こうすればうまくいくだろうと思われるものを整理しました。

```
$ sudo yum -y groupinstall "Development Tools"
$ sudo yum -y install openssl-devel readline-devel zlib-devel curl-devel libyaml-devel libffi-devel
$ sudo yum -y install httpd httpd-devel
$ sudo yum -y install ImageMagick ImageMagick-devel ipa-pgothic-fonts
$ sudo yum -y install ruby ruby-devel
```

## サービス起動（および再起動時の自動起動）

```
$ sudo systemctl start  mysqld
$ sudo systemctl enable mysqld
```

## Gemパッケージインストール

```
$ gem install bundler    -v '1.16.6' --no-rdoc --no-ri
$ gem install rack       -v=1.6.4    --no-rdoc --no-ri
$ gem install rake       -v '12.3.1' --no-doc --no-ri
$ gem install passenger  -v=5.0.30   --conservative --no-rdoc --no-ri
$ gem install mysql2     -v '0.3.21' --no-rdoc --no-ri
$ gem install ruby-mysql -v '2.9.14' --no-rdoc --no-ri
```

## Passengerインストール

以下のオプションを付与して実行します。ビルドに時間がかかります。某VPSでは5分ほど要しました。

```
passenger-install-apache2-module --auto --languages ruby
```

なお、末尾のログは以下のような感じでした。

```bash
・・・省略・・・
Validating installation...

 * Checking whether this Passenger install is in PATH... (!)

   ・・・省略・・・

Detected 0 error(s), 2 warning(s
```

途中、以下の警告が大量発生しましたが、特に問題なかったです。

```bash
#  warning _FORTIFY_SOURCE requires compiling with optimization (-O)
```

## bundle実行

アプリケーションルートで以下のコマンドを実行します。

```
$ /opt/redmine-3.1.0
$ bundle install --without development test --path vendor/bundle
```

この時、以下のようなログが出力されました。

```bash:ログ出力例
・・・
Bundle complete! 32 Gemfile dependencies, 53 gems now installed.
Gems in the groups development and test were not installed.
Bundled gems are installed into `./vendor/bundle`
```

## apache設定

### redmine用のconfig追加




```conf:/etc/httpd/conf.d/redmine.conf
# Redmineの画像ファイル・CSSファイル等へのアクセスを許可する設定。
# Apache 2.4のデフォルトではサーバ上の全ファイルへのアクセスが禁止されている。
# SELinuxの設定にも注意
<Directory "/opt/redmine-3.1.0/public">
  Require all granted
</Directory>

# ★Passengerの基本設定★
# passenger-install-apache2-module --snippet で表示された設定を記述。
# 環境によって設定値が異なるため以下の5行はそのまま転記せず、必ず
# passenger-install-apache2-module --snippet で表示されたものを使用すること。
LoadModule passenger_module /usr/local/share/gems/gems/passenger-5.0.30/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/local/share/gems/gems/passenger-5.0.30
  PassengerDefaultRuby /usr/bin/ruby
</IfModule>


# 必要に応じてPassengerのチューニングのための設定を追加（任意）。
# 詳しくはPhusion Passenger users guide(https://www.phusionpassenger.com/library/config/apache/reference/)参照。
PassengerMaxPoolSize 20
PassengerMaxInstancesPerApp 4
PassengerPoolIdleTime 864000
PassengerStatThrottleRate 10

Header always unset "X-Powered-By"
Header always unset "X-Runtime"
```

### 仮想ホスト設定
```config:/etc/httpd/conf/httpd.conf
NameVirtualHost *:80
NameVirtualHost *:443

<VirtualHost *:80>
    ServerName redmine-travel.nyango.com
    DocumentRoot /opt/redmine-3.1.0/public
</VirtualHost>
```

## Redmineディレクトリのオーナ変更（WEBサーバに）
```
chown -R apache:apache /opt/redmine-3.1.0
```

## HTTPサーバ起動と自動起動

```bash
$ sudo systemctl start httpd
$ sudo systemctl enable httpd
```

## トラブルシューティング

### Bundler::PermissionError (Bundler::PermissionError)

```log:/var/log/httpd/error_log
Bundler::PermissionError (Bundler::PermissionError)

・・・ 中略 ・・・

  /usr/local/share/gems/gems/passenger-5.0.30/src/helper-scripts/rack-preloader.rb:30:in `<module:PhusionPassenger>'
  /usr/local/share/gems/gems/passenger-5.0.30/src/helper-scripts/rack-preloader.rb:29:in `<main>'
```

対策

- アプリルート(`/opt/redmine3.1.0`)の所有者を`apache`に変更(ubuntuなら`www-data`)
- SELinux無効化

```
setenforce 0  
```

上記は暫定OFFです。サーバが再起動するとONになってしまいます。
恒久OFFには`/etc/selinux/config`の以下の値を変更します。

変更前)SELINUX=**enforcing**
変更後)SELINUX=**disabled**

# その他の設定

## Gitコミット時に実行する処理定義の更新(webhooks)

bitbucketの当該リポジトリの設定からwebhooks設定を更新する。

![](https://i.gyazo.com/651fc314f52ddb91691b60710a6f4069.png)

## 参考URL

[RedmineInstall - Redmine](http://www.redmine.org/projects/redmine/wiki/RedmineInstall)
[RedmineBackupRestore - Redmine](http://www.redmine.org/projects/redmine/wiki/RedmineBackupRestore)
[Redmine 3.4をCentOS 7.3にインストールする手順](http://blog.redmine.jp/articles/3_4/install/centos/)