7
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

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互換)とします。

 http://redmine.jp/install/

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 ファイルを修正します。

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のバーチャルホスト機能で、

のアクセスとなるよう設定します。もちろん、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が起動したら、

 がそれぞれ 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の設定です。

のアクセスとなるよう設定します。ホスト名の代わりに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が起動したら、

 がそれぞれ 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のバージョンアップのことは考えないことにしましょう(笑)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
7
Help us understand the problem. What are the problem?