kuri's notebook

気になったものごとの備忘録です。

Redmine+NGINXをDocker上で動かす

仕事で久々にRedmineを構築することになったので、せっかくなのでDocker上で動かすことにしました。

RedmineってRuby on Railsで動いているのでmigrationとかが走るので面倒ですが、なんとかできたのでその記録としてまとめます。

環境

  • Ubuntu Server 19.04

  • Docker18.09.1

  • docker-compose 1.25.0

1. RedmineのDockerイメージ作成

まず、RedmineのDockerイメージを作成します。
基本的にはRedmine公式のDockerイメージを使用しますが、今回はほかのシステムとの共存が必要なのでサブディレクトリ対応する必要があります。

カスタムRedmineのDockerfileとして以下のDockerfileを作成します。
config.ruの内容は後で触れますので、取り合えずこのファイルを追加するのだなと思っておいてください。

config.ru以外は何もないので、ほとんど公式イメージと同じですね(笑)

FROM redmine:4.0.5-alpine

COPY --chown=redmine:redmine config.ru config.ru

2. config.ruの作成

では、カスタムRedmineの肝となるconfig.ruを記載します。

基本的にRedmineのIssueに記載されている内容通りに作れば問題ありません。

これでサブディレクトリがある場合/ない場合両方に対応したイメージが作成できます。
どうしてか公式のイメージには含まれていないんですよね~。

3. リバースプロキシ設定を作成

NGINXに読み込ませるリバースプロキシの設定を作成します。 ここで設定するサブディレクトリとこの後で設定する環境変数を合わせないと動作しないので注意が必要です。

upstream redmine_back {
  server redmine:3000;
}
server {
  location /redmine/ {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-Host $host;
    
    proxy_pass http://redmine_back/redmine/;
    proxy_redirect default;
  }
}

ここの細かな設定は説明しませんが、リバースプロキシを設定する場合はこれらproxy_set_headerを設定しておくと無難です。

4. docker-compose.ymlを作成する

最後にcomposeの設定を作成します。

重要なのはredmine環境変数RAILS_RELATIVE_URL_ROOTを入れることとweb-proxyサービスのvolumesで作成したdefault.confを参照することです。
環境変数 RAILS_RELATIVE_URL_ROOTでサブディレクトリを指定します。
また、web-proxyのdefault.confは既存で存在しますが、上書きするのがよいです。

version: '3'
services:
  redmine:
    build:
      context: ./redmine
      dockerfile: Dockerfile
    environment: 
      RAILS_RELATIVE_URL_ROOT: '/redmine'
  web-proxy:
    image: nginx:1.17-alpine
    volumes: 
      - ./web-proxy/default.conf:/etc/nginx/conf.d/default.conf
    links:
      - redmine
    ports:
      - 80:80

5. 実行

最後にdocker-composeを使用して実行します。
今回はRDBMSがないのでSQLite3で動作しますが、本番環境ではpostgreSQLmySQLなどにする必要があります(mySQLは相性が良くないようなので、postgreSQLがよいでしょう)。

最後に

久々のRedmine構築で調べまくりでしたが、意外と変更箇所が少なくてよかったです。
ただ、Dockerで動かすのはどこのサイトを見てもpassengerを使っているので軽量なalpineの情報がないのはつらかったですが。。。

今回のソースコードは以下のGistにまとまっていますので、よろしかったら参照してみてください。

Running redmine under the NGINX reverse proxy on D ...