【CentOS8に最新バージョンのRedmineとGitLabを構築する】Redmine構築

# はじめに
この記事では、[Redmine 3.4をCentOS 7.3にインストールする手順][InstallCentos] をベースにして、CentOS8上に最新バージョンのRedmineを構築する。

[InstallCentos]: http://blog.redmine.jp/articles/3_4/install/centos/

| ソフトウェア | バージョン |
|:--|:--|
| OS | CentOS 8.3 |
| Redmine | Redmine 4.1.2 |
| WEB | Apache 2.4.37 |
| DB | PostgreSQL 10.15 |
| Ruby | ruby 2.5.5 |

## 関連記事

[【CentOS8に最新バージョンのRedmineとGitLabを構築する】事前調査][事前調査]
[【CentOS8に最新バージョンのRedmineとGitLabを構築する】GitLab構築][GitLab構築]

[事前調査]: https://qiita.com/Doshi/items/7b69b0f12946b9de4cfe
[GitLab構築]: https://qiita.com/Doshi/items/1ea1515e614ef8287096





# １．SELinux無効化
`/etc/sysconfig/selinux`を開く。

```
[doshi@centos8 ~]$ sudo vi /etc/sysconfig/selinux
```

`SELINUX=`の値を`disabled`に変更する。

```:/etc/sysconfig/selinux
#SELINUX=enforcing
SELINUX=disabled
```
変更後、CentOSを再起動する。

```
[doshi@centos8 ~]$ sudo reboot
```

`getenforce`コマンドを実行してSELinuxが無効`Disabled`になったことを確認する。

```
[doshi@centos8 ~]$ getenforce
Disabled
```

# ２．firewalldでhttpを許可 

デフォルトzoneにhttpを追加する。

```
[doshi@centos8 ~]$ sudo firewall-cmd --zone=public --add-service=http --permanent
success
```
追加した設定を反映する。

```
[doshi@centos8 ~]$ sudo firewall-cmd --reload
success
```
httpでのアクセスが許可されたことを確認する。

```
[doshi@centos8 ~]$ sudo firewall-cmd --zone=public --list-services
cockpit dhcpv6-client http ssh
```

# ３．必要なパッケージのインストール
## EPELとPowerToolsリポジトリの有効化
CentOS8ではEPELとPowerToolsリポジトリを有効化しておく必要がある。

```
[doshi@centos8 ~]$ sudo dnf install -y epel-release
[doshi@centos8 ~]$ sudo dnf config-manager --set-enabled powertools
```
## 開発ツール(Cコンパイラ等)のインストール

```
[doshi@centos8 ~]$ sudo yum -y groupinstall "Development Tools"
```
## RubyとPassengerのビルドに必要なヘッダファイルなどのインストール
[Redmine.JP Blogの手順][InstallCentos] と異なる点として、CentOS8では`curl-devel`は`libcurl-devel`という名称になる。また、`libyaml-devel`はPowerToolsリポジトリからインストールされる。

```
[doshi@centos8 ~]$ sudo dnf -y install openssl-devel readline-devel zlib-devel libffi-devel libcurl-devel libyaml-devel
```

## PostgreSQLとヘッダファイルのインストール
```
[doshi@centos8 ~]$ sudo dnf -y install postgresql-server postgresql-devel
```
[Redmine.JP Blogの手順][InstallCentos] にはないが、ここでPostgreSQLをインストールした際に作成されるOSユーザ`postgres`のパスワードを設定しておく。

```
[doshi@centos8 ~]$ sudo passwd postgres
```

## Apacheとヘッダファイルのインストール
```
[doshi@centos8 ~]$ sudo dnf -y install httpd httpd-devel
```

## ImageMagickとヘッダファイルのインストール
[Redmine.JP Blogの手順][InstallCentos] と異なる点として、`ImageMagick`と`ImageMagick-devel`はEPELリポジトリからインストールされる。

```
[doshi@centos8 ~]$ sudo dnf -y install ImageMagick ImageMagick-devel
```

