WindowsにRedmine5.0.1を手動インストールする方法

＃最初に投稿した際、Windowsサービスに登録する方法がわかりませんでしたが、試行錯誤した結果、Windowsサービスに登録する方法が判明したため修正しました

# はじめに
RubyとかRailsとか一切触ったことがなかったのでかなり苦労したが、なんとかインストールできたので備忘録をかねて記事に残しておく。
＃苦労した甲斐もあり、Redmineの仕組みの理解も進んだこともあり、今ならBitnami版でインストールした後にRuby、DBだけを最新版にバージョンアップしたりすることもたぶんできそう

# 経緯
Bitnami版をインストールしたことはあったのだが手動でのインストールに挑戦したかった。
手動インストールのやり方を知っておけば、社内利用においてもソフトウェア脆弱性対応とかにもわりと対応できますし（というかこれが本当の経緯）

# インストール環境
| OS | Windows Server 2019 |
|:-|:-|
| Redmine | 5.0.1 |
| DB | MariaDB 10.8.3 |
| Ruby | 3.1.2 |
| Rails | 6.1.6 |
| Webサーバ | Thin |

※Railsのバージョンは意識していない（勝手に6.1.6が入っていただけ）

# 前提
インターネットに接続できる環境でないとインストールできません。
プロキシサーバ、セキュリティソフトなどの影響もあるとインストールできないこともあるかと。

# 手順

### インストーラ入手
・Redmine
　→　https://www.redmine.org/projects/redmine/wiki/Download
　　→　redmine-5.0.1.zip

・MariaDB
　→　https://mariadb.org/download/?t=mariadb&p=mariadb&r=10.8.3&os=windows&cpu=x86_64&pkg=msi&m=xtom_jp

・Ruby
　→　https://rubyinstaller.org/downloads/
　　→　Ruby+Devkit 3.1.2-1 (x64)
　　　※WITH DEVKIT版にしないといけないみたい

### Rubyインストール
１. ダウンロードしたインストーラを実行
２. すべてデフォルトのままインストールした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/71ac637e-f284-cd79-7017-e9fe09a9eea7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/371e7ca1-5c54-8097-b8d6-a5fa3b588952.png)

３. インストール完了後、「Run 'ridk install'・・・」にチェックを付けたままFinish
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/82303a79-e82c-2fd4-496c-659fce2cd8f6.png)

４. コマンドウィンドウが起動するので、1,2,3と順番にインストールした
完了したらコマンドウィンドウは閉じてOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/359515ac-de2c-7505-a472-5f2530707752.png)

### MariaDBインストール
１. ダウンロードしたインストーラを実行
２. 基本的にデフォルトのままインストール
※唯一、赤枠部のみチェック（デフォルト文字コードをUTF8）を付けた（たぶんチェックは付けなくてもよさげ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/fe1e5c25-9de4-8055-57f8-a6ddd6c5ae30.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/6d32dfbf-1ed5-8174-c97e-7164e215f876.png)

### Redmineインストール
公式インストール手順を参考にインストールしていく
https://www.redmine.org/projects/redmine/wiki/redmineinstall

１. Step 1 - Redmine application
はい。インストールする場所を決めてZIPファイルを解凍するだけです。
私は以下の場所にインストールしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/111f1237-42fa-6bb8-6ff3-0540db84d3f9.png)

