Windows で Bitnami Redmine Stack を用い，1つの Apache サーバーで複数の Redmine を立ち上げる

# はじめに
Windows で Bitnami Redmine Stack を用い，1つの Apache サーバーで複数の Redmine を立ち上げた際のノートを，例と共に以下に記します．

私が調べた限りでは同様のことを行っている例が見当たらず，色々と調べて辿り着いた結果となります．
他に良い方法がありましたら，また，間違いがありましたら，ご指摘いただきたく思います．

## 目標

- 1つ目のRedmine: http://127.0.0.1/redmine
- 2つ目のRedmine: http://127.0.0.1/redmine02

という構成にします．
（2つ目が作れれば，3つ目以降も同様に作れます．確認済みです．）

## 環境

- Windows 10 64bit Ver.1809
- Bitnami Redmine Stack 3.4.6-5
    - インストーラー直リンク: https://downloads.bitnami.com/files/stacks/redmine/3.4.6-5/bitnami-redmine-3.4.6-5-windows-installer.exe
- 前提
    - Bitnami Redmine Stack が`C:\Bitnami\redmine-3.4.6-5\`にインストールされていることを想定しています．
    - Bitnami Redmine Stack が1つしかインストールされていない（デフォルトのポートを使用している）ことを想定しています．

# 手順概要

1. Redmine App ディレクトリのコピー
2. Apache Conf ファイルの設定
3. URL および Cache の設定
4. データベースの設定
5. Thinサーバーのサービスへの登録
6. 動作確認

# 参考にさせていただいたサイト一覧
- Bitnami Redmine Stack 3.4.6-5 取得方法
    - [Redmine 3.4.* installer - Redmine - Bitnami Community](https://community.bitnami.com/t/redmine-3-4-installer/63877)
- Redmine アプリ複製全般
    - [一台のサーバー上でredmineを複数動かしてみる | 壁に向かって….](https://blog.fourthgate.jp/?p=1226)
- Apache Conf ファイルの設定
    - [Apacheによる負荷分散構成 - Qiita](https://qiita.com/Kazunori-Kimura/items/ac0ec57df751f25b2c06)
- Cache の設定
    - [サブディレクトリ運用の複数の Redmine で別の Redmine にアクセスすると勝手にログアウトするのを防ぐ - suer のブログ](https://suer.hatenablog.com/entry/2016/03/08/171746)
- データベースの設定
    - [Bitnami Redmine StackのMySQL初期設定について](http://a1-style.net/redmine/mysql-setting/)
- Thinサーバーのサービスへの登録
    - [Windows版RedmineのレスポンスはThinを追加して改善](http://a1-style.net/redmine/add-redmine-thin/)
    - [Changing Redmine URL - Redmine - Bitnami Community](https://community.bitnami.com/t/changing-redmine-url/49533/2)
    

# 1. Redmine App ディレクトリのコピー
`C:\Bitnami\redmine-3.4.6-5\apps\`下に保存されている`redmine`ディレクトリを，名前を`redmine02`として，同ディレクトリ下にまるごとコピーします．

```bat:cmd
copy C:\Bitnami\redmine-3.4.6-5\apps\redmine\  C:\Bitnami\redmine-3.4.6-5\apps\redmine02\
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/43136/7f94a9d5-a778-9dc4-2ae5-023e9fef98fb.png)


コマンドで書きましたが，エクスプローラー上でコピーしても問題ないです．

# 2. Apache Conf ファイルの設定

### 変更が必要なファイル
変更が必要なファイルは以下の4つです．

- C:\Bitnami\redmine-3.4.6-5\apache2\conf\bitnami\
    - bitnami-apps-prefix.conf
- C:\Bitnami\redmine-3.4.6-5\apps\redmine02\conf\
    - httpd-app.conf
    - httpd-prefix.conf
    - httpd-vhosts.conf


### bitnami-apps-prefix.conf
以下の1行を追記

