CentOS 7 に Redmine 3.3 をインストールする

CentOS への Redmine のインストール手順を解説する記事は Redmine.JP Blog の記事などがある[^redmine.jp]が、この記事ではなるべくパッケージを利用して Redmine をインストールする手順について解説する。

[^redmine.jp]: [Redmine 3.3をCentOS 7.3にインストールする手順 | Redmine.JP Blog](http://blog.redmine.jp/articles/3_3/install/centos/)

## システム要件
[RedmineInstall - Redmine](http://www.redmine.org/projects/redmine/wiki/redmineinstall)

* Ruby 1.9.3, 2.0.0, 2.1, 2.2, 2.3
* MySQL 5.0 - 5.5
    * MySQL 5.6 以上と MariaDB には既知の問題がある
        * [#19344](http://www.redmine.org/issues/19344) MySQL 5.6 / MariaDB 5.5 以降で IssueNestedSetConcurrencyTest#test_concurrency が失敗する
        * [#25416](http://www.redmine.org/issues/25416) MySQL 8.0 で「個人設定(My account)」が表示されない
            * [r16449](http://www.redmine.org/projects/redmine/repository/revisions/16449) で解決
* PostgreSQL 8.2 以上
* Microsoft SQL Server 2012 以上

## 検証環境
* VirtualBox 5.1.22
    * CentOS 7.3.1611 (minimal)
        * MySQL 5.7.18 (mysql57-community)
        * RHSCL 2.3 (centos-sclo-rh)
            * Ruby 2.3.1 (centos-sclo-rh)
            * Apache 2.4.18 (centos-sclo-rh)
            * Passenger 4.0.50 (centos-sclo-rh)
            * Git 2.9.3 (centos-sclo-rh)
        * Redmine 3.3.3 (GitHub)

## インストール
### アップデート
```bash
yum clean all && yum -y update && reboot
```

### Red Hat Software Collections (RHSCL)
```bash
yum install -y centos-release-scl-rh
```
Ruby 2.3 をパッケージでインストールするために [RHSCL 2.3](https://access.redhat.com/documentation/en-US/Red_Hat_Software_Collections/2/html/2.3_Release_Notes/index.html) 相当の centos-sclo-rh リポジトリを追加。
※ 4/5 に RHSCL 2.4 Beta がリリース[^rhscl24]されて rh-ruby24 が追加されたので、そのうち centos-sclo-rh リポジトリでも使えるようになるかもしれない。

[^rhscl24]: https://www.redhat.com/ja/about/blog/red-hat-software-collections-24-beta-red-hat-developer-toolset-61-beta-now-available

### Ruby のインストール
```bash
yum -y install rh-ruby23 && source scl_source enable $_
echo -e '#!/bin/bash\nsource scl_source enable rh-ruby23' > /etc/profile.d/rh-ruby23.sh
```
centos-sclo-rh リポジトリで Ruby 2.3 が利用できる。
scl_source で rh-ruby23 コレクションを有効にする。[^scl_source]
[^scl_source]: https://access.redhat.com/ja/solutions/2112231

### MySQL 5.7 のインストール
```bash
yum -y install https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm && yum -y install mysql-community-server
echo -e '\ncharacter-set-server = utf8' >> /etc/my.cnf
systemctl start mysqld && systemctl enable $_
grep "temporary password" /var/log/mysqld.log | awk '{print $11}'
mysql_secure_installation --use-default
```
MySQL 5.6 や MariaDB 10.1 と比較して MySQL 5.7 のパフォーマンスがいいらしい。[^mysql57_1] [^mysql57_2]

[^mysql57_1]: https://www.slideshare.net/hiroi10/my-sql5657
[^mysql57_2]: https://www.slideshare.net/hiroi10/mysqlcasual8

MySQL 5.6 以降および MariaDB にはデッドロック関連に問題があるらしい[^#19344]ので、気になる場合は MySQL 5.5 か PostgreSQL を利用するといいかもしれない。

[^#19344]: [Defect #19344: MySQL 5.6: IssueNestedSetConcurrencyTest#test_concurrency : always fails - Redmine](http://www.redmine.org/issues/19344)

#### (rh-mysql57 の場合)
```bash
yum -y install rh-mysql57-mysql-server && source scl_source enable rh-mysql57
echo -e '#!/bin/bash\nsource scl_source enable rh-mysql57' > /etc/profile.d/rh-mysql57.sh
ln -s /{usr/lib/systemd/system/rh-mysql57-,etc/systemd/system/}mysqld.service
systemctl daemon-reload
echo -e "[server]\ncharacter-set-server = utf8" > /etc/opt/rh/rh-mysql57/my.cnf.d/server.cnf
echo -e "[client]\ndefault-character-set = utf8" > /etc/opt/rh/rh-mysql57/my.cnf.d/client.cnf
systemctl start mysqld && systemctl enable $_
```

mysql2 のビルドで発生する `checking for rb_thread_blocking_region()... no` のエラーが解消できず rh-mysql57 を利用したインストールを断念。

公式パッケージと異なり rh-mysql57 コレクションでは root パスワードは空で作成される。

/etc/my.cnf および /etc/my.cnf.d/ は postfix パッケージの依存関係で Anaconda によってインストールされている mariadb-libs によって作成されてしまっている。

#### (MariaDB 5.5 の場合)
```bash
yum install mariadb-server
sed -i 's/\[server\]/\[server\]\ncharacter-set-server = utf8/' /etc/my.cnf.d/server.cnf
sed -i 's/\[client\]/\[client\]\ndefault-character-set = utf8/' /etc/my.cnf.d/client.cnf
systemctl start mariadb && systemctl enable $_
```

#### データベースと DB ユーザーの作成
```bash
mysqladmin create redmine -u root -p --default-character-set=utf8
cat << "_EOQ_" | mysql -u root -p
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'P@ssw0rd';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
_EOQ_
```

### Apache HTTP Server のインストール
```bash
yum -y install httpd24 && source scl_source enable $_
echo -e '#!/bin/bash\nsource scl_source enable httpd24' > /etc/profile.d/httpd24.sh
ln -s {/opt/rh/httpd24/root,}/etc/httpd
ln -s {/opt/rh/httpd24/root,}/var/www
ln -s /{usr/lib/systemd/system/httpd24-,etc/systemd/system/}httpd.service
systemctl daemon-reload
systemctl start httpd && systemctl enable $_
firewall-cmd --zone=public --add-service=http{,s} --permanent && firewall-cmd --reload
```
Passenger 公式リポジトリおよび EPEL リポジトリの passenger パッケージは依存関係で base リポジトリの ruby パッケージ (Ruby 2.0) を要求し不整合が生じるので、RHSCL の rh-passenger40 パッケージを利用するために Apache も RHSCL の httpd24 パッケージを利用する。

scl_source で httpd24 コレクションを有効にする。[^scl_source]

設定ファイルなどがすべて /opt/rh/httpd24/root/ 配下のため、参照しやすいようにシンボリックリンクを張る。

また、サービス名が httpd24-httpd となっているので httpd.service としてシンボリックリンクを張る。

### Phusion Passenger のインストール
```bash
ln -s /opt/rh/rh-ruby23/root/usr/lib64/libruby.so.2.3 /usr/lib64/
yum -y install rh-passenger40 rh-passenger40-mod_passenger && source scl_source enable rh-passenger40
echo -e '#!/bin/bash\nsource scl_source enable rh-passenger40' > /etc/profile.d/rh-passenger40.sh
```
rh-passenger40 は rh-ruby22 までしか対応していないが、rh-ruby22 だと `bundle exec rake generate_secret_token` を実行した際に何故か `Could not find rake in any of the sources` というエラーでこけるため、rh-ruby23 / rh-passenger40 の組合せ。

`error while loading shared libraries: libruby.so.2.3: cannot open shared object file: No such file or directory` というエラーが出てしまう [^error] ので `/usr/lib64/` にシンボリックリンクを張って回避。もっと適切方法はないだろうか。

[^error]: https://bugzilla.redhat.com/show_bug.cgi?format=multiple&id=1280344


### Git
```bash
yum -y install rh-git29 && source scl_source enable $_
echo -e '#!/bin/bash\nsource scl_source enable rh-git29' > /etc/profile.d/rh-git29.sh
```
base リポジトリだと 1.8.3 がインストールされるため RHSCL の rh-git29 コレクションを利用する。

### 必要ライブラリのインストール
```bash
yum install -y rh-ruby23-{ruby-devel,rubygem-bundler}
yum install -y gcc {mysql-community,libxml2,libxslt,ImageMagick}-devel ipa-pgothic-fonts
```
nokogiri のビルドで libxml2 および libxslt が、mysql2 のビルドで mysql-community-devel (rh-mysql57 の場合は rh-mysql57-mysql-devel、 MariaDB の場合は mariadb-devel) が、rmagick のビルドで ImageMagick-devel が必要。

### Redmine のインストール
```bash
cd /var/www && git clone https://github.com/redmine/redmine.git && cd redmine
git checkout `git tag | tail -n 1`
bundle config build.nokogiri --local --use-system-libraries
cat << "_EOF_" > config/database.yml
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: root
  password: P@ssw0rd
  encoding: utf8
_EOF_
bundle install --jobs=4 --without development test
bundle exec rake generate_secret_token
bundle exec rake db:migrate RAILS_ENV=production
bundle exec rake redmine:load_default_data RAILS_ENV=production REDMINE_LANG=ja
chown -R apache. /var/www/redmine
chmod -R 755 files log tmp public/plugin_assets
setenforce 0 #TODO: SELinux Settings
```
そのままだと nokogiri のインストール時に `An error occurred while installing nokogiri, and Bundler cannot continue.` とエラーが出るので、`--use-system-libraries` オプションを事前に指定してやる。

rh-ror42-rubygem-bundler 以外にも rubygem パッケージがあるが、バージョンが足りないものやパッケージ化されていないものもあり、また検証した結果不具合が生じるのでパッケージ利用を断念。

`bundle exec rails server webrick -e production -b 192.168.56.101` を実行すると簡易的に http://192.168.56.101:3000/ でアクセスできるようになるので、切り分けが必要なときなどに利用する。

### Apache の VirtualHost 設定
```bash
cat << "_EOF_" > /etc/httpd/conf.d/redmine.conf
<VirtualHost *:80>
    ServerName example.com
    Header always unset "X-Powered-By"
    Header always unset "X-Runtime"
    PassengerRuby /opt/rh/rh-ruby23/root/usr/bin/ruby
    DocumentRoot /var/www/redmine/public
    <Directory /var/www/redmine/public>
        AllowOverride all
        Require all granted
        Options -MultiViews
    </Directory>
</VirtualHost>
_EOF_
systemctl restart httpd
```

## テーマ
デフォルトのテーマはしなびた青色でテンションが下がるので、別のテーマをインストールして切り替える。

http://www.redmine.org/projects/redmine/wiki/Theme_List
http://www.redminethemes.org/

### Flat theme
https://github.com/tsi/redmine-theme-flat
<img src="https://camo.githubusercontent.com/8172135c69d0234833248a15a6501d924a023478/687474703a2f2f692e696d6775722e636f6d2f724d63345555632e6a7067" width="500" alt="Flat theme for Redmine">

```bash
git clone https://github.com/tsi/redmine-theme-flat.git /var/www/redmine/public/themes/flat
```

### Minelab
https://github.com/hardpixel/minelab
<img src="http://www.redminethemes.org/images/articles/p1/f33/minelab-issue.jpg" width="500" alt="Minelab">

```bash
git clone https://github.com/hardpixel/minelab.git /var/www/redmine/public/themes/minelab
```

### Basecamp-with-icon
https://github.com/lqez/redmine-theme-basecamp-with-icon
<img src="http://www.redminethemes.org/images/articles/p1/f10/basecamp-issue.jpg" width="500" alt="Basecamp-with-icon theme">

```bash
git clone https://github.com/lqez/redmine-theme-basecamp-with-icon.git /var/www/redmine/public/themes/basecamp-with-icon
```

### gitmike
https://github.com/makotokw/redmine-theme-gitmike
<img src="http://www.redminethemes.org/images/articles/p1/f19/gitmike-issue.jpg" width="500" alt="Redmine gitmike theme">

```bash
git clone https://github.com/makotokw/redmine-theme-gitmike.git /var/www/redmine/public/themes/gitmike
```

### Circle
https://www.redmineup.com/pages/themes/circle
<img src="https://www.redmineup.com/cms/assets/thumbnail/33212/650/agile_board.png" width="500" alt="Circle theme">


## プラグイン
### redmine_absolute_datetime
https://github.com/syagawa/redmine_absolute_datetime
更新日の「…日前」などの相対的な表示を年月日と時間(YYYY/MM/DD hh:mm)で表示させるプラグイン。
[redmine_absolute_dates](https://github.com/suer/redmine_absolute_dates) のフォーク。

```bash
git clone git://github.com/syagawa/redmine_absolute_datetime.git /var/www/redmine/plugins/redmine_absolute_datetime
systemctl restart httpd
```

### clipboard_image_paste
https://github.com/peclik/clipboard_image_paste

```bash
git clone https://github.com/peclik/clipboard_image_paste.git /var/www/redmine/plugins/clipboard_image_paste
systemctl restart httpd
```

### Redmine Issue Templates Plugin
https://github.com/akiko-pusu/redmine_issue_templates

```bash
git clone https://github.com/akiko-pusu/redmine_issue_templates.git /var/www/redmine/plugins/redmine_issue_templates
systemctl restart httpd
```

### Redmine Issue Badge Plugin
https://github.com/akiko-pusu/redmine_issue_badge

```bash
git clone https://github.com/akiko-pusu/redmine_issue_badge.git /var/www/redmine/plugins/redmine_issue_badge
cd /var/www/redmine && bundle exec rake redmine:plugins:migrate RAILS_ENV=production
systemctl restart httpd
```

### Redmine Banner Plugin
https://github.com/akiko-pusu/redmine_banner

```bash
git clone https://github.com/akiko-pusu/redmine_banner.git /var/www/redmine/plugins/redmine_banner
cd /var/www/redmine && bundle install --without development test
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
systemctl restart httpd
```

### Redmine Editor Preview Tab
https://github.com/tleish/redmine_editor_preview_tab
![](https://raw.githubusercontent.com/tleish/redmine_editor_preview_tab/master/docs/screenshot_preview.png)

```bash
git clone https://github.com/tleish/redmine_editor_preview_tab.git /var/www/redmine/plugins/redmine_editor_preview_tab
systemctl restart httpd
```

### Redmine Issue History
https://github.com/stpl/redmine_issue_history

```bash
git clone https://github.com/stpl/redmine_issue_history.git /var/www/redmine/plugins/redmine_issue_history
systemctl restart httpd
```

### Hide Sidebar
https://github.com/bdemirkir/sidebar_hide

```bash
git clone https://github.com/bdemirkir/sidebar_hide.git /var/www/redmine/plugins/sidebar_hide
systemctl restart httpd
```

### Redmine Theme Changer plugin
https://www.r-labs.org/projects/themechanger

```bash
curl -o redmine_theme_changer-0.2.0.tar.gz -L https://bitbucket.org/haru_iida/redmine_theme_changer/get/0.2.0.tar.gz
tar xf redmine_theme_changer-0.2.0.tar.gz
mv haru_iida-redmine_theme_changer-875b2d9d750b /var/www/redmine/plugins/redmine_theme_changer
cd /var/www/redmine && bundle exec rake redmine:plugins:migrate RAILS_ENV=production
systemctl restart httpd
```

### Already Read Plugin 
https://github.com/ameya86/redmine_already_read
チケットの既読／未読を管理し、チケット一覧に「既読」「読んだ日時」列を追加する。チケットを更新すると、そのチケットは未読チケットに戻る。

```bash
git clone https://github.com/ameya86/redmine_already_read.git /var/www/redmine/plugins/redmine_already_read
cd /var/www/redmine && bundle exec rake redmine:plugins:migrate RAILS_ENV=production
systemctl restart httpd
```

### Redmine Checklists plugin
https://www.redmineup.com/pages/plugins/checklists

![One click edits](https://www.redmineup.com/cms/assets/thumbnail/33038/400/edit.png) ![Integrated with issue history log](https://www.redmineup.com/cms/assets/thumbnail/33037/400/history.png)

```bash
unzip redmine_checklists-3_1_5-light.zip
mv redmine_checklists /var/www/redmine/plugins/
cd /var/www/redmine && bundle exec rake redmine:plugins NAME=redmine_checklists RAILS_ENV=production
systemctl restart httpd
```

## 初期設定
初期ログインID/パスワードは `admin` / `admin` となっている。 

### 必須設定変更
認証、公開の設定は変更しないとデフォルトで全公開されてしまうので要注意。

#### 管理 → 設定 → 全般
* 「テキストの書式」を「Markdown」に変更
* 「ページごとの検索結果表示件数」に「30」を指定
* 「プロトコル」を必要に応じて「HTTPS」に変更

#### 管理 → 設定 → 表示
* 「テーマ」を「Flat-theme」などに変更
* 「ユーザー名の表示書式」を「Admin Redmine」（姓 名）に変更
* 「添付ファイルのサムネイル画像を表示」をチェック

#### 管理 → 設定 → 認証
* <font color="red">「認証が必要」をチェック</font>
* 「自動ログイン」を「30日」に変更

#### 管理 → 設定 → プロジェクト
* <font color="red">「デフォルトで新しいプロジェクトは公開する」のチェックを外す</font>
* 「新規プロジェクトにおいてデフォルトで有効になるモジュール」の以下のチェックを外す
    * 文書
    * ファイル
    * フォーラム
* 「新規プロジェクトにおいてデフォルトで有効になるトラッカー」のすべてをチェックする

#### 管理 → 設定 → ファイル
* 「添付ファイルとリポジトリのエンコーディング」に「UTF-8,CP932,EUC-JP」を指定

#### 管理 → 設定 → リポジトリ
* 「使用するバージョン管理システム」の不要なチェックを外す
* 「参照用キーワード」に「refs,references,IssueID,*」を指定

#### 管理 → ロールと権限 → 開発者
* 「チケットトラッキング」の「子チケットの管理」のチェックを外す

#### 管理 → ロールと権限 → 匿名ユーザー
* 「すべてのチェックを外す」をクリックして保存

#### 管理 → ロールと権限 → 非メンバー
* 「すべてのチェックを外す」をクリックして保存

## バックアップ
### データベース
```bash
mysqldump -u redmine -p redmine | gzip > redmine_`date +%F`.sql.gz
```
### ファイル
Redmine にアップロードしたファイルはすべて files/ ディレクトリに保存される。

```bash
tar cvf redmine_`date +%F`.tar.gz /var/www/redmine/{config,files,public/themes,plugins}
```

## アップデート
### 手動アップデート
#### Yum パッケージ
```bash
yum update
``` 
#### Redmine 本体
```bash
cd /var/www/redmine
git branch
git checkout `git tag | tail -n 1`
bundle update
bundle install --without development test
bundle exec rake generate_secret_token
bundle exec rake db:migrate RAILS_ENV=production
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
bundle exec rake tmp:cache:clear tmp:sessions:clear
chown -R apache. /var/www/redmine
chmod -R 755 files log tmp public/plugin_assets
systemctl restart httpd
```

## TODO
* メール設定例
* プラグイン追記
* 自動アップデート
* SELinux 設定

## Redmine 関連記事
* [Redmineのtextile記法のテーブル - Qiita](https://qiita.com/bezeklik/items/e821a2816041f73ebb1f)
* [CentOS 7 に Redmine 3.3 をインストールする - Qiita](https://qiita.com/bezeklik/items/483b61c637c805f2945f)
* [Redmine 3.4 を CentOS 7.4 にインストールする - Qiita](https://qiita.com/bezeklik/items/0b1b54bc944804420501)
* [CentOS 7.4 で Docker の Redmine を動かす - Qiita](https://qiita.com/bezeklik/items/d3c82926da104ef0c5a3)
* [Redmine を Docker 公式イメージで運用する - Qiita](https://qiita.com/bezeklik/items/b5c39136a8db23e2e81c)