CentOS7にRedmine3.2を入れ、nginx、unicornで動かす。


# 変更履歴

1. 2016/06/08 Redmineの動作確認項目コマンドでは正常にWEBrickが起動しないため、コマンドを修正
2. 2016/06/15 SendGridでのメール送信設定の追加
3. 2016/06/18 ssl設定の追加

自宅で遊ぶために立てたRedmineのインストール周りの備忘録
https化は後でする予定・・・

# 前提条件

* CentOS7
* nginx
* unicorn
* ruby 2.2.5
* Redmine 3.2
* postgresql9.2
* ssh接続設定済み
* sendgridのアカウント取得済み（gmailを利用する場合は無視）
* SELinux停止済み
* Firewalld設定済み
* メール配送はgmailから行う。 ※あとからsendgridへ移行

# 参考にしたWebページ
1. http://blog.redmine.jp/articles/3_2/install/centos/
1. http://www.torutk.com/projects/swe/wiki/Redmine%E3%82%92CentOS_7%E4%B8%8A%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E3%83%BCUnicorn%E3%81%A8Nginx%E7%B7%A8
1. http://www.torutk.com/projects/swe/wiki/Redmine%E3%82%92CentOS_6%E4%B8%8A%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E3%83%BCUnicorn%E3%81%A8Nginx%E7%B7%A8#Unicorn%E3%81%AE%E8%A8%AD%E5%AE%9A

# 前準備

## Redmineに必要なパッケージのインストール
開発ツール(Cコンパイラ等)のインストール

```
yum -y groupinstall "Development Tools"
```

RubyとPassengerのビルドに必要なヘッダファイルなどのインストール

```
yum -y install openssl-devel readline-devel zlib-devel curl-devel libyaml-devel libffi-devel
```

PostgreSQLとヘッダファイルのインストール

```
yum -y install postgresql-server postgresql-devel
```

ImageMagickとヘッダファイル・日本語フォントのインストール


```
yum -y install ImageMagick ImageMagick-devel ipa-pgothic-fonts
```

## Nginxのインストール

Nginxインストール用のリポジトリ追加

```
yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
```

リポジトリのupdate

```
yum -y update nginx-release-centos
```

nginxのインストール

```
yum -y --enablerepo=nginx install nginx
```

## Rubyのインストール
### Ruby本体
ダウンロード

```
curl -O https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.5.tar.gz
```

ダウンロードファイルの解凍

```
tar xvf ruby-2.2.5.tar.gz
```

解凍ディレクトリへ移動

```
cd ruby-2.2.5
```

make準備

```
./configure --disable-install-doc
```

コンパイル

```
make
```

インストール

```
make install
```

### bundlerインストール

```
gem install bundler --no-rdoc --no-ri
```


### rubyバージョン確認

```
ruby -v
```

## PostgreSQLの初期設定
データベースクラスタの新規作成

```
postgresql-setup initdb
```

RedmineからPostgreSQLに接続するための設定を追加
※ 設定は参考webページ1に記載されている通り
※ 適宜読み替えて設定を行うこと。

```
vi /var/lib/pgsql/data/pg_hba.conf
```

ファイルの最終行に書きを追加

```
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    redmine         redmine         127.0.0.1/32            md5
host    redmine         redmine         ::1/128                 md5
```

postgresqlの実行

```
systemctl start postgresql
```

postgresqlの自動実行設定

```
systemctl enable postgresql
```

Redmine用のユーザ作成

```
sudo -u postgres createuser -P redmine
```

Redmine用のデータベース作成

```
sudo -u postgres createdb -E UTF-8 -l ja_JP.UTF-8 -O redmine -T template0 redmine
```

# Redmineのインストール

## 本体のインストール

### ダウンロード

※インストールフォルダは適宜読み替えること。

```
svn co http://svn.redmine.org/redmine/branches/3.2-stable /var/lib/redmine
```

## configの編集
### データベースへの接続設定
※ database.yml.exampleをコピーし下記ファイルを作成
※ 必要ない部分はコメントアウトか削除しています。

```/var/lib/redmine/config/database.yml
production:
  adapter: postgresql
  database: redmine
  host: localhost
  username: redmine
  password: "********"
  encoding: utf8
```

### email設定
#### Gmailの場合
※ configuration.yml.exampleをコピーし下記ファイルを作成

```/var/lib/redmine/config/configuration.yml
  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アドレス"
      password: "上記アドレスのパスワード"
```

__!!注意!!__ 
2016/05/21現在、上記設定でGmailへメール連携設定を行っても「ログイン試行をブロックしました」というメールが該当アドレスへ送信され、メールが送れません。
下記設定をGmailで行うことで回避できますが、セキュリティ的に心配な場合は別の方法をとってください。

##### Gmailのメール配送ブロック解除方法
※2016/05/21時点の情報の為、古い情報の場合は適宜読み替え必須

1. Gmailへログインする
1. 右記URLへアクセス
https://accounts.google.com/DisplayUnlockCaptcha
1. 「Google アカウントへのアクセスを許可」画面で次へをクリック
1. 右記URLへアクセス
https://myaccount.google.com/security
1. 一番下までスクロールし、「安全性の低いアプリの許可」を有効にする

