Redmine3.2.1 インストール on CentOS7.1 + Rails4 / Puma + MariaDB

CentOS7の標準リポジトリをそのまま活用します。`systemctl`や`firewall-cmd`といったCentOS7のコマンドをベースに書いています。また、なるべくsudoで実行するようにしています。（カレントユーザーで混乱しないように）

##Railsのインストール
現在CentOS7の標準ではRuby2.0とRails4.2がインストール可能です。
[Railsインストール on CentOS7](http://qiita.com/egnr-in-6matroom/items/c84a1d3896f1015be8d2)
Redmineの最新の要件を見ると、Ruby2.0は対応。Railsは4.1が必要と書いてあるので、おそらく4.2で大丈夫だと思います。

##ImageMagickのインストール
画像の編集に使われます。

###インストール
yumで普通にインストール。

```bash:
$ sudo yum install ImageMagick-devel
```

## nginxをインストール
reverse proxyとしてnginxを使用します。
redmine本体インストールした時にnginxからのアクセス権与えたいので、予めインストールしてユーザーが出来上がっているようにします。

```
yumでインストール
$ sudo yum install nginx

サービス有効化
$ sudo systemctl enable nginx
ln -s '/usr/lib/systemd/system/nginx.service' '/etc/systemd/system/multi-user.target.wants/nginx.service'

nginx起動
$ sudo systemctl start nginx

ステータス確認
$ sudo systemctl status nginx
nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled)
   Active: active (running) since Fri 2015-02-00 00:00:00 JST; 10s ago
  Process: 22314 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 22312 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
...省略...
```

###Fire Wallポート開放
外部からポート80でアクセスするために、firewallを設定します。

```bash:
$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --reload
```

redmineへ接続するための設定はあとでやります。


##MariaDB(MySQL互換DB)
CentOS7ではMySQLではなくMariaDBが標準なのでこちらをインストールします。
###インストール
develとserverが必要です。

```bash:
$ sudo yum install mariadb-devel mariadb-server
```
サーバーのキャラクターセットをutf8に設定しておきます。（未だlatin1がデフォルトなんですね…）

```bash:
$ sudo vi /etc/my.cnf.d/server.cnf
```

```text:/etc/my.cnf.d/server.cnf
#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]
## 追加 ##
character-set-server=utf8

# this is only for embedded server
[embedded]

...以下省略...
```

###サービス起動

```bash:
$ sudo systemctl enable mariadb
$ sudo systemctl restart mariadb
```

###rootパスワード
初期パスワードはなしで危険なので、新しいパスワードを設定します。

```bash:
$ mysqladmin password -u root
Enter password:
New password:
Confirm new password:
```

###データベース作成

```mysql:mysql
$ mysql -u root -p
MariaDB [(none)]>create database redmine;
MariaDB [(none)]>create user 'redmine'@'localhost' identified by 'redmine_pass';
MariaDB [(none)]>grant all privileges on redmine.* to 'redmine'@'localhost';
MariaDB [(none)]>exit;
```
##redmineユーザー作成
セキュリティのため、root権限（wheel）でない専用ユーザーを作成します。

```bash:
$ sudo useradd redmine
$ sudo passwd redmine
```

##Redmine本体
###ダウンロードと展開
本家からredmine-3.2.1をダウンロードします。

```bash:
$ cd ~/
$ curl -O http://www.redmine.org/releases/redmine-3.2.1.tar.gz
$ tar -xvf redmine-3.2.1.tar.gz
$ sudo mv redmine-3.2.1 /var/lib
$ cd /var/lib/redmine-3.2.1
$ sudo chmod -R 755 files log public/plugin_assets
$ sudo chown -R redmine:nginx .
```

###DBの設定
引き続き`/var/lib/redmine-3.2.1`で作業します。
先ほど作成したDBのユーザー名、パスワードを設定します。

```bash:
$ sudo -u redmine cp config/database.yml.example config/database.yml
$ sudo -u redmine vi config/database.yml
```

```yaml:config/database.yml
...省略...

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: redmine_pass
  encoding: utf8

...省略...
```

###bundlerでgemsのインストール
Gemfileにrailsを稼働させるRack Serverとしてpumaを追加します。（unicornより流行ってる？＆導入が楽だったので）
Gemfile 17行目あたりにpumaを追加します。

```bash:
$ sudo -u redmine vi Gemfile
```

```ruby:Gemfile
...省略...
gem "protected_attributes"
gem "actionpack-action_caching"
gem "actionpack-xml_parser"
gem "roadie-rails"
gem "puma"
...省略...
```

~~nokogiri-1.6.6.2をインストールしようとして、Cのライブラリを参照しようとします。そのままだとエラーになるので、configで`--use-system-libraries`オプションを設定してからbundle installします。~~
※railsのインストール手順でやっているので不要でした

今回はMySql(MariaDB)を使用するので、本家で紹介されている通りpostgresqlとsqliteは除外します。

```bash:
$ sudo -u redmine -E /var/lib/redmine-3.2.1/bin/bundle install --path vendor/bundle --without development test postgresql sqlite
```

###セッションストア秘密鍵生成
rakeコマンドを使用して生成します。


```bash:
$ sudo -u redmine /home/redmine/bin/bundle exec rake generate_secret_token
```

###DBテーブル初期化
```bash:
$ sudo -u redmine RAILS_ENV=production /home/redmine/bin/bundle exec rake db:migrate
```

新規の場合は初期のデフォルトデータをロードします。移行の場合はこの手順を飛ばして、データをインポートしてください。

言語を訊かれたら日本語`ja`を入力します。

```bash:
$ sudo -u redmine RAILS_ENV=production /home/redmine/bin/bundle exec rake redmine:load_default_data

Select language: ar, az, bg, bs, ca, cs, da, de, el, en, en-GB, es, es-PA, et, eu, fa, fi, fr, gl, he, hr, hu, id, it, ja, ko, lt, lv, mk, mn, nl, no, pl, pt, pt-BR, ro, ru, sk, sl, sq, sr, sr-YU, sv, th, tr, uk, vi, zh, zh-TW [en] ja
```

##Webrickでテスト
とりあえずバックグラウンドでwebrick起動します。curlでページのソースが取得されていることを確認します。

```bash:
$ cd /var/lib/redmine-3.2.1
$ sudo -u redmine /home/redmine/bin/bundle exec rails server webrick -e production &
$ curl http://localhost:3000
サーバーを停止するとき
$ fg
Ctrl+C
```

外部からブラウザで参照したければ、firewall-cmdでポート3000番開けてください。
また、すべてのアドレスから待ち受けるよう、`-b 0.0.0.0`を追加します。

```bash:
$ sudo firewall-cmd --add-port=3000/tcp
$ rails server webrick -e production -b 0.0.0.0 &
サーバーを停止するとき
$ fg
Ctrl+C
```
## puma

###設定ファイルを記述

```bash:
$ cd /var/lib/redmine-3.2.1
$ sudo -u redmine vi config/puma.rb
```

```ruby:puma.rb
app_root = '/var/lib/redmine-3.2.1'

directory app_root
environment 'production'
pidfile "#{app_root}/tmp/pids/puma.pid"
state_path "#{app_root}/tmp/pids/puma.state"
bind "unix://#{app_root}/tmp/sockets/redmine.sock"
activate_control_app
```

### pumaでテスト
pumaでテストしてみます。ソケット経由

```bash:
$ cd /var/lib/redmine-3.2.1
$ sudo -u redmine bin/bundle exec puma 
```

稼働していることはわかりますが、curlでunixソケットにアクセスする`--unix-socket`は`CentOS Linux release 7.1.1503`標準の7.29.0では対応していないのでエラーがないことだけ確認。方法知ってる人いたらおしえてください。（素直に7.40いれれば良いんだけど）

## daemon化
systemdで起動できるようにします。

###serviceファイルの作成
```
$ sudo vi /usr/lib/systemd/system/redmine.service
```

```text:/usr/lib/systemd/system/redmine.service
[Unit]
Description=Redmine on PUMA
After=network.target

[Service]
Type=simple
ExecStart=/var/lib/redmine-3.2.1/bin/bundle exec pumactl -F /var/lib/redmine-3.2.1/config/puma.rb start
KillMode=process
KillSignal=SIGQUIT
User=redmine
Group=nginx

[Install]
WantedBy=multi-user.target
```

###systemdから起動する

```bash:
systemファイルを追加したので、設定をリロード
$ sudo systemctl daemon-reload

自動起動を有効にする
$ sudo systemctl enable redmine

開始
$ sudo systemctl start redmine

正しく開始されたか確認
$ sudo systemctl status redmine

Active: active (running)になっていればOK
```

## nginxからアクセスする
サーバー設定と、ロケーション設定を追加します。

```bash:
$ sudo vi /etc/nginx/conf.d/redmine_server.conf
```

```text:/etc/nginx/conf.d/redmine_server.conf
upstream redmine {
  server unix:/var/lib/redmine-3.2.1/tmp/sockets/redmine.sock;
}
```

```bash:
$ sudo vi /etc/nginx/default.d/redmine.conf
```

```text:/etc/nginx/default.d/redmine.conf
location / {
  root /var/lib/redmine-3.2.1/public;
  access_log  /var/log/nginx/redmine_access.log;
  error_log   /var/log/nginx/redmine_error.log;

  try_files $uri $uri/index.html $uri.html @redmine;
}

location @redmine {
  proxy_read_timeout    300;
  proxy_connect_timeout 300;
  proxy_redirect        off;
  proxy_set_header Host      $http_host;
  proxy_set_header X-Real-IP $remote_addr;

  proxy_pass http://redmine;
}
```

設定が有効か確認して、リロードします。

```bash:
確認
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

リロード
$ sudo systemctl reload nginx
```

###サブディレクトリでアクセスする場合
location設定を書き換えます。

```bash:
$ sudo vi /etc/nginx/default.d/redmine.conf
```

```text:/etc/nginx/default.d/redmine.conf
location /redmine {
  root /var/lib/redmine-3.2.1/public;
  access_log  /var/log/nginx/redmine_access.log  main;
  error_log  /var/log/nginx/redmine_error.log  main;

  try_files $uri $uri/index.html $uri.html @redmine;
}

location @redmine {
  proxy_read_timeout    300;
  proxy_connect_timeout 300;
  proxy_redirect        off;

  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host            $http_host;
  proxy_set_header X-Real-IP       $remote_addr;

  proxy_pass http://redmine;
}
```
さらに、relative_url_rootにサブディレクトリを登録して、ルートパス"/"にマップするよう、redmineの設定も変更します。
[参考](http://www.redmine.org/projects/redmine/wiki/HowTo_Install_Redmine_in_a_sub-URI)


```bash:
$ sudo -u redmine vi /var/lib/redmine-3.2.1/config/environment.rb
```

```rb:/var/lib/redmine-3.2.1/config/environment.rb
# 末尾に追加
Redmine::Utils::relative_url_root = "/redmine"
```

```bash:
$ sudo -u redmine vi /var/lib/redmine-3.2.1/config.ru
```
```rb:/var/lib/redmine-3.2.1/config.ru
#run RedmineApp::Application
map ActionController::Base.relative_url_root || "/" do
  run RedmineApp::Application
end
```

##SELinux無効化
簡単のため、SELinuxをPermissiveにします。

再起動したときにpermissiveになるよう、設定変更します。

```bash:
$ sudo vi /etc/sysconfig/selinux
```

7行目

```text:/etc/sysconfig/selinux
SELINUX=permissive 
```

再起動するまで反映されないので、明示的に即時反映する。

```bash:
$ sudo setenforce 0
```

##確認
Webブラウザで確認します。

http://[yourhost]/
サブディレクトリ設定している場合は
http://[yourhost]/redmine

画像はサブディレクトリ設定した例。
![redmine_browser.PNG](https://qiita-image-store.s3.amazonaws.com/0/69798/deb82519-612f-a455-414f-54f7b0a6436f.png)

##実用化のために追加でやるべきこと
ここには書いてませんが、実用するには
・管理者のメール設定[（メール通知）](http://redmine.jp/faq/general/mail_notification/)
・SSLを通す[（nginxに設定）](http://nginx.org/en/docs/http/configuring_https_servers.html)
・[定期バックアップ](http://redmine.jp/faq/system_management/backup/)
などを設定してください。