```conf:bitnami-apps-prefix.conf
Include "C:/Bitnami/redmine-3.4.6-5/apps/redmine02/conf/httpd-prefix.conf"
```

### httpd-app.conf
以下の通り，書き換え

- `/redmine` -> `/redmine02`

```conf:httpd-app.conf
RewriteEngine On
RewriteRule /<none> / [L,R]
      
<Directory "C:\Bitnami\redmine-3.4.6-5/apps/redmine02/htdocs/public">
    Options -MultiViews
    AllowOverride All
    <IfVersion < 2.3 >
        Order allow,deny
        Allow from all
    </IfVersion>
    <IfVersion >= 2.3>
        Require all granted
    </IfVersion>
    
    Include "C:\Bitnami\redmine-3.4.6-5/apps/redmine02/conf/banner.conf"
</Directory>
```
### httpd-prefix.conf
以下の通り，書き換え

- `/redmine` -> `/redmine02`
- `balancer://redminecluster` -> `balancer://redminecluster02`
- `127.0.0.1:3001` -> `127.0.0.1:3003`
- `127.0.0.1:3002` -> `127.0.0.1:3004`

※ 3003, 3004 は未使用のポート番号である必要があります．
※ 3つ以上のRedmineを立ち上げる場合は適時変更する必要があります．

```conf:httpd-prefix.conf
ProxyPass /redmine02 balancer://redminecluster02
ProxyPassReverse /redmine02 balancer://redminecluster02

<Proxy balancer://redminecluster02>
    BalancerMember http://127.0.0.1:3003/redmine02
    BalancerMember http://127.0.0.1:3004/redmine02
</Proxy>

Include "C:\Bitnami\redmine-3.4.6-5/apps/redmine02/conf/httpd-app.conf"
```

### httpd-vhosts.conf
以下の通り，書き換え
（怪しい）

- `/redmine` -> `/redmine02`
- `127.0.0.1:3001` -> `127.0.0.1:3003`
- `127.0.0.1:3002` -> `127.0.0.1:3004`

```conf:httpd-vhosts.conf
<VirtualHost *:80>
    ServerName redmine.example.com
    ServerAlias www.redmine.example.com
    DocumentRoot "C:\Bitnami\redmine-3.4.6-5/apps/redmine02/htdocs/public"
    <Directory "C:\Bitnami\redmine-3.4.6-5/apps/redmine02/htdocs/public">
        Options -MultiViews
        allow from all
    </Directory>

    RewriteEngine On
    RewriteRule ^/(.*)$ balancer://redminecluster%{REQUEST_URI} [P,QSA,L]
    <Proxy balancer://redminecluster>
        BalancerMember http://127.0.0.1:3003
        BalancerMember http://127.0.0.1:3004
    </Proxy>
                                    
    Include "C:\Bitnami\redmine-3.4.6-5/apps/redmine02/conf/httpd-app.conf"
</VirtualHost>

<VirtualHost *:443>
    ServerName redmine.example.com
    ServerAlias www.redmine.example.com
    DocumentRoot "C:\Bitnami\redmine-3.4.6-5/apps/redmine02/htdocs/public"
    SSLEngine on
    SSLCertificateFile "C:\Bitnami\redmine-3.4.6-5/apps/redmine02/conf/certs/server.crt"
    SSLCertificateKeyFile "C:\Bitnami\redmine-3.4.6-5/apps/redmine02/conf/certs/server.key"
    <Directory "C:\Bitnami\redmine-3.4.6-5/apps/redmine02/htdocs/public">
        Options -MultiViews
        allow from all
    </Directory>

    RewriteEngine On
    RewriteRule ^/(.*)$ balancer://redminecluster%{REQUEST_URI} [P,QSA,L]
    <Proxy balancer://redminecluster>
        BalancerMember http://127.0.0.1:3003
        BalancerMember http://127.0.0.1:3004
    </Proxy>
                                    
    Include "C:\Bitnami\redmine-3.4.6-5/apps/redmine02/conf/httpd-app.conf"
</VirtualHost>
```

