Docker Linux Redmine

Docker上でRedmineとnginx-proxyを連携(SSL対応)

投稿日:2017年10月7日 更新日:

今回は、Docker上でRedmineサーバを構築し、SSLに対応したnginx-proxyとの連携を行います。

追記(2017/10/08):作成したdocker-compose.ymlをGithubに公開しました。目次の「Github」からダウンロードできます。

背景

VPSをレンタルしてLinuxサーバを立てました。私がサーバで実現したい要件は以下です。

  • ブログ用のWebサーバの構築
  • タスク管理用のチケット管理システムの構築
  • 上記の2つのサービスへのアクセスを、1つのIPアドレスで待ち受ける
  • 上記の要件をSSLを用いて暗号化する

そこで、今回はDockerとDockerイメージを用いて、上記の要件を実現しようと思います。

  • Webサーバ→Wordpress公式Dockerイメージ(Wordpress+mysql)
  • チケット管理システム→Redmine公式Dockerイメージ(Redmine+mysql)
  • 1つのIPアドレス(メイン+サブドメイン)で上記サービスへのリクエストを待ち受ける→nginx-proxyを用いたマルチドメイン環境
  • 上記のSSLでの暗号化→nginx-proxyとdocker-letsencrypt-nginx-proxy-companionの連携

本記事では、Redmine公式イメージを使用してRedmineサーバを立てる部分を記述します。

事前条件

本Redmine環境構築の記事は、下記別記事にあります、nginx-proxy及びdocker-letsencrypt-nginx-proxy-companionを完了させた状態で動作させる方法を記述しています。本記事の内容を試される場合は、先に下記記事の作業を完了させてください。

Redmine公式docker-composeの編集

Redmine公式のイメージでは、mysqlイメージとの依存関係があります。このため、公式ページには、Redmineとmysqlが連携できるよう、docker-compose.ymlのサンプルが記述されています。

今回は、このサンプルをもとに、nginx-proxyと連携するための設定を付加していきます。

できあがったdocker-compose.ymlは以下になります。

version: '3.1'

services:

  redmine:
    image: redmine
    restart: always
    ports:
      - 3000:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: sample

      VIRTUAL_HOST: domainname1.net
      VIRTUAL_PORT: 3000
      LETSENCRYPT_HOST: domainname1.net
      LETSENCRYPT_EMAIL: emailaddress@test.com
      LETSENCRYPT_TEST: "false"
    volumes:
      - /srv/docker/redmine/redmine:/home/redmine/data
    networks:
      - default
      - ssl_proxy


  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: sample
      MYSQL_DATABASE: redmine
    volumes:
      - /srv/docker/redmine/mysql:/var/lib/mysql

networks:
  ssl_proxy:
    external: true

redmine側の大きな変更点は以下です。

  • 14〜15行目にnginx-proxyの設定を追加しました
    • VIRTUAL_HOST:nginx-proxyにプロキシしてほしいドメイン名を記述します。
      VIRTUAL_HOST: domainname1.net

      この例の場合、domainname1.netに来たパケットをプロキシしてくれます。

    • VIRTUAL_PORT:VIRTUAL_HOSTに該当したパケットをどのポートにフォワードするかを決めます。
      VIRTUAL_PORT: 3000

      この例の場合は3000番ポートにフォワードするため、8行目のportsオプションにより、redmine内部にフォワードされます。

  • 16〜19行目では、docker-letsencrypt-nginx-proxy-companionが、Let’s encryptで使用する情報を記述しています。
    LETSENCRYPT_HOST: domainname1.net
    LETSENCRYPT_EMAIL: emailaddress@test.com
    LETSENCRYPT_TEST: "false"

    それぞれ、証明書を申請するためのドメイン名、メールアドレスです。また、テストは行わないため、falseにしています。

  • 19行目では、redmineの設定を永続化させるため、volumesオプションでredmineディレクトリをホスト側にマウントしています。
    volumes:
      - /srv/docker/redmine/redmine:/home/redmine/data
  • 23行目には、networksオプションで、nginx-proxyが認識するネットワークブリッジ(ssl_proxy)を記述します。
    networks:
      - default
      - ssl_proxy

    ブリッジの指定を忘れると、nginx-proxyがVIRTUAL_HOST等を認識できず、プロキシが行われないため注意してください。

