Redmine
GitLab
docker
letsencrypt

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

はじめに

以下サイト様などを参考にさせていただきました。
docker で全自動 Let's encrypt

目的

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

環境

  • Ubuntu 16.04 on さくらVPS

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

事前準備

docker/docker-composeのインストール

公式サイトなどを参考にインストールする。
ユーザ権限でのdocker実行・コマンド補完等も設定しておくと便利。

ドメイン取得

以前はフリーのサブドメイン取得サービス使用していたがだがしかし、サブドメインだとLet's Encryptの週5回制限に引っかかるため、お名前.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

ファイル構成

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

ファイルの中身

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

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

起動・停止

起動コマンド

$ ./start-up.sh

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

停止コマンド

$ ./shut-down.sh

変数の外だしについて

始めは正攻法?に「env_file」で進めていたが、「変数の置き換え」なるものを発見!こちらを採用。
「source .env」も起動スクリプトに書いておく方式としてみた。

local-link

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

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の連携については、時間が取れ次第書く予定。