__※上記手法が嫌な場合、別の方法を利用してください。__

#### SendGridの場合
※SendGridのSMTPを利用した送信方法です。
※アカウントはすでに取得済みとして進めます。
※ configuration.yml.exampleをコピーし下記ファイルを作成

```/var/lib/redmine/config/configuration.yml
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "smtp.sendgrid.net"
      port: 587
      authentication: login
      domain: "Your Redmine Domain"
      user_name: "Sendgrid User ID"
      password: "Sendgrid User Password"
```

※ `domain:`の部分は何が正解かちょっとわかっていません。
　私の場合は上記設定で動いてます程度の理解です・・・

### 日本語フォントの設定

```/var/lib/redmine/config/configuration.yml
rmagick_font_path: /usr/share/fonts/ipa-pgothic/ipagp.ttf
```

## インストールフォルダへ移動
```
cd /var/lib/redmine
```

### gemパッケージのインストール
```
bundle install --without development test --path vendor/bundle
```

## 初期データの登録と設定
### セッション改ざん防止用秘密鍵の作成
```
bundle exec rake generate_secret_token
```

### データベースのテーブル作成
```
RAILS_ENV=production bundle exec rake db:migrate
```

### defaultデータの登録
```
RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data
```

## 動作確認
WEBrickを実行し動作確認
WEBrick動作確認のためファイアウォールでポート3000を一時的に許可しておきます。

```
ruby bin/rails server webrick -e production
```

下記URLへアクセスし、動作していることを確認
http://ホストのIPアドレス:3000

WEBrickは「ctrl + C」で停止できます。

# Unicornのインストール
※ 参考WEBページ 2 が大変勉強になりました。

## インストール用の設定
redmineのインストールディレクトリへファイルを追加

```/var/lib/redmine/Gemfile.local
gem "unicorn"
```

## インストール
インストールディレクトリで下記を実行
※今回は/var/lib/redmine

``` 
bundle update
```

## 動作確認
※ WEBrickの動作確認で利用したポート3000を一時的に利用

```
bundle exec unicorn_rails -l 3000 -E production
```

## Redmine用Unicorn設定

設定ファイルの作成
※こちらも参考Webページ2をほぼ流用です・・・

```/var/lib/redmine/config/unicorn.rb
# -*- coding: utf-8 -*-
# Unicorn設定ファイル
# 次のURLのサンプルをベースにしている。
# http://unicorn.bogomips.org/examples/unicorn.conf.rb

# 専用サーバーであればコアにつき1個以上を指定する。
worker_processes 2

# リクエスト待ち受け口、TCPとUNIXドメインとが指定可能。
listen "/var/lib/redmine/tmp/sockets/redmine.sock", :backlog => 32
# listen 8282, :tcp_nopush => true

# タイムアウト秒数
timeout 30

# 稼働中のプロセスのPIDを書いておくファイル。
pid "/var/lib/redmine/tmp/pids/redmine.pid"

# デーモンで起動すると標準出力／標準エラー出力が/dev/nullになるので、
# それぞれログファイルに出力する。
# /var/logで一元管理する場合はフルパスで記載、その場合は/var/log配下にunicornディレクトリを作っておく。
# stderr_path '/var/log/unicorn/unicorn.stderr.log'
# stdout_path '/var/log/unicorn/unicorn.stdout.log'
stderr_path 'log/unicorn.stderr.log'
stdout_path 'log/unicorn.stdout.log'

# マスタープロセス起動時にアプリケーションをロードする(true時)。
# ワーカープロセス側でロードをしないのでメモリ消費、応答性良好になる。
# ただし、ソケットはfork後に開きなおす必要あり。
# HUPシグナルでアプリケーションはロードされない。
preload_app true

# unicornと同一ホスト上のクライアントとのコネクション限定で、維持されているかを
# アプリケーションを呼ぶ前にチェックする。
check_client_connection false

before_fork do |server, worker|
  # Railsでpreload_appをtrueにしているときは強く推奨
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  # Railsでpreload_appをtrueにしているときは必須
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection

  begin
    uid, gid = Process.euid, Process.egid
    # user, group = "redmine", "redmine"
    # ENV["HOME"] = "/home/redmine"
    target_uid = Etc.getpwnam(user).uid
    target_gid = Etc.getgrnam(group).gid
    worker.tmp.chown(target_uid, target_gid)
    if uid != target_uid or gid != target.gid
      Process.initgroups(user, target_gid)
      Process::GID.change_privilege(target_gid)
      Process::UID.change_privilege(target_uid)
    end
  rescue
    if RAILS_ENV = "development"
      STDERR.puts "could not change user, oh well"
    else
      STDERR.puts "could not change user, oh well"
      raise e
    end
  end
end
```

※ 参考WEBページ 3 からかなり流用させていただきました。
※ ディレクトリ周り以外はほぼ流用です・・・

## unicornのサービス化

下記ディレクトリにserviceファイルを作成
/usr/lib/systemd/system/redmine.service