mysql側の大きな変更点は以下です。

  • 28行目で、commandオプションを使用しています。
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci

    これは、デフォルトのmysqlの文字コードの関係で、Redmine側で日本語テーマがロードできなくなるという問題点を解決するためのものです。

  • 33行目では、データベースの永続化とRedmineとの連携を行うため、volumesコマンドでホスト側のRedmineディレクトリをマウントしています。
    volumes:
      - /srv/docker/redmine/mysql:/var/lib/mysql

最後に、36行目からは、networksで、nginx-proxyと共有するネットワークブリッジについて、外部参照可能な状態にします。

networks:
  ssl_proxy:
    external: true

動作確認

nginx-proxy用のdocker-composeを起動後、Redmine用のdocker-compose.ymlファイルを起動します。

admin@hostname:~# docker-compose up -d

事前に動作させておいたnginx-proxyコンテナにexecして、Redmineコンテナが正しくproxyされているかを確認します。

admin@hostname:~# docker exec -it nginx-proxy /bin/bash
root@698eef80cff4:/app# cat /etc/nginx/conf.d/default.conf 
server {
        server_name _; # This is just an invalid value which will never trigger on a real hostname.
        listen 80;
        access_log /var/log/nginx/access.log vhost;
        return 503;
}
(中略)
# domainname1.net
upstream domainname1.net {
                                ## Can be connect with "ssl_proxy" network
                        # redmine_redmine_1
                        server 172.18.0.3:3000;
}
server {
        server_name domainname1.net;
        listen 80 ;
        access_log /var/log/nginx/access.log vhost;
        return 301 https://$host$request_uri;
}
server {
        server_name domainname1.net;
        listen 443 ssl http2 ;
        access_log /var/log/nginx/access.log vhost;
        ssl_protocols (省略);
        (SSLの情報は省略)
        include /etc/nginx/vhost.d/default;
        location / {
                proxy_pass http://domainname1.net;
        }
}

domainname1.netに対するプロキシ及びSSLの情報が追加されていることが確認できます。

その後、設定したドメイン名に向かってブラウザ上からHTTPSでリクエストを投げ、無事、Redmineのログイン画面が表示されれば、動作確認完了です。

終わりに

これで、nginx-proxy越しにサーバに対してアクセスする環境が整いました。以降は、プロキシしたいサービスが増加するたびに、docker-compose.ymlにnginx-proxyの設定を書き込めば良いわけです。

また、ネイティブ環境にRedmineを入れるときに出くわす、Rubyや関連パッケージのバージョン合わせ等も必要ありません。簡単ですね!

Github

今回使用したdocker-compose.ymlをGithubに公開しました。下記リンクからgit cloneすることで、docker-compose.ymlが取得できます。

-Docker, Linux, Redmine
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

関連記事

Linuxサーバの初期設定(Ubuntu 16.04 LTS)

先日、VPS(Scaleway VCS1プラン)をレンタルし、Linuxサーバを立ち上げました。その際の初期設定について記述していきます。 目次1 環境2 作業内容2.1 ユーザ設定2.2 SSH設定 …

ハニーポットcowrieをDockerから起動する

設定等でハマったのでメモとして残します。 [2018/5/2 追記] 下記に取り上げたcowrie公式dockerイメージの公開が停止しています。 代わりに、docker上でKippoを用いて低対話型 …

systemdでのCPU制限方法~serviceファイルでの設定編

systemd に悩まされる皆様、進捗どうですか(? 標題の件、仕事で必要に迫られたため、備忘録として。 目次1 まえがき2 動作環境3 確認内容3.1 systemdから起動するserviceのデフ …

systemdからdockerコンテナを起動+timerで定期実行

今回はdockerコンテナをsystemdから起動し、かつtimerを使用して定期実行する方法を紹介します。 目次1 背景2 要求と仕様3 systemdについて4 設計・実装4.1 テストアプリとs …

pthread_cancelすると何が行われるのか

仕事でのメモ。 目次1 pthread_cancel2 pthread_cancelで何が行われるのか2.1 シグナル送出2.2 注意2.3 ソースコードを読む2.4 pthread_cancel時の …