２. Step 2 - Create an empty database and accompanying user
MariaDBをインストールしたので、「MySQL」欄に記載のSQLを実行します。
SQLって？という人向けにやることだけ説明すると、
(1) コマンドプロンプトを開き、MariaDBインストールフォルダのbinフォルダまで移動（cd）します
(2) 以下のコマンドを実行して、インストール時に指定したrootユーザのパスワードも入力してDBに接続します
```batch
mysql -u root -p
```
(3) 公式手順に記載されているSQLをコピペして実行します
　　※redmineユーザのパスワード（'my_password'部分）は変更した方がよいです
```sql
CREATE DATABASE redmine CHARACTER SET utf8mb4;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'my_password';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/52b5cc2c-2364-5899-883d-131f559b660e.png)

３. Step 3 - Database connection configuration
これも公式手順通りに進めます。
私の場合、mariaDBなのでMYSQL欄に従い設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/ca9815ff-60c9-2202-3cc8-9a43a1f864ab.png)

４. Step 4 - Dependencies installation
※本ステップで実行するコマンドは管理者権限でコマンドプロンプトを開いて実行
(1) まずはコマンドプロンプトを開き、bundlerを以下のコマンドでインストールする
```batch
gem install bundler
```

(2) Redmineが利用するすべてのgemを以下のコマンドでインストールする
```batch
bundle install --without development test
```

(3) Optional dependencies
ここは不要そうなのでスキップ

(4) Additional dependencies (Gemfile.local)
とりあえずスキップ

５. Step 5 - Session store secret generation
Cookieの改ざんを防ぐために以下のコマンドを実行
```batch
bundle exec rake generate_secret_token
```

６. Step 6 - Database schema objects creation
★このステップがものすごく苦労しました
Windowsにインストールするので、以下のコマンドを実行してredmineのDBを構築します
```batch
set RAILS_ENV=production
bundle exec rake db:migrate
```

以下のエラーが出ました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/fb7746e5-5cc4-cc02-6112-d789f04ec483.png)

本エラーを解消するため、以下のファイルを修正
```diff
＜Redmineインストールフォルダ＞\Gemfile
- gem 'tzinfo-data', platforms: [:mingw, :x64_mingw, :mswin]
+ gem 'tzinfo-data'
```

コマンド再実行
```batch
set RAILS_ENV=production
bundle exec rake db:migrate
```

先ほどのエラーは解消できたようですが、違うエラーが出ました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/8c8cc01d-fc8c-20d3-c068-f553e0f2268a.png)

本エラーを解消するため、mysql2のgemを手動でインストールします。
```batch
gem install mysql2 --platform=ruby -- --with-mysql-lib="C:\Program Files\MariaDB 10.8\lib"
```
※--with-mysql-libにはmariaDBインストールパス配下のlibフォルダまでのフルパスを指定

コマンド再実行
```batch
set RAILS_ENV=production
bundle exec rake db:migrate
```

同じエラーがまだ出る・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/91f5ee4e-b138-a929-ff5b-2e6d6ff27bab.png)

本エラーを解消するため、以下のファイルを修正
```diff
＜Redmineインストールフォルダ＞\Gemfile
- gem "mysql2", "~> 0.5.0", :platforms => [:mri, :mingw, :x64_mingw]
+ gem "mysql2"
```

コマンド再実行
```batch
set RAILS_ENV=production
bundle exec rake db:migrate
```

やっとエラーが出なくなった！！！


７. Step 7 - Database default data set
公式サイトとは少し違いますが、以下を実行します。
```batch
set RAILS_ENV=production
bundle exec rake redmine:load_default_data
```

途中、言語選択を求められるので　ja　を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/3454b1a6-855b-9a22-1acb-500fa665cd4b.png)

８. Step 8 - File system permissions
Windowsの場合は本手順はスキップしてOK

９. Step 9 - Test the installation
インストールのテストを行いますが、本手順はスキップ
※ここもすんなりできませんでしたが、所詮、テストですから・・・

代わりに本番用のWebサーバ（Thin）を起動します

とりあえず起動コマンドを実行してみる
```batch
bundle exec thin start -e production -p 80 -a 0.0.0.0 -c "C:\Redmine\redmine-5.0.1"
```
※-p : ポート番号（Webブラウザからアクセスさせる）を指定
　-c : redmineインストールパスを指定

以下のエラーが出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/eb56f351-b5c6-57c2-55a1-eb2fd734ca0b.png)

本エラーを解消するため、以下のファイルを修正（末尾に追加）
```diff
＜Redmineインストールフォルダ＞\Gemfile
+ gem 'thin'
```

bundle installし直す
```batch
bundle install --without development test
```

起動コマンドを再実行
```batch
bundle exec thin start -e production -p 80 -a 0.0.0.0 -c "C:\Redmine\redmine-5.0.1"
```

以下のように表示されたので起動したっぽい！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/02d8c966-aae2-38ff-3691-1b289d2c0a63.png)
※停止する場合はCtrl＋C

１０. Step 10 - Logging into the application
Webブラウザからログイン確認
※Webサーバ起動時に80ポートを指定したため以下のURLとなる
　80ポート以外を指定した場合は適宜、ポート番号を指定したURLにアクセス

http://localhost/

やっとで表示できた！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/e4db4dd3-e078-abe0-7e62-9b77f08d79d3.png)

デフォルトの管理者アカウントでログインしてみましょう
ID : admin
PW : admin

ログイン後はパスワード変更を求められるので、変更します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/b2a1cfc2-9033-febf-241d-9cddf5676630.png)

お疲れ様でした。


# その他

### WebブラウザからのアクセスURLに/redmineを付ける場合の設定

アクセスURLからどのようなサービスに接続しているのかが分かった方が親切だと思うので、
`http://localhost/redmine/`
のようにしたい場合の説明

