#Redmineが大量乱立
Redmineは便利なので、社内ではプロジェクトごとにサーバーを立ち上げています。いつのまにか、30以上のredmineサーバーが乱立しています。もちろん各Redmineごとに物理サーバーを立ち上げているわけではなく、ほとんどが社内にある物理サーバーマシン上の仮想サーバーを作成しています。それでも1サーバーにこれだけの仮想サーバーを立ち上げると不安定になるので、終了したプロジェクトのRedmineサーバーは電源を落としたりしています。
こんなにRedmineを乱立させなくても、Redmine内でプロジェクトを複数作れば、と思われるかもしれませんが、Redmineユーザーの権限が細かく設定できなかったり、プロジェクトをグループ化したりできないので、結局プロジェクト毎にRedmineを立ち上げてきました。
さらに、Redmineは常にバージョンアップしていますが、稼働しているRedmineに対してのバージョンアップもリスクが伴います。Redmine/ruby/rails/gem等のバージョン依存も激しいのも、バージョンアップを避けている理由(言い訳)です。
#複数のRedmineを1つのサーバーに収容しよう
今まで1つのサーバーに複数のRedmineを収容してこなかったのは、公式のドキュメントでそのようなインストール方法が説明されていないというのも理由です。複数のRedmineを同居させる事例も意外と少ないです。
ですが、さすがにもうそろそろRedmineもrubyも安定しているだろうと覚悟し、今後は複数のRedmineインスタンスを1サーバーで新規運用することにします。
#まずはRedmineをインストール
Redmineを公式ドキュメントに沿ってインストールします。公式ドキュメントもバージョン等古い記述も含まれていますが、インストール環境のOSはCentOS7、Redmineバージョンは4.0、Apache+Passenger環境、MariaDB5.5(MySQL互換)とします。
BitNamiのパッケージでの一括インストールも試しましたが、ApacheがCentOS標準と異なる起動方法だったので、今回は採用せずに手動でインストールを行いました。
ここまでで新規にRedmineがPassangerとともにインストールされた直後ということで進めます。以下の操作の前提はroot権限でログインし、Redmineのインストール場所は /var/lib/redmine とします。
#2つめのRedmineをコピー
まずは念の為Apacheを停止します。
# systemctl stop httpd.service
インストールされた現在のRedmineを、テンプレートとして保存しておきます。
# mv /var/lib/redmine /var/lib/redmine.template
テンプレートから1番めのRedmineと2番めのRedmineをコピーします。
# cp -p -r /var/lib/redmine.template /var/lib/redmine1
# cp -p -r /var/lib/redmine.template /var/lib/redmine2
2番めのRedmineのユーザーとデータベースを作成します。
# 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
2番めのRedmineデータベースの設定にあわせて、/var/lib/redmine2/config/database.yml ファイルを修正します。
production:
adapter: mysql2
database: redmine2
host: localhost
username: redmine2
password: password
encoding: utf8
2番めのRedmineの新しいセッション保護用の秘密鍵を生成します。
# cd /var/lib/redmine2
# bundle exec rake generate_secret_token
2番めのRedmineのデータベースのマイグレーション(?=データ初期化?)を行います。下記の3行め最終行は、プラグインがインストールされてていれば必要のようです。(私はプラグインを追加していないので実施しませんでした)
# cd /var/lib/redmine2
# bundle exec rake db:migrate RAILS_ENV=production
# bundle exec rake redmine:plugins:migrate RAILS_ENV=production
実行中メッセージが流れますが、最後にエラーメッセージが出ていなければ完了です。
エラーが出た場合は、追加したデータベースにアクセスできるか確認しましょう。
#Redmine1/Redmine2のテスト
これで2つのRedmineが独立してインストールされたはずです。テストするには(しなくてもいいですが)、各Redmineディレクトリに移動し以下のようにRedmineを実行します。
# cd /var/lib/redmine1
# bundle exec rails server webrick -e production
手元のPCブラウザで、「http://IPアドレス:3000」とすることで、Redmineの動作を確認できます。アクセスするとRedmine側のサーバー画面上にアクセス状況のログが流れます。終了するには、Redmine側で「CTRL+C」を押して停止します。
同様に、2番めのRedmineの動作を確認します。
# cd /var/lib/redmine2
# bundle exec rails server webrick -e production
コピーしている同じRedmineですので、Redmine1もRedmine2も実際にはどちらか判別できません。ログインしたらウェルカムメッセージを書き換えれば、判別しやすくなります。こちらもRedmine側で「CTRL+C」を押して停止します。
テストをして2つのRedmineを切り替えられましたが、同じポートを使っているので、同時に起動することはできません。同時に起動するには、ポートを変えて起動する方法もありますが、Apacheのバーチャルホスト機能と、サブディレクトリを変えてアクセスする2つの方法を試してみます。
下記のケース1とケース2は、どちらかを選択してください。
ケース1:バーチャルホスト機能で複数の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の末尾に以下のように変更追記します。
・
・
##ここから追加変更
# サーバーデフォルトのドキュメントルート設定
<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が起動したら、
がそれぞれ redmine1/redmine2が起動して操作できるのを確認してください。
各Redmineをアクセスした後は、しばらく以下のようにPassengerプロセスにも表示されるはずです。
# 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プロセスも消滅します。
この手順で、1つのサーバーに別々のホスト名をつけた複数のRedmineをいくつも立ち上げることができます。
ケース2:サブディレクトリで複数のredmineを設定
次はサブディレクトリでの複数のRedmineの設定です。
- http://www.hogehoge.com/redmine1 → redmine1
- http://www.hogehoge.com/redmine2 → redmine2
のアクセスとなるよう設定します。ホスト名の代わりにIPアドレスでも大丈夫です。
Apacheの設定ファイルを変更します。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が起動したら、
がそれぞれ redmine1/redmine2が起動して操作できるのを確認してください。
各Redmineをアクセスした後は、しばらく以下のようにPassengerプロセスにも表示されるはずです。
# 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プロセスも消滅します。
この手順で、1つのサーバーに別々のサブディレクトリ名で複数のRedmineをいくつも立ち上げることができます。
#まとめ
思ったよりすんなりと設定できました。ホスト名でもサブディレクトリ名でも問題なく複数のRedmineがアクセスできます。応用すれば https でも設定できるでしょう。
しばらく運用して問題は出ていませんが、これで完全に正しいかどうかはわかりませんので、自己責任でお願いします。
将来のRedminemのバージョンアップのことは考えないことにしましょう(笑)