複数のRedmineインスタンスを１つのサーバー内で立ち上げ

#Redmineが大量乱立
　Redmineは便利なので、社内ではプロジェクトごとにサーバーを立ち上げています。いつのまにか、30以上のredmineサーバーが乱立しています。もちろん各Redmineごとに物理サーバーを立ち上げているわけではなく、ほとんどが社内にある物理サーバーマシン上の仮想サーバーを作成しています。それでも１サーバーにこれだけの仮想サーバーを立ち上げると不安定になるので、終了したプロジェクトのRedmineサーバーは電源を落としたりしています。
　こんなにRedmineを乱立させなくても、Redmine内でプロジェクトを複数作れば、と思われるかもしれませんが、Redmineユーザーの権限が細かく設定できなかったり、プロジェクトをグループ化したりできないので、結局プロジェクト毎にRedmineを立ち上げてきました。
　さらに、Redmineは常にバージョンアップしていますが、稼働しているRedmineに対してのバージョンアップもリスクが伴います。Redmine/ruby/rails/gem等のバージョン依存も激しいのも、バージョンアップを避けている理由(言い訳)です。

#複数のRedmineを１つのサーバーに収容しよう
　今まで１つのサーバーに複数のRedmineを収容してこなかったのは、公式のドキュメントでそのようなインストール方法が説明されていないというのも理由です。複数のRedmineを同居させる事例も意外と少ないです。
　ですが、さすがにもうそろそろRedmineもrubyも安定しているだろうと覚悟し、今後は複数のRedmineインスタンスを１サーバーで新規運用することにします。

#まずはRedmineをインストール
　Redmineを公式ドキュメントに沿ってインストールします。公式ドキュメントもバージョン等古い記述も含まれていますが、インストール環境のOSはCentOS7、Redmineバージョンは4.0、Apache+Passenger環境、MariaDB5.5(MySQL互換)とします。

　http://redmine.jp/install/

 BitNamiのパッケージでの一括インストールも試しましたが、ApacheがCentOS標準と異なる起動方法だったので、今回は採用せずに手動でインストールを行いました。

 ここまでで**新規にRedmineがPassangerとともにインストールされた**直後ということで進めます。以下の操作の前提はroot権限でログインし、Redmineのインストール場所は /var/lib/redmine とします。

#２つめのRedmineをコピー
　まずは念の為Apacheを停止します。
 
```
# systemctl stop httpd.service
```

　インストールされた現在のRedmineを、テンプレートとして保存しておきます。

```
# mv /var/lib/redmine /var/lib/redmine.template
```

 テンプレートから１番めのRedmineと２番めのRedmineをコピーします。

```
# cp -p -r /var/lib/redmine.template /var/lib/redmine1
# cp -p -r /var/lib/redmine.template /var/lib/redmine2
```

 ２番めのRedmineのユーザーとデータベースを作成します。

```sql
# mysql -u root -p 
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 180
Server version: 5.5.64-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE redmine2 CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> CREATE USER 'redmine2'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON redmine2.* TO 'redmine2'@'localhost';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> quit;
Bye
```

 ２番めのRedmineデータベースの設定にあわせて、/var/lib/**redmine2**/config/database.yml ファイルを修正します。

```database.yml
production:
    adapter: mysql2
    database: redmine2
    host: localhost
    username: redmine2
    password: password
    encoding: utf8
```

 ２番めのRedmineの新しいセッション保護用の秘密鍵を生成します。

```
# cd /var/lib/redmine2
# bundle exec rake generate_secret_token
```

　２番めのRedmineのデータベースのマイグレーション(?=データ初期化?)を行います。下記の３行め最終行は、プラグインがインストールされてていれば必要のようです。(私はプラグインを追加していないので実施しませんでした)

```
# cd /var/lib/redmine2
# bundle exec rake db:migrate RAILS_ENV=production
# bundle exec rake redmine:plugins:migrate RAILS_ENV=production
```

　実行中メッセージが流れますが、最後にエラーメッセージが出ていなければ完了です。
　エラーが出た場合は、追加したデータベースにアクセスできるか確認しましょう。

#Redmine1/Redmine2のテスト
　これで２つのRedmineが独立してインストールされたはずです。テストするには(しなくてもいいですが)、各Redmineディレクトリに移動し以下のようにRedmineを実行します。

```
# cd /var/lib/redmine1
# bundle exec rails server webrick -e production
```
 手元のPCブラウザで、「http://*ＩＰアドレス*:3000」とすることで、Redmineの動作を確認できます。アクセスするとRedmine側のサーバー画面上にアクセス状況のログが流れます。終了するには、Redmine側で「CTRL+C」を押して停止します。

　同様に、２番めのRedmineの動作を確認します。

```
# cd /var/lib/redmine2
# bundle exec rails server webrick -e production 
```

 コピーしている同じRedmineですので、Redmine1もRedmine2も実際にはどちらか判別できません。ログインしたらウェルカムメッセージを書き換えれば、判別しやすくなります。こちらもRedmine側で「CTRL+C」を押して停止します。

　テストをして２つのRedmineを切り替えられましたが、同じポートを使っているので、同時に起動することはできません。同時に起動するには、ポートを変えて起動する方法もありますが、Apacheのバーチャルホスト機能と、サブディレクトリを変えてアクセスする２つの方法を試してみます。

　下記のケース１とケース２は、どちらかを選択してください。

# ケース１：バーチャルホスト機能で複数のredmineを設定
　ここまでで、独立したRedmine1/Redmine2が、別々にインストールされて実行できるようになりました。ここで、Apacheのバーチャルホスト機能で、 

- http://redmine1.hogehoge.com → redmine1
- http://redmine2.hogehoge.com → redmine2