## 日本語フォントのインストール
[Redmine.JP Blogの手順][InstallCentos] と異なる点として、CentOS8ではIPAフォントのパッケージがリポジトリに存在しないため、Web上のrpmをインストールする。

```
[doshi@centos8 ~]$ sudo dnf install https://pkgs.dyn.su/el8/base/x86_64/ipa-pgothic-fonts-003.03-14.el8.noarch.rpm
```

IPAのフォントが追加されていることを確認する。

```
[doshi@centos8 ~]$ ls /usr/share/fonts | grep ipa
ipa-pgothic
```

# ４．Rubyのインストール
[Redmine.JP Blogの手順][InstallCentos] ではソースコードからインストールする手順になっているが、最新のRubyをインストールするメリットが見出せないので、パッケージでインストールする。
後にある[gemパッケージのインストール](#gemパッケージのインストール)`bundle install`の際に、ヘッダーファイルが見つからずエラーになるのを避けるため、`ruby-devel`もインストールする。

```
[doshi@centos8 ~]$ sudo dnf -y install ruby ruby-devel
```
`ruby -v`を実行してRubyのバージョンを表示させ、インストールできたことを確認する。

```
[doshi@centos8 ~]$ ruby -v
ruby 2.5.5p157 (2019-03-15 revision 67260) [x86_64-linux]
```

## bundlerのインストール
Ruby用のパッケージ管理ツールであるbundlerをインストールする。Redmineが使用するgemパッケージをインストールするのに使う。bundlerはrootユーザで使うため、ここでは`sudo`で実行する。なお、`--no-rdoc --no-ri`オプションはドキュメントのインストールを省略する。

```
[doshi@centos8 ~]$ sudo gem install bundler --no-rdoc --no-ri
Fetching: bundler-2.2.15.gem (100%)
Successfully installed bundler-2.2.15
```

# ５．PostgreSQLの設定 
## データベースクラスタの新規作成
```
[doshi@centos8 ~]$ sudo postgresql-setup initdb
```

## RedmineからPostgreSQLに接続するための設定を追加
`/var/lib/pgsql/data/pg_hba.conf`を開き、"Put your actual configuration here"と書かれている箇所を探して以下のように設定を2行追加する。

```:/var/lib/pgsql/data/pg_hba.conf
# Put your actual configuration here
# ----------------------------------
#
# If you want to allow non-local connections, you need to add more
# "host" records.  In that case you will also need to make PostgreSQL
# listen on a non-local interface via the listen_addresses
# configuration parameter, or via the -i or -h command line switches.
host    redmine         redmine         127.0.0.1/32            md5
host    redmine         redmine         ::1/128                 md5
```

## PostgreSQLの起動および自動起動の設定
```
[doshi@centos8 ~]$ sudo systemctl start postgresql.service
[doshi@centos8 ~]$ sudo systemctl enable postgresql.service
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → /usr/lib/systemd/system/postgresql.service.
```
## PostgreSQLのディレクトリに移動
`/etc/sudoers`を開く。

```
[doshi@centos8 ~]$ sudo vi /etc/sudoers
```
postgresユーザを追加する。

```:/etc/sudoers
postgres        ALL=(ALL)       ALL
```

postgresユーザに切り替える。

```
[doshi@centos8 ~]$ su - postgres
```
`/var/lib/pgsql`ディレクトリに移動する。

```
[postgres@centos8 ~]$ cd /var/lib/pgsql
```

## Redmine用ユーザーの作成
```
[postgres@centos8 ~]$ sudo -u postgres createuser -P redmine
```
## Redmine用データベースの作成
```
[postgres@centos8 ~]$ sudo -u postgres createdb -E UTF-8 -l ja_JP.UTF-8 -O redmine -T template0 redmine
```
## PostgreSQLのディレクトリから元のディレクトリに戻る
`exit`でpostgresユーザから一般ユーザに戻る。

# ６．Redmineのインストール
svnコマンドを使ってインストールするため、subversionをインストールする。

```
[doshi@centos8 ~]$ sudo dnf install subversion
```
Redmine 4.1の最新ソースコード一式を、デプロイしたい`/var/lib/`直下のディレクトリ`redmine`にダウンロードする。

```
[doshi@centos8 ~]$ sudo svn co http://svn.redmine.org/redmine/branches/4.1-stable/ /var/lib/redmine
```
## データベースへの接続設定
Redmineからデータベースへ接続するための設定ファイルを作成する。Redmineのインストールディレクトリ`/var/lib/redmine`に`config/database.yml`を作成する。

```
[doshi@centos8 ~]$ sudo vi /var/lib/redmine/config/database.yml
```

```:/var/lib/redmine/config/database.yml
production:
  adapter: postgresql
  database: redmine
  host: localhost
  username: redmine
  password: "*******"
  encoding: utf8
```
## 設定ファイル config/configuration.yml の作成
Redmineからメールサーバへ接続するための設定や日本語フォントファイルのパスを記述した設定ファイルを作成する。Redmineのインストールディレクトリ`/var/lib/redmine`に`config/configuration.yml`を作成する。

```
[doshi@centos8 ~]$ sudo vi /var/lib/redmine/config/database.yml
```

```:/var/lib/redmine/config/database.yml
production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      enable_starttls_auto: true
      address: "smtp.gmail.com"
      port: 587
      domain: "smtp.gmail.com"
      authentication: :plain
      user_name: "**********@gmail.com"
      password: "**********"

production:
  rmagick_font_path: /usr/share/fonts/ipa-pgothic/ipagp.ttf
```

## Redmineのインストールディレクトリへ移動

rootユーザに切り替える。

```
[doshi@centos8 ~]$ su -
```
`/var/lib/redmine`ディレクトリへ移動する。
 
```
[root@centos8 ~]# cd /var/lib/redmine
```

## gemパッケージのインストール

```
[root@centos8 ~]# bundle install --without development test --path vendor/bundle
```

# ７．Redmineの初期設定と初期データ登録

Redmine動作に関する初期設定と初期データの登録を行う。Redmineのインストールディレクトリで実行する必要がある。

## セッション改ざん防止用秘密鍵の作成
```
[root@centos8 redmine]# bundle exec rake generate_secret_token
```
## データベースのテーブル作成
```
[root@centos8 redmine]# RAILS_ENV=production bundle exec rake db:migrate
```
## デフォルトデータの登録
作成したテーブルにデフォルトデータのロードを行う。この操作によりトラッカー、優先度、ステータス、ロール、ワークフローなどの初期値が登録される。

```
[root@centos8 redmine]# RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data
Default configuration data loaded.
```

# ８．Passengerのインストール
Apache上でRedmineなどのRailsアプリケーションを実行するために使われるPhusion Passengerをインストールする。

```
[root@centos8 redmine]# gem install passenger -v 5.1.12 --no-rdoc --no-ri
```
## PassengerのApache用モジュールのインストール
Apache用のモジュールのビルドとインストールを行う。完了するまで時間がかかる。

```
[root@centos8 redmine]# passenger-install-apache2-module --auto --languages ruby
```
## Redmineのディレクトリから元のディレクトリに戻る
`exit`でrootユーザから一般ユーザに戻る。

# ９．Apacheの設定
## Apache用設定内容の確認
下記コマンドを実行するとApacheに追加すべき設定が表示される。

```
[doshi@centos8 ~]$ passenger-install-apache2-module --snippet
LoadModule passenger_module /usr/local/share/gems/gems/passenger-5.1.12/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/local/share/gems/gems/passenger-5.1.12
  PassengerDefaultRuby /usr/bin/ruby
</IfModule>
```
## Apacheの設定ファイル作成
`/etc/httpd/conf.d/redmine.conf`を開く。

```
[doshi@centos8 ~]$ sudo vi /etc/httpd/conf.d/redmine.conf
```
Apacheの設定ファイルを以下の内容で作成する。

```:/etc/httpd/conf.d/redmine.conf
# サブディレクトリでRedmineを実行
Alias /redmine /var/lib/redmine/public

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

# Redmineの画像ファイル・CSSファイル等へのアクセスを許可する設定
<Directory "/var/lib/redmine/public">
  Require all granted
</Directory>

# Passengerの基本設定
# passenger-install-apache2-module --snippet で表示された設定を記述
LoadModule passenger_module /usr/local/share/gems/gems/passenger-5.1.12/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/local/share/gems/gems/passenger-5.1.12
  PassengerDefaultRuby /usr/bin/ruby
</IfModule>
```

## Apacheの起動および自動起動の設定

```
[doshi@centos8 ~]$ sudo systemctl start httpd.service
[doshi@centos8 ~]$ sudo systemctl enable httpd.service
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
```

## Apache上のPassengerでRedmineを実行するための設定
Redmineを配置したディレクトリ以下のファイルを、Apacheを実行するユーザー・グループ(CentOSの場合はいずれも"apache")で読み書きできるよう、オーナーを変更する。

```
[doshi@centos8 ~]$ sudo chown -R apache:apache /var/lib/redmine
```

# １０．運用

## Redmineのログローテーション
[production.logのローテート][production-log-rotate] を参考に、logroatedを使ってログローテーションを設定する。
[production-log-rotate]: https://redmine.jp/faq/system_management/production-log-rotate/

`/etc/logrotate.d/redmine`を開く。

```
[doshi@centos8 ~]$ sudo vi /etc/logrotate.d/redmine
```
`/etc/logrotate.d/redmine`の設定ファイルを以下の内容で作成する。

```:/etc/logrotate.d/redmine
/var/lib/redmine/log/*log {
    missingok      # ファイルが存在しなくてもエラーににない
    notifempty     # ファイルが空の場合はローテーションしない
    copytruncate   # ログを別名でコピーした後、元のファイルの内容を空にする
    compress       # 古いログを圧縮して保存する
}
```

動作確認のため、ローテートする条件を満たしていなくても`-f`オプションで強制実行する。

```
[doshi@centos8 ~]$ sudo /usr/sbin/logrotate -f /etc/logrotate.d/redmine
```

圧縮ファイルが作成され、元ファイルのサイズが0となることを確認する。

```
[doshi@centos8 ~]$ sudo ls -ltr /var/lib/redmine/log/
合計 12
-rw-r--r-- 1 apache apache   32  3月 20 22:37 delete.me
-rw-r--r-- 1 apache apache 8009  3月 27 17:57 production.log.1.gz
-rw-r--r-- 1 apache apache    0  3月 27 18:08 production.log
```

## Redmineのバックアップとリストア
[Redmineのバックアップとリストア][RedmineBackupRestore] を参考に、バックアップを取得する。リストアは、Redmineガイドになぜか記載がないため、公式サイトの [Restore][Restore] を参考にする。

[RedmineBackupRestore]: http://guide.redmine.jp/RedmineBackupRestore/
[Restore]: https://www.redmine.org/projects/redmine/wiki/RedmineBackupRestore

## アップグレード

Redmineガイドの [アップグレード][RedmineUpgrade] を参考にする。
[RedmineUpgrade]: http://guide.redmine.jp/RedmineUpgrade/

## ディレクトリ
データの蓄積するディレクトリは以下のとおり。

| ディレクトリ | 用途 |
|:--|:--|
| /var/lib/pgsql/data | PostgreSQLのデータ一式が配置されるディレクトリ |
| /var/lib/redmine/files | Redmineの添付ファイルがアップロードされるディレクトリ |

# おわりに
ご指摘・アドバイス等あればご遠慮なくお願いいたします。

## 参考文献
この記事は以下の情報を参考にした。

* [Redmine公式サイト][www.redmine.org]
* [Redmine.JP][redmine.jp]
* [Redmine.JP Blog][blog.redmine.jp]
* [Redmineガイド][guide.redmine.jp]

[www.redmine.org]: https://www.redmine.org/
[redmine.jp]: https://redmine.jp/
[blog.redmine.jp]: http://blog.redmine.jp/
[guide.redmine.jp]: http://guide.redmine.jp/