redmine3.4.6をcentos7+apache+mariadb+rbenv+unicornで起動した手順MEMO

## やりたかったこと

宗教上の理由から、以下の環境でredmineを動かしたかった

* CentOS7 （インストールはここでは割愛）
* Apache2 （インストールはここでは割愛）
* MariaDB （インストールはここでは割愛）
* rbenv-ruby2.5.1 （インストールはここでは割愛）
* unicorn
    * relative_url `https://~~/redmine`
* redmine 3.4.6

## srcコードを取ってきて展開

redmine公式からリリースバージョンのコードを取ってきて、/opt/redmineとして展開する。
ついでに、必要なconfigファイルを二つ作成。

* configuration.yml
    * とりあえずコピーしているが、smtp周りは必要に応じて適宜設定
* database.yml
    * 今回は同一サーバ上のmariadbを使うので、ソケット指定。
    * 別のdbサーバを使うなら、適宜設定のこと。

```bash:bash
wget http://www.redmine.org/releases/redmine-3.4.6.tar.gz -O /usr/local/src/redmine-3.4.6.tar.gz
tar zxvf /usr/local/src/redmine-3.4.6.tar.gz -C /opt/
mv /opt/redmine-3.4.6 /opt/redmine
cp -p /opt/redmine/config/configuration.yml.example /opt/redmine/config/configuration.yml
echo '2.5.1' > /opt/redmine/.ruby-version
```

```yaml:config/database.yml
# Default setup is given for MySQL with ruby1.9.
# Examples for PostgreSQL, SQLite3 and SQL Server can be found at the end.
# Line indentation must be 2 spaces (no tabs).

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 10
  username: redmine
  password: 'database_no_password'
  socket: /var/lib/mysql/mysql.sock

production:
  <<: *default
  database: redmine
```

## unicornで動かす準備

redmineはredmineで動かしたいので、unicornも合わせてインストールする。
別にpumaでも問題なく、そちらの方が（公式含め）マニュアル等情報が多いのだが、そこは宗教上の理由からunicornを選択。
unicorn.rbは、何と言うか、適当。とりあえずアクセスはApache proxyを通して行うので、Listenはローカルホストに絞っている。

```bash:bash
echo 'gem "unicorn"' >> /opt/redmine/Gemfile
```

```ruby:config/unicorn.rb
rails_root = File.expand_path('../../', __FILE__)
ENV['BUNDLE_GEMFILE'] = rails_root + '/Gemfile'

worker_processes 1
working_directory rails_root
timeout 30
stderr_path File.expand_path('../../log/unicorn_stderr.log', __FILE__)
stdout_path File.expand_path('../../log/unicorn_stdout.log', __FILE__)
pid File.expand_path('../../tmp/pids/unicorn.pid', __FILE__)

listen "127.0.0.1:8280"

preload_app true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and
      ActiveRecord::Base.connection.disconnect!

  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end"
```

## relative_url（/redmine）で動かす準備

`https://~~/redmine`でアクセスがきた場合にredmineに動かしたい。
方法は何種類かあるが、一番手早い上、今回は別段他のアクセス方法を準備する必要はなかったので、relative_urlを使って対応。
とは言いつつ、一応URLは環境変数に逃して、汎用的に使えるようにしている。

```ruby:config.ru
# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
if ENV['RAILS_RELATIVE_URL_ROOT'] then
  map ENV['RAILS_RELATIVE_URL_ROOT'] do
    run RedmineApp::Application
  end
else
  run RedmineApp::Application
end
```

## いざ、インストール

secret.ymlを作成して、インストール開始。

```bash:bash
bundle install --no-deployment --path="vendor/bundle"
RAILS_ENV=production bundle exec rake secret
```

```yaml:config/secrets.yml
production:
    secret_key_base: sakki_no_secret_token
```

```bash:bash
RAILS_ENV=production bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data
```

proxyなど使ってとりあえず一発アクセス試してみたいなら

```bash:bash
RAILS_ENV=production RAILS_RELATIVE_URL_ROOT=/redmine bundle exec unicorn_rails -c config/unicorn.rb -E production --path /redmine
```

で起動する。
systemdへの登録などはさておき、とりあえず起動したいだけば、`-D`オプションをつけてデーモン起動してやると楽かもしれない。

## systemd経由でredmine(unicorn)を起動する

systemdファイルはこんな感じ。

```:/etc/systemd/system/redmine.service 
[Unit]
Description=Redmine Unicorn Server
After=mariadb.service

[Service]
Type=simple
User=root
WorkingDirectory=/opt/redmine/
Environment=RAILS_ENV=production
Environment=RAILS_RELATIVE_URL_ROOT=/redmine
SyslogIdentifier=redmine-unicorn
PIDFile=/opt/redmine/tmp/pids/unicorn.pid

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

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

```bash:bash
systemctl daemon-reload
systemctl start redmine
```

## Apacheのconfigにプロキシ設定追加

```conf:httpd.conf
    # redmine
    ProxyPass /redmine http://localhost:8280/redmine/
    ProxyPassReverse /redmine http://localhost:8280/redmine/
```

あとは`https://~~/redmine`にアクセスしてみて、動くことを確認。
ちょこちょこ設定手抜きしているので、適宜config類は編集してほしい。

## 蛇足

そんなに特殊な環境ではないと思っていたが、

* unicornを使う
* relative_urlでアクセスする

あたりは意外と情報がなかったりしたの書き留めようと思い立ち、
まとめるのが面倒臭くなっている間にredmine4が出ようとしていたので放置していた。
が、未だ出そうにないので、MEMOのままではあるが、滑り込み投稿してみた。

人生、勢いって大事。