# 3. URL および Cache の設定
### 変更が必要なファイル

- C:\Bitnami\redmine-3.4.6-5\apps\redmine\htdocs\config
    - additional_environment.rb
- C:\Bitnami\redmine-3.4.6-5\apps\redmine02\htdocs\config
    - additional_environment.rb
    - configuration.yml

### additional_environment.rb
以下の通り，書き換えと追記を行う

- `/redmine` -> `/redmine02`

追記部分について，元は`application.rb`に記載があるが，
`application.rb`は通常変更してはならないとのこと．
参考: [サブディレクトリ運用の複数の Redmine で別の Redmine にアクセスすると勝手にログアウトするのを防ぐ - suer のブログ](https://suer.hatenablog.com/entry/2016/03/08/171746)

```ruby:\apps\redmine\htdocs\config\additional_environment.rb
# 追記
config.session_store :cookie_store,
    :key => '_redmine_session',
    :path => config.action_controller.relative_url_root
```

```ruby:\apps\redmine02\htdocs\config\additional_environment.rb
# 書き換え
config.action_controller.relative_url_root = '/redmine02'

# 追記
config.session_store :cookie_store,
    :key => '_redmine_session',
    :path => config.action_controller.relative_url_root
```

### configuration.yml
93行目を書き換え

```yaml:configuration.yml
# 93行目
autologin_cookie_path: Redmine::Utils.relative_url_root
```

# 4. データベースの設定
## 4-1. データベース設定ファイルの編集
### 変更が必要なファイル

- C:\Bitnami\redmine-3.4.6-5\apps\redmine02\htdocs\config
    - database.yml

### database.yml
以下の通り書き換え
※password は「7dd1f5f7ed」となっています．適当に置き換えてください．
※ユーザー名は「bitnami02」としました．適当に置き換えてください．
※ユーザー名は変更せずに「bitnami」のままにすることも可能です．

```yml:database.yml
production:
  adapter: mysql2
  database: bitnami02_redmine02
  host: 127.0.0.1
  username: bitnami02
  password: 7c0e82d67b
  encoding: utf8
  port: 3306
```

## 4-2. データベース作成
※password，ユーザー名は`database.yml`で設定したものと同じものを使用する必要があります．

### MySQL を稼働させる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/43136/8c804ec6-bbc4-5c97-b525-a5ffaa9cbca8.png)

### コンソールを立ち上げ
`C:\Bitnami\redmine-3.4.6-5\use_redmine.bat`を実行

### ログイン
`mysql -u root -p`
※[bitnami redmine stack インストール時に使用したパスワード]を続けて入力

```bat:use_redmine.bat
C:\Bitnami\redmine-3.4.6-5>mysql -u root -p
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.42 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

### データベース作成
`CREATE DATABASE bitnami02_redmine02 CHARACTER SET utf8;`

### ユーザー作成
`CREATE USER 'bitnami02'@'localhost' IDENTIFIED BY '7dd1f5f7ed';`
※ユーザー名を変更しない場合は，作成する必要がありません．

### 権限の設定
`GRANT ALL PRIVILEGES ON bitnami02_redmine02.* TO 'bitnami02'@'localhost';`

### 終了
`quit`

## 4-3. データベース設定反映
### セッションストア秘密鍵の生成
`C:\Bitnami\redmine-3.4.6-5\use_redmine.bat`を実行してコンソールを立ち上げ，以下の通り入力．

```console:use_redmine.bat
cd apps\redmine02\htdocs
bundle exec rake generate_secret_token
```

### マイグレーション
引き続き，以下の通りマイグレーションを実施

```console:use_redmine.bat
bundle exec rake db:migrate RAILS_ENV=production
```

# 5. Thinサーバーのサービスへの登録
## 5-1. 設定ファイルの編集-1
### 変更が必要なファイル
- C:\Bitnami\redmine-3.4.6-5\apps\redmine02\scripts\
    - serviceinstall.bat
    - servicerun.bat

### serviceinstall.bat
以下の通り，書き換え

- `/redmine` -> `/redmine02`
- `redmineThin1` -> `redmineThin102`
- `redmineThin2` -> `redmineThin202`
- `3001` -> `3003`    ※未使用のポート
- `3002` -> `3004`    ※未使用のポート

```bat:\Bitnami\redmine-3.4.6-5\apps\redmine02\scripts\serviceinstall.bat
@echo off
rem -- Check if argument is INSTALL or REMOVE

if not ""%1"" == ""INSTALL"" goto remove

"C:\Bitnami\redmine-3.4.6-5/apps/redmine02\scripts\winserv.exe" install "redmineThin102" -start auto "C:\Bitnami\redmine-3.4.6-5\ruby\bin\ruby.exe" "C:\Bitnami\redmine-3.4.6-5/apps/redmine02\htdocs\bin\thin" start -p 3003 -e production -c "C:\Bitnami\redmine-3.4.6-5/apps/redmine02/htdocs" -a 127.0.0.1 --prefix /redmine02
net start redmineThin102 >NUL
"C:\Bitnami\redmine-3.4.6-5/apps/redmine02\scripts\winserv.exe" install "redmineThin202" -start auto "C:\Bitnami\redmine-3.4.6-5\ruby\bin\ruby.exe" "C:\Bitnami\redmine-3.4.6-5/apps/redmine02\htdocs\bin\thin" start -p 3004 -e production -c "C:\Bitnami\redmine-3.4.6-5/apps/redmine02/htdocs" -a 127.0.0.1 --prefix /redmine02

net start redmineThin202 >NUL

goto end

:remove
rem -- STOP SERVICE BEFORE REMOVING

net stop redmineThin102 >NUL

"C:\Bitnami\redmine-3.4.6-5/apps/redmine02\scripts\winserv.exe" uninstall "redmineThin102"

net stop redmineThin202 >NUL
"C:\Bitnami\redmine-3.4.6-5/apps/redmine02\scripts\winserv.exe" uninstall "redmineThin202"

:end
exit
```

### servicerun.bat
以下の通り，書き換え

- `redmineThin1` -> `redmineThin102`
- `redmineThin2` -> `redmineThin202`

```bat:\Bitnami\redmine-3.4.6-5\apps\redmine02\scripts\servicerun.bat
@echo off
rem START or STOP Apache Service
rem --------------------------------------------------------
rem Check if argument is STOP or START

if not ""%1"" == ""START"" goto stop

net start redmineThin102

net start redmineThin202

goto end
:stop

net stop redmineThin102

net stop redmineThin202

:end
exit
```

## 5-2. 設定ファイルの編集-2
### 変更が必要なファイル
- C:\Bitnami\redmine-3.4.6-5\
    - serviceinstall.bat
    - servicerun.bat
    - properties.ini


### serviceinstall.bat

redmine02をサービスに登録または削除するためのバッチファイルを呼び出すように行を追加する．
具体的には，redmineのバッチファイルを呼び出している行を複製し，`\redmine`の部分を`\redmine02`に変更する．
変更対象行は2箇所あり，いずれも `rem redmine_code_start` ～ `rem redmine_code_end` の間にあります．

#### 1箇所目（サービス登録）

```bat:\Bitnami\redmine-3.4.6-5\serviceinstall.bat
:: 元々存在
if exist C:\Bitnami\REDMIN~1.6-5\apps\redmine\scripts\serviceinstall.bat (start /MIN C:\Bitnami\REDMIN~1.6-5\apps\redmine\scripts\serviceinstall.bat INSTALL)

:: ↑の行を複製し，`\redmine`の部分を`\redmine02`に変更する
if exist C:\Bitnami\REDMIN~1.6-5\apps\redmine02\scripts\serviceinstall.bat (start /MIN C:\Bitnami\REDMIN~1.6-5\apps\redmine02\scripts\serviceinstall.bat INSTALL)
```

#### 2箇所目（サービス削除）

```bat:\Bitnami\redmine-3.4.6-5\serviceinstall.bat
:: 元々存在
if exist C:\Bitnami\REDMIN~1.6-5\apps\redmine\scripts\serviceinstall.bat (start /MIN C:\Bitnami\REDMIN~1.6-5\apps\redmine\scripts\serviceinstall.bat)

:: ↑の行を複製し，`\redmine`の部分を`\redmine02`に変更する
if exist C:\Bitnami\REDMIN~1.6-5\apps\redmine02\scripts\serviceinstall.bat (start /MIN C:\Bitnami\REDMIN~1.6-5\apps\redmine02\scripts\serviceinstall.bat)
```

### servicerun.bat

redmine02のサービスを開始または停止するためのバッチファイルを呼び出すように行を追加する．
具体的には，redmineのバッチファイルを呼び出している行を複製し，`\redmine`の部分を`\redmine02`に変更する．
変更対象行は2箇所あり，いずれも `rem redmine_code_start` ～ `rem redmine_code_end` の間にあります．

#### 1箇所目（サービス開始）

```bat:\Bitnami\redmine-3.4.6-5\servicerun.bat
:: 元々存在
if exist C:\Bitnami\REDMIN~1.6-5\apps\redmine\scripts\servicerun.bat (start /MIN C:\Bitnami\REDMIN~1.6-5\apps\redmine\scripts\servicerun.bat START)

:: ↑の行を複製し，`\redmine`の部分を`\redmine02`に変更する
if exist C:\Bitnami\REDMIN~1.6-5\apps\redmine02\scripts\servicerun.bat (start /MIN C:\Bitnami\REDMIN~1.6-5\apps\redmine02\scripts\servicerun.bat START)
```

#### 2箇所目（サービス停止）

```bat:\Bitnami\redmine-3.4.6-5\servicerun.bat
:: 元々存在
if exist C:\Bitnami\REDMIN~1.6-5\apps\redmine\scripts\servicerun.bat (start /MIN C:\Bitnami\REDMIN~1.6-5\apps\redmine\scripts\servicerun.bat STOP)

:: ↑の行を複製し，`\redmine`の部分を`\redmine02`に変更する
if exist C:\Bitnami\REDMIN~1.6-5\apps\redmine02\scripts\servicerun.bat (start /MIN C:\Bitnami\REDMIN~1.6-5\apps\redmine02\scripts\servicerun.bat STOP)
```

### properties.ini
以下を追記

```ini:\Bitnami\redmine-3.4.6-5\properties.ini
[Thin_redmine3]
thin_server_port=3003
thin_unique_service_name=redmineThin102
[Thin_redmine4]
thin_server_port=3004
thin_unique_service_name=redmineThin202
```

## 5-3. サービスの登録と開始
管理者権限でコマンドプロンプトを実行し，以下のコマンドを実行することで，redmine02サービスを登録します．

```bat:Console
C:\Bitnami\redmine-3.4.6-5\apps\redmine02\scripts\serviceinstall.bat INSTALL
```

`C:\Bitnami\redmine-3.4.6-5\manager-windows.exe`を開き直すと，`redmineThin3`と`redmineThin4`が追加されていることを確認できると思います．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/43136/3f998f64-8f71-ceec-3f9b-2e7df1363e1e.png)


# 6. 動作確認
以上で，設定は完了です．

成功していれば，サーバーを再起動することで，それぞれのアドレスにアクセスできるようになります．

- http://127.0.0.1/redmine
- http://127.0.0.1/redmine02