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

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

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

## 参考にしたサイト
[Redmine を Docker 公式イメージで運用する](https://qiita.com/bezeklik/items/b5c39136a8db23e2e81c)

[bitnami でインストールした Redmine を Docker に移設した](https://qiita.com/bezeklik/items/1840fdd7aef84cd979c7)

[Docker上でnginx-proxy他を使ってSSL対応マルチドメインサーバ環境の構築](https://hogehuga.net/linux/116/)

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

## 事前準備
- rootでログインしておく。
- MySQLのバックアップデータを事前にダンプしておく。[参考サイト](https://qiita.com/bezeklik/items/1840fdd7aef84cd979c7)
- Redmineのバックアップデータを予め取得しておく。[参考サイト](https://qiita.com/bezeklik/items/1840fdd7aef84cd979c7)

---

## 事前実行コマンド

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

---

## nginx設定手順

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

```yaml
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
```

<span style="color:#ff0000;">※初回のみで良い。</span>

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

```
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
```

[解決策参考サイト](https://qiita.com/miwato/items/9770a2a757d3f5e369a4)

### 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を下記内容で作成する

```yaml
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エラー事例](https://community.letsencrypt.org/t/how-to-create-certificate-that-will-be-fully-trusted-by-browsers-green-lock-for-local-development-but-on-domain-other-than-localhost/58403#post_2)

### 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サーバー使用例

```yaml
  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
```

---