6
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VPSにhttps対応でマルチドメインのRedmineを構築しよう~Docker Redmine環境構築手順編~

Last updated at Posted at 2018-09-26

要件

  • VPSにRedmineをDockerベースで構築したい
  • 既にbitnamiで構築済みのRedmineをDockerベースに移行したい
  • httpsに対応してほしい
  • Redmineのコンテナを複数立ち上げて、マルチドメインのRedmineを気軽に構築したい

上記要件が社内で出たので、構築した手順のメモ

参考にしたサイト

Redmine を Docker 公式イメージで運用する

bitnami でインストールした Redmine を Docker に移設した

Docker上でnginx-proxy他を使ってSSL対応マルチドメインサーバ環境の構築

Docker Redmine(https/マルチサイト対応)環境構築手順

事前準備

  • rootでログインしておく。
  • MySQLのバックアップデータを事前にダンプしておく。参考サイト
  • Redmineのバックアップデータを予め取得しておく。参考サイト

事前実行コマンド

mkdir ~/work
mkdir ~/work/nginx
mkdir ~/work/redmine

nginx設定手順

~/work/nginx/docker-compose.ymlを下記内容で作成する

version: "2"
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    privileged: true
    ports:
      - 80:80
      - 443:443
    volumes:
      - /srv/docker/nginx-proxy-with-encrypt/certs:/etc/nginx/certs:ro
      - /srv/docker/nginx-proxy-with-encrypt/htpasswd:/etc/nginx/htpasswd
      - /etc/nginx/vhost.d
      - /usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - /srv/docker/nginx-proxy-with-encrypt/log:/var/log/nginx
    networks:
      - default
      - ssl_proxy
    restart: always
  
  letsencrypt-nginx:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt-nginx
    privileged: true
    volumes:
      - /srv/docker/nginx-proxy-with-encrypt/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    volumes_from:
      - nginx-proxy
    restart: always
networks:
  ssl_proxy:
    external: true

ネットワークブリッジを新規作成

docker network create --driver bridge ssl_proxy

※初回のみで良い。

もし下記のようなエラーになったら、

Error response from daemon: Failed to Setup IP tables: Unable to enable SKIP DNAT rule:  (iptables failed: iptables --wait -t nat -I DOCKER -i br-4d0938766655 -j RETURN: iptables: No chain/target/match by that name.
 (exit status 1))

下記コマンドを実行

mv /var/lib/docker/network/files /tmp/docker-iptables-err && \
systemctl restart docker

解決策参考サイト

docker-compose実行

cd ~/work/nginx/ && \
docker-compose up -d

Redmine設定手順

~/work/redmine/.envを下記内容で作成する

DOCK_REDMINE_USE_PORT=3000
DOCK_REDMINE_DB_PASS=sample
DOCK_REDMINE_DB_NAME=redmine
DOCK_REDMINE_DOMAIN=sample-redmine.com
DOCK_REDMINE_EMAIL=emailaddress
DOCK_REDMINE_VOLUME=/srv/docker/redmine/
  • DOCK_REDMINE_USE_PORT・・・RedmineとDockerホストを接続するポート番号。サービスごとに固有のポート番号を割り振る。
  • DOCK_REDMINE_DB_PASS・・・Redmineが使用するDBのルートパスワード。サービスごとに固有でなくても良い。
  • DOCK_REDMINE_DB_NAME・・・Redmineが使用するDB名。サービスごとに固有でなくても良い。
  • DOCK_REDMINE_DOMAIN・・・Redmineにアクセスする際のドメイン名。サービスごとに固有のドメインを割り振る。
  • DOCK_REDMINE_EMAIL・・・Let's Encryptで使用するメアドのアカウント名。DOCK_REDMINE_EMAIL@DOCK_REDMINE_DOMAINのように連結される。
  • DOCK_REDMINE_VOLUME・・・Redmineの各種フォルダをマッピングするパス名。マッピングされるフォルダ下記のとおり。サービスごとにパスを変える必要がある。
    • files
    • log
    • plugins
    • public/themes

~/work/redmine/docker-compose.ymlを下記内容で作成する

version: '3.5'

services:

  redmine:
    image: redmine
    restart: always
    ports:
      - ${DOCK_REDMINE_USE_PORT}:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: ${DOCK_REDMINE_DB_PASS}

      VIRTUAL_HOST: ${DOCK_REDMINE_DOMAIN}
      VIRTUAL_PORT: ${DOCK_REDMINE_USE_PORT}
      VIRTUAL_PROT: https
      LETSENCRYPT_HOST: ${DOCK_REDMINE_DOMAIN}
      LETSENCRYPT_EMAIL: ${DOCK_REDMINE_EMAIL}@${DOCK_REDMINE_DOMAIN}
      LETSENCRYPT_TEST: "false"
    volumes:
      - ${DOCK_REDMINE_VOLUME}files:/usr/src/redmine/files
      - ${DOCK_REDMINE_VOLUME}log:/usr/src/redmine/log
      - ${DOCK_REDMINE_VOLUME}plugins:/usr/src/redmine/plugins
      - ${DOCK_REDMINE_VOLUME}public/themes:/usr/src/redmine/public/themes
    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: ${DOCK_REDMINE_DB_PASS}
      MYSQL_DATABASE: ${DOCK_REDMINE_DB_NAME}
    volumes:
      - ${DOCK_REDMINE_VOLUME}mysql:/var/lib/mysql

networks:
  ssl_proxy:
    external: true

docker-compose実行

cd ~/work/redmine/ && \
docker-compose up -d

動作確認

docker exec -it nginx-proxy /bin/bash

Dockerコンテナ内で下記コマンド実行

cat /etc/nginx/conf.d/default.conf

DOCK_REDMINE_DOMAINに対するプロキシ及びSSLの情報が追加されていることを確認
※環境による可能性もあるが、証明書を取得するのに数十秒かかることもあるので、少し待ってから見に行くと良い

Let's Encryptエラー事例

MySQLバックアップファイルのリストア

zcat ~/redmine_yyyy-mm-dd.sql.gz | docker exec -i redmine_db_1 mysql -psample redmine

redmine_db_1はターゲットとするコンテナの名前

-psampleはパスワード-pオプションの後に空白入れずにパスワードを入れる

Redmineバックアップファイルのリストア

cd /srv/docker/redmine/ && \
tar xf ~/redmine_yyyy-mm-dd.tar.gz

メール設定

configuration.ymlを適切に設定して、下記コマンド実行

docker cp ~/work/redmine/configuration.yml redmine_redmine_1:/usr/src/redmine/config/configuration.yml

configuration.yml設定例

外部SMTPサーバー使用例
  email_delivery:
    delivery_method: :smtp
    smtp_settings:

      address: "sample-redmine.com"
      port: 587
      domain: 'sample-redmine.com'
      authentication: :login
      user_name: 'test@sample-redmine'
      password: 'password'
      enable_starttls_auto: false
Gmail SMTPサーバー使用例
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      
      address: smtp.gmail.com
      port: 587
      domain: example.net
      authentication: :login
      user_name: sample@example.net
      password: password

imagemagick_convert_command設定例

imagemagick_convert_command: /usr/bin/convert

imagemagick_convert_commandはRedmine公式イメージなら上記パスに格納されいる。
パスを確認するには下記コマンドを実行する

docker exec -it redmine_redmine_1 /bin/bash
which convert

dockerコンテナの再起動

cd ~/work/redmine/ && \
docker-compose restart

6
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?