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で動作しますが、本番環境ではpostgreSQLやmySQLなどにする必要があります(mySQLは相性が良くないようなので、postgreSQLがよいでしょう)。
最後に
久々のRedmine構築で調べまくりでしたが、意外と変更箇所が少なくてよかったです。
ただ、Dockerで動かすのはどこのサイトを見てもpassengerを使っているので軽量なalpineの情報がないのはつらかったですが。。。
今回のソースコードは以下のGistにまとまっていますので、よろしかったら参照してみてください。