RedmineとGitLabをLet's Encrypt(https-portal)を使用しDocker上に構築する

## はじめに
以下サイト様などを参考にさせていただきました。
[docker で全自動 Let's encrypt](https://qiita.com/kuboon/items/f424b84c718619460c6f)

## 目的
何か作ろうと思い立つ -> レンタルのVPSサーバに立てていたRedmineとGitLabを壊して再構築 -> 熱が冷める -> 何を作ろうとしていたか忘れる の生産性ゼロの無限ループからの脱却

## 環境
* Ubuntu 16.04 on さくらVPS

※ DTIだとカーネルバージョン低すぎてdocker使えない問題があったためさくらへ引っ越し

## 事前準備
### docker/docker-composeのインストール
[公式サイト](http://docs.docker.jp/engine/installation/linux/docker-ce/ubuntu.html)などを参考にインストールする。
ユーザ権限でのdocker実行・コマンド補完等も設定しておくと便利。

### ドメイン取得
以前はフリーのサブドメイン取得サービス使用していたがだがしかし、サブドメインだとLet's Encryptの週5回制限に引っかかるため、[お名前.com](https://www.onamae.com/)で独自ドメイン取得。
Redmine用とGitLab用のサブドメイン(Aレコード)を取得し、ホストIPアドレスに割り当てておく。

## 使用Dockerイメージ一覧 (2018/02/05現在)
| REPOSITORY              | TAG                 | IMAGE ID     |
| ----------------------- | ------------------- | ------------ |
| sameersbn/redmine       | latest              | c80277c852be |
| sameersbn/mysql         | latest              | b3adeabf2484 |
| sameersbn/gitlab        | 10.4.2              | dc07b7d00db8 |
| sameersbn/redis         | latest              | d8f7b0e07097 |
| sameersbn/postgresql    | 9.6-2               | 7f79690e67e0 |
| steveltn/https-portal   | 1                   | 96ff11c6fcc4 |


## ファイル構成
#

```sh
├── letsencrypt/
│   └── docker-compose.yml
│
├── gitlab/
│   └── docker-compose.yml
│
├── redmine/
│   └── docker-compose.yml
│
├── start-up.sh # 起動スクリプト
│
├── shut-duwn.sh # 停止スクリプト
│
└── .env # 環境変数定義
```

## ファイルの中身

少し長くなるが、以下各ファイルの詳細。
基本的に.envファイル以外はコピペで行ける、、はず。

```yaml:letsencrypt/docker-compose.yml
version: '2'

services:
    https-portal:
        image: steveltn/https-portal:1
        ports:
            - '80:80'
            - '443:443'
        restart: always
        volumes:
            - /srv/docker/https-portal/certs:/var/lib/https-portal
            - /var/run/docker.sock:/var/run/docker.sock:ro
        environment:
            STAGE: 'production' # 'production' 'staging' 'local'
            FORCE_RENEW: 'true'
        networks:
            - default
            - redmine_default
            - gitlab_default

networks:
    redmine_default:
        external: true
    gitlab_default:
        external: true
```

```yaml:redmine/docker-compose.yml
version: '2'

services:
    redmine-mysql:
        restart: always
        image: sameersbn/mysql:latest
        environment:
            - DB_USER=${REDMINE_DB_USER}
            - DB_PASS=${REDMINE_DB_PASS}
            - DB_NAME=redmine_production
        volumes:
            - /srv/docker/redmine/mysql:/var/lib/mysql

    redmine:
        restart: always
        image: sameersbn/redmine:latest
        container_name: redmine
        depends_on:
            - redmine-mysql
        networks:
            - default
            - local-link
        volumes:
            - /srv/docker/redmine/redmine:/home/redmine/data
        environment:
            - VIRTUAL_HOST=${REDMINE_VIRTUAL_HOST}

            - TZ=Asia/Tokyo

            - DB_ADAPTER=mysql2
            - DB_HOST=redmine-mysql
            - DB_PORT=3306
            - DB_USER=${REDMINE_DB_USER}
            - DB_PASS=${REDMINE_DB_PASS}
            - DB_NAME=redmine_production

            - REDMINE_PORT=
            - REDMINE_HTTPS=false
            - REDMINE_RELATIVE_URL_ROOT=
            - REDMINE_SECRET_TOKEN=

            - REDMINE_SUDO_MODE_ENABLED=false
            - REDMINE_SUDO_MODE_TIMEOUT=15

            - REDMINE_CONCURRENT_UPLOADS=2

            - REDMINE_BACKUP_SCHEDULE=
            - REDMINE_BACKUP_EXPIRY=
            - REDMINE_BACKUP_TIME=

            - SMTP_ENABLED=true
            - SMTP_METHOD=smtp
            - SMTP_DOMAIN=smtp.gmail.com
            - SMTP_HOST=smtp.gmail.com
            - SMTP_PORT=587
            - SMTP_USER=${SMTP_USER}
            - SMTP_PASS=${SMTP_PASS}
            - SMTP_STARTTLS=true
            - SMTP_AUTHENTICATION=login

            - IMAP_ENABLED=false
            - IMAP_HOST=imap.gmail.com
            - IMAP_PORT=993
            - IMAP_USER=${IMAP_USER}
            - IMAP_PASS=${IMAP_PASS}
            - IMAP_SSL=true
            - IMAP_INTERVAL=30

networks:
    local-link:
        external: true
```

```yaml:gitlab/docker-compose.yml
version: '2'

services:
    gitlab-redis:
        restart: always
        image: sameersbn/redis:latest
        volumes:
            - /srv/docker/gitlab/redis:/var/lib/redis:Z

    gitlab-postgresql:
        restart: always
        image: sameersbn/postgresql:9.6-2
        volumes:
            - /srv/docker/gitlab/postgresql:/var/lib/postgresql:Z
        environment:
            - DB_USER=${GITLAB_DB_USER}
            - DB_PASS=${GITLAB_DB_PASS}
            - DB_NAME=gitlabhq_production
            - DB_EXTENSION=pg_trgm

    gitlab:
        restart: always
        image: sameersbn/gitlab:10.4.2
        container_name: gitlab
        depends_on:
            - gitlab-redis
            - gitlab-postgresql
        networks:
            - default
            - local-link
        volumes:
            - /srv/docker/gitlab/gitlab:/home/git/data:Z
        environment:
            - VIRTUAL_HOST=${GITLAB_VIRTUAL_HOST}

            - DEBUG=false

            - DB_ADAPTER=postgresql
            - DB_HOST=gitlab-postgresql
            - DB_PORT=5432
            - DB_USER=${GITLAB_DB_USER}
            - DB_PASS=${GITLAB_DB_PASS}
            - DB_NAME=gitlabhq_production

            - REDIS_HOST=gitlab-redis
            - REDIS_PORT=6379

            - TZ=Asia/Tokyo
            - GITLAB_TIMEZONE=Tokyo

            - GITLAB_HTTPS=true
            - SSL_SELF_SIGNED=false

            - GITLAB_HOST=${GITLAB_HOST}
            - GITLAB_PORT=
            - GITLAB_SSH_PORT=
            - GITLAB_RELATIVE_URL_ROOT=
            - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string
            - GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string
            - GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string

            - GITLAB_NOTIFY_ON_BROKEN_BUILDS=true
            - GITLAB_NOTIFY_PUSHER=false

            - GITLAB_EMAIL=${GITLAB_EMAIL}
            - GITLAB_EMAIL_REPLY_TO=${GITLAB_EMAIL_REPLY_TO}
            - GITLAB_INCOMING_EMAIL_ADDRESS=${GITLAB_INCOMING_EMAIL_ADDRESS}

            - GITLAB_BACKUP_SCHEDULE=daily
            - GITLAB_BACKUP_TIME=01:00

            - SMTP_ENABLED=true
            - SMTP_DOMAIN=smtp.gmail.com
            - SMTP_HOST=smtp.gmail.com
            - SMTP_PORT=587
            - SMTP_USER=${SMTP_USER}
            - SMTP_PASS=${SMTP_PASS}
            - SMTP_STARTTLS=true
            - SMTP_AUTHENTICATION=login

            - IMAP_ENABLED=false
            - IMAP_HOST=imap.gmail.com
            - IMAP_PORT=993
            - IMAP_USER=${IMAP_USER}
            - IMAP_PASS=${IMAP_PASS}
            - IMAP_SSL=true
            - IMAP_STARTTLS=false

networks:
    local-link:
        external: true
```

```sh:start-up.sh
#!/bin/bash

source .env

# create local network
docker network create local-link

# redmine
docker-compose -f redmine/docker-compose.yml up -d

# gitlab
docker-compose -f gitlab/docker-compose.yml up -d

# https-portal
docker-compose -f letsencrypt/docker-compose.yml up -d
```

```sh:shut-down.sh
#!/bin/bash

source .env

# https-portal
docker-compose -f letsencrypt/docker-compose.yml down

# gitlab
docker-compose -f gitlab/docker-compose.yml down

# redmine
docker-compose -f redmine/docker-compose.yml down

# remove local network
docker network rm local-link
```

```sh:.env
# Redmine settings
REDMINE_VIRTUAL_HOST=Redmine用のサブドメイン
REDMINE_DB_USER=user
REDMINE_DB_PASS=password

# GitLab settings
GITLAB_VIRTUAL_HOST=GitLab用のサブドメイン
GITLAB_DB_USER=user
GITLAB_DB_PASS=password
GITLAB_HOST=GitLab用のサブドメイン
GITLAB_EMAIL=hogehoge@example.com
GITLAB_EMAIL_REPLY_TO=hogehoge@example.com
GITLAB_INCOMING_EMAIL_ADDRESS=hogehoge@example.com

# Common settings
SMTP_USER=hogehoge@example.com
SMTP_PASS=password
IMAP_USER=hogehoge@example.com
IMAP_PASS=password
```

## 起動・停止
起動コマンド

```sh
$ ./start-up.sh
```

https://Redmine用のサブドメイン と https://GitLab用のサブドメイン でアクセスできれば成功！

停止コマンド

```sh
$ ./shut-down.sh
```

## 変数の外だしについて
始めは正攻法？に「[env_file](http://docs.docker.jp/compose/compose-file.html#env-file)」で進めていたが、「[変数の置き換え](http://docs.docker.jp/compose/compose-file.html#compose-file-variable-substitution)」なるものを発見！こちらを採用。
「source .env」も起動スクリプトに書いておく方式としてみた。

## local-link
自分が知らないだけの可能性が高いが、docker-composeファイルが分かれていると各コンテナは同一ネットワークではないらしく、各コンテナ間でのサービス名でのアクセスができなかった。
折角なのでRedmineとGitLabは連携したいので、「docker network create」コマンドでネットワーク作成 -> 同一ネットワークへぶら下げる事で対応する事とした。

```sh:redmineコンテナからgitlabコンテナへの疎通確認
$ docker exec -it redmine bash
root@***:/home/redmine/redmine# ping gitlab -c 1
PING gitlab (172.18.0.3) 56(84) bytes of data.
64 bytes from gitlab.local-link (172.18.0.3): icmp_seq=1 ttl=64 time=0.241 ms
```

上記環境下でのRedmineとGitLabの連携については、時間が取れ次第書く予定。