以下のファイルを修正（末尾に追加）
```diff
＜Redmineインストールフォルダ＞\config\environment.rb
+ Redmine::Utils::relative_url_root = "/redmine"
```

redmine起動コマンドを以下（-prefix "/redmine"を追加）にして実行
※redmine起動中であれば停止してから実行
```batch
bundle exec thin start -e production -p 80 -c "C:\Redmine\redmine-5.0.1" --prefix "/redmine"
```

### ログ設定

確か初期設定のままだとログが肥大化し続けるので、一定サイズでローテーションする設定に変更
※公式サイトにも記載あるので詳細はそっちを参照

こんなことやりました（1ファイルあたり約1MBで10世代分保持。最大でもログは10MB程度）。
・＜Redmineインストールフォルダ＞\config\additional_environment.rb.example　をコピー後、additional_environment.rbにリネーム
・config.logger = Logger.new('log/production.log', 10, 1000000)

設定変更したら、redmine再起動で反映されます


### OS起動時にredmineが自動実行されるようにする

~~thin_serviceっていうgemをインストールすればWindowsサービスとして登録できて、そこから自動起動できるらしいんですが、私はできませんでした・・・ここまできたのに悔しい・・・~~

~~なので、タスクスケジューラに起動用バッチを設定して自動実行されるようにしました。
※いろいろ試してごちゃごちゃした影響があるのかもしれませんが、タスクスケジューラのタスクを終了させてもThinは停止しなかったので、Thin停止用のバッチ（VBS）を作成して、そこから停止するっていう面倒な構成になってしまいましたが・・・~~

自己解決できました！

そもそもですが、thin_serviceを実行した時に以下のようなエラーが出てました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/89dfbd2c-d60b-f9b5-b483-2109d7f2359e.png)
ググっても改善方法が見つかりませんでしたが、コマンドプロンプトの文字コードを変えれることをふと思い出し、UTF8に変更してから実行したらどうなるかと試してみたら普通に成功しちゃいました。

ということで、Windowsサービスとして登録する手順を説明します。

※以下で実行するコマンドは管理者権限でコマンドプロンプトを開いて実行

(1) 以下のコマンドでThin Serviceをインストールする
```batch
gem install thin_service
```

(2) 以下のコマンドでコマンドプロンプトの文字コードをUTF8に変更する
```batch
chcp 65001
```

(3) 以下のコマンドでWindowsサービスにThin Serviceを登録する
```batch
thin_service install -N "Redmine-5.0.1 Thin Service" -e production -p 80 -c "C:\Redmine\redmine-5.0.1" --prefix "/redmine"
```
※-N : Windowsサービスとして登録するサービス名を指定
　その他はRedmine起動コマンド時に指定したオプションを指定

実行結果として以下のように表示されれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/c7996923-dcd1-78f2-b57e-a25c6bc3c7ce.png)

(4) Windowsサービスには手動起動設定として登録されていたので、OS起動時に自動起動するように設定変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672213/3c310498-3f99-4151-3207-49053b912915.png)

ここまで設定できたら、Windowsサービスから起動してみてRedmineにアクセスできること、OS再起動後、何もしなくともRedmineにアクセスできることを確認できれば問題ありません
※別途、インストールしたMariaDBは自動起動する設定でインストールされているため、MariaDBに関しては何もしなくとも自動起動します

### その他、思うこと
大規模環境とか、インターネットサービスとして公開するのであれば、負荷軽減、セキュリティ面でいろいろ考慮しなければならないことは多いと思います。私の場合、社内の小規模環境での利用となるため、そこまでは検討しませんでしたが・・・

ちなみに、Bitnamiでインストールした場合、Thinサービスが2つ登録されており、Apache側でリクエストを受けて、2つのThinサービスにロードバランスするような構成になってました。Thinサービスは3つ、4つと増やせるようですので、やり方を知りたい人は「Bitnami redmine Thin 増やす」などでググってみてください。

あとは、そこまで解析していませんが、画像ファイル、CSS、JSなどの静的ファイルはApache側で処理するような仕組みも入っているのかもしれません（Thinには動的処理のみ行わせる方が負荷軽減になりそうですし）。やり方を知りたい人は「Rails apache 静的ファイル」などでググってみてください。

このような構成をとるのであれば、（扱ったことはありませんが）ApacheではなくNginxがよさそうな気がします。