CentOS8にRedmine3.4.13をインストールする

#はじめに
とある事情によりRedmine3.4.13（Version3系）を構築する必要が出てきました。
CentOS8に4系はすんなりインストールできるのですが、3系は諸々のバージョンの関係があり、若干てこずり
また、もともとあるRedmineのデータを3.4.13に移行することも必要だったので、手順を記録します。
rootで構築していたり、SElinuxを無効化していたりと、かなりガバガバですが検証用ということでご容赦ください。。。

#気をつけること
Redmineをインストールする際に注意が必要なところは
各ソフトウェアのバージョンです。
<http://guide.redmine.jp/RedmineInstall/#Requirements>
インストールガイドに記載があるので最初に確認しましょう。
個人的に、Redmine、Ruby、MySQL、bundlerのバージョンを守れていれば
インストールに困ることはないと思います。

#準備:CentOS8のインストール
CentOSのインストールは省略しますが、最小構成でインストールしました。
IPアドレス等も設定し、最低限の通信ができる状態にします。

#1:CentOS8の設定
まずはCentOS8のOS設定まわりからです。
##1-1:SELinuxの無効化
本環境で使うものではないので、今回はSElinuxは無効化します。（ごめんなさい

```:コマンド
# vi /etc/selinux/config
```
```:/etc/selinux/config
#SELINUX=enforcing  #コメントアウト
SELINUX=disabled    #追記
```
##1-2:Proxyの設定
社内から外に出るのにProxyを使ってる場合はこちらの設定が必要になります。

まずはdnf用の設定からです。

```:コマンド
# vi /etc/dnf/dnf.conf
```
```:/etc/dnf/dnf.conf
proxy=http://hogehoge:8080 #プロキシを設定
```

次にwget用の設定です。/etc/profile.d配下にproxy.shというファイルを作成します。


```:コマンド
# vi /etc/profile.d/proxy.sh
```
```:/etc/profile.d/proxy.sh
PROXY=http://hogehoge:8080 #プロキシを設定
export https_proxy=$PROXY
export HTTPS_PROXY=$PROXY
export http_proxy=$PROXY
export HTTP_PROXY=$PROXY
```

##1-3:Firewallの穴あけ
Proxyの設定が終わったら、Firewallの設定を実施します。
ここではhttpとhttpsに対して、穴あけを実施しています。

```:コマンド
# firewall-cmd --zone=public --add-service=http{,s} --permanent
# firewall-cmd --reload
```

##1-4:再起動
OSまわりの設定は完了ですので、一旦OSを再起動します。

