Gitlab-CEとRedmineを連携してdockerコンテナで運用する(DBを1コンテナにまとめてHTTPS付き)

# TL;DR

* Gitlab-ceとRedmineを連携してコンテナ運用する仕組みを紹介します
    * [gitlab-ceをConoha-VM(上のdockerコンテナ)で運用する(HTTPS付き)](https://qiita.com/myoshimi/items/efce33c28cb3e2fcf81a)の続編です
    * Gistsに[docker-compose.yml](https://gist.github.com/myoshimi/88ba5b2b9a57ef73912e3872ff978452)を掲載しています
    * この記事から読み始めることもできます

# つくるもの

* docker-composeで，Gitlab-CE(Omnibus Package)，Redmine，リバースプロキシを稼働させます
    * 反応速度向上のために，GitlabにRedis，Redmineにmemcachedを接続します．
    * 上記2つはdocker-compose.ymlにコンテナとして稼働させます
    * GitlabとRedmineで，1つのDBコンテナ(MySQL)にまとめます
        * 1つのMySQLコンテナのデータベースの分けて使用することで，2つのサービスを共用します

# 準備

* [gitlab-ceをConoha-VM(上のdockerコンテナ)で運用する(HTTPS付き)](https://qiita.com/myoshimi/items/efce33c28cb3e2fcf81a)を参考に，以下の作業を実施します
    * docker-comopseを含むDockerの実行環境
    * LetsEncryptoでのSSLワイルドカード証明書(fullchain.pem, privkey.pem)の取得方法は上記記事をご覧ください
    * redmine用のサブドメインと，gitlab用のサブドメインから，当該VMのグローバルIPが引けるように，DNSへの名前登録をします

# docker-compose.ymlの構成

* [sameersbn](https://hub.docker.com/r/sameersbn)氏が提供しているDockerイメージを組み合わせて作ります
    * 組み合わせるイメージは，[gitlab](https://hub.docker.com/r/sameersbn/gitlab)，[redmine](https://hub.docker.com/r/sameersbn/redmine)，[mysql](https://hub.docker.com/r/sameersbn/mysql)，[redis](https://hub.docker.com/r/sameersbn/redis)，[memcached](https://hub.docker.com/r/sameersbn/memcached)です
* リクエストURIで処理を振り分けるリバースプロキシを[nginx公式イメージ](https://hub.docker.com/_/nginx)で作ります
    * SSLなどのを含めた設定ファイルは別途nginx.confを作ってマウントします

# docker-compose.ymlの内容

* コンテナの立ち上げ方法を紹介します
* 基本的にはDockerHubで配布されているDockerイメージの組み合わせですが，1つのdocker-compose.ymlにまとめる上で適用した修正事項を説明します
* Gistsに[docker-compose.yml](https://gist.github.com/myoshimi/88ba5b2b9a57ef73912e3872ff978452)を掲載していますので，```git clone```して必要な部分を修正してください

## dockerコンテナの立ち上げ

* project001-docker-compose.ymlと同じディレクトリに，リバースプロキシ設定(nginx.conf)，証明書ファイル(fullchain.pem,privkey.pem)を置いてください
    * リバースプロキシされてリクエストが転送されるホストは，```gitlab:80, redmine:80```です
    * [gitlab-ceをConoha-VM(上のdockerコンテナ)で運用する(HTTPS付き)]に参考にできるnginx.confを掲載しています
* ```/srv/docker/```に不揮発ボリュームが格納されます

```bash
git clone https://gist.github.com/88ba5b2b9a57ef73912e3872ff978452.git project
cd project
cp <path>/{nginx.conf,fullchain.pem,privkey.pem} .
docker-compose -f project001-docker-compose.yml
```

## RedmineのDBをMySQLに変更

* Redmineが使用するデータベース(DockerhubデフォルトではPostgreSQL)を，MySQLに変更します
    * 環境変数DB_ADAPTERに，```mysql2```を指定すると，MySQLを使用するようになります
    * MySQLコンテナの名前を```mysql```にすることにして，```depends_on```ディレクティブでリンクします
    * データベース名を```redmine_production```にしておきます

```dockerfile
  redmine:
    image: sameersbn/redmine:4.0.3-1
    restart: always
    depends_on:
      - memcached-redmine
      - mysql
...<snip>...
    environment:
      - TZ=Asia/Tokyo
      - DB_ADAPTER=mysql2
      - DB_HOST=mysql
      - DB_USER=dbuser
      - DB_PASS=dbpass
      - DB_NAME=redmine_production
```

## GitlabのDBをMySQLに変更

* 前節のRedmineと同様に，GitlabのDBもPostgreSQLからMySQLに変更します．
    * 環境変数はRedmineと同じものを設定します
    * データベース名を```gitlabhq_production```にしておきます

```dockerfile
  gitlab:
    restart: always
    image: sameersbn/gitlab:11.10.4
    depends_on:
      - redis-gitlab
      - mysql
.....<snip>.....
    environment:
      - DEBUG=false
      - DB_ADAPTER=mysql2
      - DB_HOST=mysql
      - DB_PORT=3306
      - DB_USER=dbuser
      - DB_PASS=dbpass
      - DB_NAME=gitlabhq_production
```

## サービスが接続するMySQLコンテナの作成

* 前節までで設定を記述したMySQLのコンテナを作成します
    * **ポイント** ：2つのコンテナからデータベースを分けて使用されるので，2つのデータベースを作る必要があります．そのため，```DB_NAME```を2つ，カンマ区切りで記述します

```dockerfile
  mysql:
    restart: always
    image: sameersbn/mysql:5.7.24
    environment:
      - DB_USER=dbuser
      - DB_PASS=dbpass
      - DB_NAME=redmine_production,gitlabhq_production
    volumes:
      - /srv/docker/mysql:/var/lib/mysql:Z
```

# 動作確認

* ```docker-compose up -d```でコンテナを立ち上げます
* ```docker ps -a```でコンテナ情報を見ると，以下のように6個のコンテナが立ち上がります

```bash
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                                    NAMES
XXXXXXXXXXX0        sameersbn/redmine:4.0.3-1     "/sbin/entrypoint.sh…"   3 seconds ago       Up 2 seconds        80/tcp, 443/tcp                          project_redmine_1
XXXXXXXXXXX1        sameersbn/gitlab:11.10.4      "/sbin/entrypoint.sh…"   4 seconds ago       Up 2 seconds        80/tcp, 443/tcp, 0.0.0.0:10022->22/tcp   project_gitlab_1
XXXXXXXXXXX2        sameersbn/redis:4.0.9-1       "/sbin/entrypoint.sh…"   5 seconds ago       Up 3 seconds        6379/tcp                                 project_redis-gitlab_1
XXXXXXXXXXX3        sameersbn/memcached:1.5.6-1   "/sbin/entrypoint.sh…"   5 seconds ago       Up 3 seconds        11211/tcp, 11211/udp                     project_memcached-redmine_1
XXXXXXXXXXX4        nginx:1.15.8                  "nginx -g 'daemon of…"   5 seconds ago       Up 2 seconds        80/tcp, 0.0.0.0:443->443/tcp             project_rev_1
XXXXXXXXXXX5        sameersbn/mysql:5.7.24        "/sbin/entrypoint.sh…"   5 seconds ago       Up 3 seconds        3306/tcp                                 project_mysql_1
```

* リバースプロキシに設定したURLにアクセスして，gitlab, redmineに接続できれば完成です
* メモリを比較的食うので，注意してください(メモリ4GBだと足りなくなると思われます)
    * gitlabが2GBくらい
    * redmineとmysqlがそれぞれ200MBくらい

# 参考

* [gitlab-ceをConoha-VM(上のdockerコンテナ)で運用する(HTTPS付き)](https://qiita.com/myoshimi/items/efce33c28cb3e2fcf81a)
* [DockerHub sameersbn/gitlab](https://hub.docker.com/r/sameersbn/gitlab)
* [DockerHub sameersbn/redmine](https://hub.docker.com/r/sameersbn/redmine)
* [DockerHub sameersbn/mysql](https://hub.docker.com/r/sameersbn/mysql)
* [DockerHub sameersbn/redis](https://hub.docker.com/r/sameersbn/redis)
* [DockerHub sameersbn/memcached](https://hub.docker.com/r/sameersbn/memcached)
* [DockerHub nginx](https://hub.docker.com/_/nginx)