``` redmine.service
[Unit]
Description=Redmine Unicorn Server

[Service]
WorkingDirectory=/var/lib/redmine
Environment=RAILS_ENV=production
SyslogIdentifier=redmine
PIDFile=/var/lib/redmine/tmp/pids/unicorn.pid

ExecStart=/usr/local/bin/bundle exec "unicorn_rails -c config/unicorn.rb -E production" 
ExecStop=/usr/bin/kill -QUIT $MAINPID
ExecReload=/bin/kill -USR2 $MAINPID

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

サービス起動確認

```
systemctl start redmine
```

サービスが正常に動いているかを確認

```
systemctl status redmine
```

こんな感じになっていればOK

```
● redmine.service - Redmine Unicorn Server
   Loaded: loaded (/usr/lib/systemd/system/redmine.service; disabled; vendor preset: disabled)
   Active: active (running) since 金 2016-05-27 02:34:07 JST; 3 days ago
 Main PID: 11375 (ruby)
   CGroup: /system.slice/redmine.service
           ├─11375 unicorn_rails master -c config/unicorn.rb -E production
           ├─11405 unicorn_rails worker[0] -c config/unicorn.rb -E production
           └─11407 unicorn_rails worker[1] -c config/unicorn.rb -E production

```

# Nginxの設定

nginxとunicronの連携設定です。
下記設定ファイルを作成します。
/ete/nginx/conf.d/redmine.conf

## httpで運用する場合

``` redmine.conf
upstream redmine {
    server unix:/var/lib/redmine/tmp/sockets/redmine.sock;
}
server {
    listen       80;
    server_name  youdomainname.com;

    root /var/lib/redmine/public;
    client_max_body_size 1G;

    location / {
        try_files $uri/index.html $uri.html $uri @app;
    }

    location @app {
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_connect_timeout 60;
        proxy_read_timeout 60;
        proxy_send_timeout 600;
        proxy_pass http://redmine;
    }

    error_page 500 502 503 504 /500.html;
    
}

```

## httpsで運用する場合

Let's Encryptでsslを実現しています。
証明書取得方法などは下記を参照してください。
https://letsencrypt.jp

※なんでこの設定かはまだ調べきれていないので後々何がどうなってるのか調べます・・・
なお、設定を下記サイトで計測した結果A+頂きました。
https://www.ssllabs.com/ssltest/

``` redmine.conf

upstream redmine {
    server unix:/var/lib/redmine/tmp/sockets/redmine.sock;
}

server {
    listen 80;
    server_name youredmine.domain;
    rewrite ^ https://$server_name$request_uri? permanent;
} 

server {
    listen       443 ssl;
    server_name  youredmine.domain;
    
    root /var/lib/redmine/public;

    ssl on;

    ssl_certificate /etc/letsencrypt/live/youredmine.domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/youredmine.domain/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets on;

    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    
    ssl_prefer_server_ciphers on;

    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/youredmine.domain/fullchain.pem;
    resolver 8.8.8.8;

    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';

    client_max_body_size 1G;

    access_log  /var/log/nginx/redmine.access.log;
    error_log /var/log/nginx/redmine.error.log;

    location / {
        try_files $uri/index.html $uri.html $uri @app;
    }

    location @app {
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_connect_timeout 60;
        proxy_read_timeout 60;
        proxy_send_timeout 600;
        proxy_pass http://redmine;
    }

    error_page 500 502 503 504 /500.html;

}

```

nginxを起動する

```
systemctl start nginx
```

正常に起動したら設定しているURLへアクセスし、画面が表示されることを確認します


# あとは好きなプラグインやテーマを入れて運用しましょう。
## 私の入れた(入れたい)プラグイン

### Redmine Theme Changer plugin
ユーザごとにテーマを変更できるようにするプラグイン
テーマは管理者が入れる必要があるが、ユーザごとに好きにテーマが入れられるので利用意欲が湧くかも？
マイグレーションが必要

### Sidebar Hide Plugin
チケット画面等でフィルターやウォッチユーザを表示しているサイドバーを隠せるようにするプラグイン
巷では「View customize plugin」を入れ、自分でjsを書くようですが私はこのプラグインで十分でした。
マイグレーションの必要はありません

### Good Job plugin
入れたいプラグインその１
チケットが閉まると背景が「Good job!」な感じになるみたい。
チケット閉めるたび心がほんわかしそう。

### Redmine Backlogs plugin
入れてみたいプラグインその２
スクラム開発で使うバックログ機能をredmine上で提供するプラグイン
まだ自分用のredmineなので必要ないかな・・・？
もうちょっと開発手法などを勉強してから試したい

## 私の入れたテーマ
### A1
http://redminecrm.com/pages/a1-theme
黒っぽい画面が好きなので入れてみました。
かっこいい

### Axiom
https://github.com/hulihanapplications/axiom
こちらも黒っぽい画面のテーマ。
ギークな感じがいい感じ。
ただ画面がでかいPCのだと描画範囲が狭く感じるかも？

### gitmike theme
https://github.com/makotokw/redmine-theme-gitmike
Githubっぽく見えるテーマ。
入れてみたけどあんまり使ってないかも・・・