```:コマンド
# reboot
```
#2:パッケージ等の準備
再起動後、必要になるパッケージ類をインストールします。
##2-1:開発ツールのインストール
```:コマンド
# dnf -y groupinstall "Development Tools"
```
##2-2:RubyとPassengerに必要なパッケージのインストール
```:コマンド
# dnf -y install openssl-devel readline-devel zlib-devel curl-devel libffi-devel perl wget tar
```
##2-3:httpdのインストール
```:コマンド
# dnf -y install httpd httpd-devel
```
##2-4:MySQL5.7のインストール
<http://guide.redmine.jp/RedmineInstall/#_1>
Redmineのインストールガイドを参照し、MySQLのバージョンを確認します。
>・MySQL 5.5 - 5.7★
>　MySQL 5.6以降とMariaDBは既知の問題があります (#19344, #19395, #17460).
>　Redmine 3.x は MySQL 5.0 と 5.1 にも対応しています

MySQLは5.5～5.7をインストールします。
CentOS8ではdnfコマンドを使用するとデフォルトではMySQL8.0がインストールされてしまいます。
まずは、MySQL5.7をインストールためのリポジトリを取得します。

```:コマンド
# cd /opt
# wget --no-check-certificate https://repo.mysql.com/mysql-community-release-el7.rpm
```
取得したリポジトリをインストールします。

```:コマンド
# rpm -Uvh mysql-community-release-el7.rpm
```
インストールしたリポジトリにMySQL5.7が含まれることを確認します。

```:コマンド
# dnf repolist all | grep mysql
mysql55-community 　　　　　　MySQL 5.5 Community Server 　無効
mysql56-community 　　　　　　MySQL 5.6 Community Server 　無効
mysql57-community 　　　　　　MySQL 5.7 Community Server 　無効★
mysql80-community 　　　　　　MySQL 8.0 Community Server 　有効
mysql-connectors-community　　MySQL Connectors Community 　有効
mysql-tools-community 　　　　MySQL Tools Community　　　　有効
mysql-tools-preview 　　　　　MySQL Tools Preview　　　　　無効
mysql-cluster-7.5-community 　MySQL Cluster 7.5 Community　無効
mysql-cluster-7.6-community 　MySQL Cluster 7.6 Community　無効
mysql-cluster-8.0-community 　MySQL Cluster 8.0 Community　無効
```
現在はMySQL8.0のサブリポジトリが有効になっているので、MySQL8.0のサブリポジトリを無効にし、MySQL5.7のサブリポジトリを有効にします。

```:コマンド
# dnf -y module disable mysql #デフォルトの8.0リポジトリを無効化
# dnf config-manager --disable mysql80-community #インストールしたリポジトリのMySQL8.0を無効化
# dnf config-manager --enable mysql57-community #インストールしたリポジトリのMySQL5.7を有効化
```
MySQL5.7をインストールします。

```:コマンド
# dnf -y install mysql-community-server mysql-devel
```

##2-5:MySQLの設定
MySQLにrootでログインしDB「redmine」を作成します。

```:コマンド
# echo -e '\ncharacter-set-server = utf8mb4' >> /etc/my.cnf #文字コードの設定
# echo "skip-grant-table" >> /etc/my.cnf                    #パスワード設定のため一時的にパスワードなしログイン可の設定
# systemctl start mysqld                                    #MySQLの起動
# systemctl enable mysqld                                   #MySQLをOS起動時に自動起動するよう設定
# mysql -u root                                             #MySQLにrootログイン
mysql> use mysql                                            #データベース「mysql」に接続する
mysql>
mysql> UPDATE user SET authentication_string=password('My_data123') WHERE user='root'; #一時的なrootログインのためのパスワード設定
mysql>
mysql> flush privileges;                                    #ここまでの設定を反映
mysql> exit;                                                #終了
#
# mysql -u root -pMy_date123                                #rootでログイン
mysql>
mysql> SET password for root@localhos=password('My_data123'); #rootでログインする際のパスワード設定
mysql> CREATE DATABASE redmine CHARACTER SET utf8mb4;         #DB「redmine」を作成
mysql> exit                                                   #終了
```

##2-6:Rubyのインストール
<http://guide.redmine.jp/RedmineInstall/#ruby>
再度Redmineインストールガイドを参照し、
導入したいRedmineと対応しているRubyのバージョンを確認します。
今回はRedmineの3.4.13をインストールするので、Rubyは1.9.3～2.4です。

|Redmineのバージョン |対応しているRubyのバージョン |Railsのバージョン |
|---|---|---|
|4.0 |ruby 2.2(2.2.2以降), 2.3, 2.4, 2.5      |Rails 5.2 |
|3.4★ |ruby 1.9.3, 2.0.0, 2.1, 2.2, 2.3, 2.4★   |Rails 4.2 |
|3.3 |ruby 1.9.3, 2.0.0, 2.1, 2.2, 2.3	      |Rails 4.2 |
|3.2 |ruby 1.9.3, 2.0.0, 2.1, 2.2	      |Rails 4.2 |

<https://cache.ruby-lang.org/pub/ruby/>
上記URLにアクセスして、ダウンロード可能なバージョンを確認します。
1.9.3～2.4の間であれば、どれでも構いませんが、今回は2.4を使用します。
URLとしては下記になります。
<https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.0.tar.gz>

```:コマンド
# cd /opt
# wget --no-check-certificate https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.0.tar.gz
※証明書のエラーが出たので、「--no-check-certificate」オプションをつけています。
# tar zxvf ruby-2.4.0.tar.gz
# cd ruby-2.4.0;rm -fr ruby-2.4.0.tar.gz
# ./configure --disable-install-doc
# make
# make install
```
インストールが完了したら、念のためバージョンを確認しましょう。

```:コマンド
# cd
# ruby -v　#rubyのバージョン表示コマンド
ruby 2.4.0 (2016-12-24 revision 57164) [x86_64-linux]
※コマンドの結果としてrubyのバージョンが表示されればOKです。
```

#3:Redmineのインストール
##3-1:Redmineのダウンロード
Redmineの公式サイトから3.4.13をダウンロードします。

```:コマンド
# cd /var/www/
# wget --no-check-certificate https://www.redmine.org/releases/redmine-3.4.13.tar.gz
```
ダウンロードが完了したら解凍します。

```:コマンド
# tar zxvf redmine-3.4.13.tar.gz #解凍
# mv redmine-3.4.13 redmine      #解凍後のディレクトリ名をredmineに変更
# rm -fr redmine-3.4.13.tar.gz   #不要ファイルを削除
```
##3-2:Redmineの設定ファイル編集
<http://guide.redmine.jp/RedmineInstall/#step-3->
Redmineインストールガイドを参照し、
RedmineでMySQLに接続するための設定を行います。

```:コマンド
# vi /var/www/redmine/config/database.yml
```

```:/var/www/redmine/config/database.yml
production:
  adapter: mysql2          # DB接続に使用するadapter名
  database: redmine        # 接続先のDB名
  host: localhost          # 接続先ホスト名
  username: root           # DBへの接続ユーザ名
  password: "My_data123"   # DB接続ユーザのパスワード
```
##3-3:Redmineの依存パッケージをインストール
Redmineを動作させるためのパッケージをインストールします。
/var/www/redmine/Gemfileを確認し、bundlerのバージョンを確認します。

```:コマンド
# cd /var/www/redmine
# vi Gemfile
```

```:/var/www/redmine/Gemfile
gem "bundler", ">= 1.5.0", "< 2.0.0"★
```
2.0.0未満、1.5.0以上である必要があります。
インストール可能なbundlerのバージョンを確認します。

```:コマンド
# gem search ^bundler$ -all
```
上記コマンド結果として表示されるbundlerのバージョンで条件に合致するものをインストールします。
ここでは1.17.3をインストールします。

```:コマンド
# gem install bundler:1.17.3
```

依存パッケージをインストールします。

```:コマンド
# bundle _1.17.3_ install --without development test rmagick --path vendor/bundle #vendor/bundleにインストール
# gem install passenger -v 5.1.12                                                 #passengerのインストール
# passenger-install-apache2-module --auto --languages ruby                        #apache2-moduleのインストール
```

##3-4:httpdの設定ファイル編集
以下のコマンドを入力し、httpd用の設定を出力します。
出力された結果はメモ等にコピーします。

```:コマンド
# passenger-install-apache2-module -snippet
LoadModule passenger_module /usr/local/lib/ruby/gems/2.4.0/gems/passenger-5.1.12/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/local/lib/ruby/gems/2.4.0/gems/passenger-5.1.12
  PassengerDefaultRuby /usr/local/bin/ruby  
</IfModule>
```
/etc/httpd/conf.d/redmine.confファイルを作成します。

```:コマンド
# vi /etc/httpd/conf.d/redmine.conf
```

```:/etc/httpd/conf.d/redmine.conf
Alias /redmine /var/www/redmine/public

<Location /redmine>
  PassengerBaseURI /redmine
  PassengerAppRoot /var/www/redmine
</Location>

LoadModule passenger_module /usr/local/lib/ruby/gems/2.4.0/gems/passenger-5.1.12/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/local/lib/ruby/gems/2.4.0/gems/passenger-5.1.12
  PassengerDefaultRuby /usr/local/bin/ruby  
</IfModule>

<VirtualHost *:80>
    ServerName example.com
    Header always unset "X-Powered-By"
    Header always unset "X-Runtime"
    PassengerRuby /usr/local/bin/ruby
    DocumentRoot /var/www/redmine/public
    <Directory /var/www/redmine/public>
        AllowOverride all
        Require all granted
        Options -MultiViews
    </Directory>
</VirtualHost>
```

```:コマンド
# vi /etc/httpd/conf/httpd.conf
```
ServerNameの行を修正します。

```:/etc/httpd/conf/httpd.conf
～
#ServerName www.example.com:80
ServerName X.X.X.X:80 #サーバのIPアドレス
～
```

##3-5:プラグインの配置
ここではwork-timeプラグインを導入します。
Redmineのバージョンに合わせるため、work-timeプラグインのバージョンは0.3.4です。

```:コマンド
# cd /var/www/redmine/plugins #pluginsディレクトリに移動
#
# wget --no-check-certificate https://github.com/tkusukawa/redmine_work_time/archive/0.3.4.zip #ダウンロード
#
# unzip 0.3.4.zip #Zipを解凍
# mv redmine_work_time-0.3.4 redmine_work_time #名前を変更する
# rm -fr 0.3.4.zip #不要ファイルを削除
```

##3-6:データの移行
旧Redmineサーバからデータを移行します。

```:旧Redmineサーバの情報（仮）
redmineディレクトリパス: /var/www/redmine
Redmineが使用するDB名:redmine
DBへの接続ユーザ名:root
DB接続時のパスワード:My_data123
```
上記の情報で分からないものがある場合は旧Redmineサーバ上のdatabase.ymlファイルを確認しましょう。
旧RedmineサーバにログインしDBのダンプ取得とfilesディレクトリ配下の圧縮を実施します。

```:コマンド
# mysqldump -uroot -pMy_data123 redmine > /tmp/backup.dump
# cd /var/www/redmine
# tar zcvf /tmp/backup_files.tar.gz files
# cd /tmp
```
ファイルの準備ができたら、新RedmineサーバにSCPやFTPで転送します。
転送が完了したら新Redmineサーバにログインし、ダンプしたDB情報をロードし、
圧縮したfilesディレクトリを解凍します。

```:コマンド
# tar zxvf backup_files.tar.gz -C /var/www/redmine
# mysql -uroot -pMy_data123 redmine < backup.dump
```

##3-7:DBのマイグレーション
作成したDB「redmine」のスキーマを更新します。
実行することでRedmineを使用するうえで必要なテーブル等が作成されます。

```:コマンド
# cd /var/www/redmine
# bundle exec rake tmp:cache:clear;
# bundle exec rake db:migrate RAILS_ENV=production
# bundle exec rake redmine:plugins:migrate RAILS_ENV=production
# bundle exec rake generate_secret_token
```

##3-8:所有者の変更
/var/www/redmineディレクトリはhttpdが参照するため所有者をapacheに変更します。

```:コマンド
# chown -R apache:apache /var/www/redmine
```
##3-9:httpdの再起動
最後にhttpdを再起動します。

```:コマンド
# systemctl restart httpd
```

#4:接続してみる
ブラウザで<http://redmineのIPアドレス>と入力してみてください。
接続でき、旧RedmineのユーザID/パスワードでログインができるかと思います。

#おわりに
以前にRedmineを構築した際は、dnfコマンドだけでインストールできていた気がしますが、
古いバージョンをインストールするとなると、パッケージのバージョン指定が必要となり、かなり手間取りました。
なんとか動いてよかったです。。。
不要コマンドや設定等あればコメントをお願いいたします。