のアクセスとなるよう設定します。もちろん、DNSサーバーの設定で、redmine1.hogehoge.com/redmine2.hogehoge.comとも同じサーバーを指すようにAレコードまたはCNAMEの設定が必要です。

　DNSの設定と反映を確認したら、Apacheの設定ファイルを変更します。httpd.confの末尾に以下のように変更追記します。

``` /etc/httpd/conf/httpd.conf
・
・
##ここから追加変更

# サーバーデフォルトのドキュメントルート設定
<VirtualHost *:80>
 ServerName 127.0.0.1
 DocumentRoot /var/www/html
</VirtualHost>

# Redmine1(redmine1.hogehoge.com)の設定

<Directory "/var/lib/redmine1/public">
  Require all granted
</Directory>

<VirtualHost *:80>
 ServerName redmine1.hogehoge.com
 DocumentRoot "/var/lib/redmine1/public"
 PassengerAppRoot /var/lib/redmine1
 RailsBaseURI /
</VirtualHost>

# Redmine2(redmine2.hogehoge.com)の設定

<Directory "/var/lib/redmine2/public">
  Require all granted
</Directory>

<VirtualHost *:80>
 ServerName redmine2.hogehoge.com
 DocumentRoot "/var/lib/redmine2/public"
 PassengerAppRoot /var/lib/redmine2
 RailsBaseURI /
</VirtualHost>
```

　既にPassenngerが設定済みであるという前提ですので、追加するのは各Redmineごとにディレクトリのアクセス許可とバーチャルホスト設定になります。

　設定変更後にApacheを起動します。

```
# systemctl start httpd.service
```

 エラーが無くApacheが起動したら、

- http://redmine1.hogehoge.com
- http://redmine2.hogehoge.com

　がそれぞれ redmine1/redmine2が起動して操作できるのを確認してください。

 各Redmineをアクセスした後は、しばらく以下のようにPassengerプロセスにも表示されるはずです。

```bash

# ps ax | grep Passenger
19815 ?        Sl     0:03 Passenger AppPreloader: /var/lib/redmine1
19865 ?        Sl     0:01 Passenger AppPreloader: /var/lib/redmine1 (forking...)
19920 pts/0    S+     0:00 grep --color=auto Passenger
22015 ?        Ssl    0:00 Passenger watchdog
22018 ?        Sl     0:33 Passenger core
27829 ?        Sl     0:04 Passenger AppPreloader: /var/lib/redmine2
27877 ?        Sl     0:01 Passenger AppPreloader: /var/lib/redmine2 (forking...)
#
```

 Passengerから、Redmine1/Redmine2のそれぞれを起動しているのが確認できます。しばらくアクセスが無いと該当のPassengerプロセスも消滅します。

　この手順で、１つのサーバーに別々のホスト名をつけた複数のRedmineをいくつも立ち上げることができます。

# ケース２：サブディレクトリで複数のredmineを設定
　次はサブディレクトリでの複数のRedmineの設定です。

- http://www.hogehoge.com/redmine1 → redmine1
- http://www.hogehoge.com/redmine2 → redmine2

のアクセスとなるよう設定します。ホスト名の代わりにIPアドレスでも大丈夫です。

　Apacheの設定ファイルを変更します。httpd.confの末尾に以下のように変更追記します。


```/etc/httpd/conf/httpd.conf
・
・
##ここから追加変更

# Redmine1(/redmine1)の設定

<Directory "/var/lib/redmine1/public">
  Require all granted
</Directory>
Alias /redmine1 /var/lib/redmine1/public
<Location /redmine1>
  PassengerBaseURI /redmine1
  PassengerAppRoot /var/lib/redmine1
</Location>

# Redmine2(/redmine2)の設定

<Directory "/var/lib/redmine2/public">
  Require all granted
</Directory>
Alias /redmine2 /var/lib/redmine2/public
<Location /redmine2>
  PassengerBaseURI /redmine2
  PassengerAppRoot /var/lib/redmine2
</Location>

```

　設定変更後にApacheを起動します。

```
# systemctl start httpd.service
```

 エラーが無くApacheが起動したら、

- http://www.hogehoge.com/redmine1
- http://www.hogehoge.com/redmine2

　がそれぞれ redmine1/redmine2が起動して操作できるのを確認してください。

 各Redmineをアクセスした後は、しばらく以下のようにPassengerプロセスにも表示されるはずです。

```bash
# ps ax | grep Passenger
30318 ?        Ssl    0:00 Passenger watchdog
30323 ?        Sl     0:00 Passenger core
30349 ?        Sl     0:03 Passenger AppPreloader: /var/lib/redmine1
30396 ?        Sl     0:00 Passenger AppPreloader: /var/lib/redmine1 (forking...)
30429 ?        Sl     0:03 Passenger AppPreloader: /var/lib/redmine2
30477 ?        Sl     0:00 Passenger AppPreloader: /var/lib/redmine2 (forking...)
30517 pts/0    R+     0:00 grep --color=auto Passenger
# 
```

 Passengerから、Redmine1/Redmine2のそれぞれを起動しているのが確認できます。しばらくアクセスが無いと該当のPassengerプロセスも消滅します。

　この手順で、１つのサーバーに別々のサブディレクトリ名で複数のRedmineをいくつも立ち上げることができます。

#まとめ
　思ったよりすんなりと設定できました。ホスト名でもサブディレクトリ名でも問題なく複数のRedmineがアクセスできます。応用すれば https でも設定できるでしょう。
 しばらく運用して問題は出ていませんが、これで完全に正しいかどうかはわかりませんので、自己責任でお願いします。
　将来のRedmineｍのバージョンアップのことは考えないことにしましょう(笑)