docker-composeで「https-portal + Redmine + postgreSQL」を立ち上げる

ノウハウ
スポンサーリンク

Redmineを使ってAI管理、スケジュール管理をしたいと思い、DockerでRedmineを立ち上げることにしました。
構築手順を備忘録として残しておきます。

環境は以下です。

  • ConoHa VPS (メモリ 1GB/CPU 2Core/SSD 100GB)
  • Ubuntu 20.04.1 LTS
  • Docker: 19.03.13
  • Docker Compose: 1.27.4
  • redmine: latest (2020/9/27 執筆時点では、4.1.1が最新)
  • postgres: latest (2020/9/27 執筆時点では、13.0が最新)

 

目次

 


 

はじめに

DockerでRedmineを立ち上げるために事前調査をした結果、以下のような構築方針で作成することにしました。

【構築方針】

  • RedmineのDockerコンテナはredmine(公式)[1]を使うことにする。
  • Redmineのバージョンは4.1系を使うことにする。
  • データベースはPostgreSQLを使い、dockerコンテナはpostgres(公式)[4]を使うことにする。
  • 構築環境は「ConoHa VPS + Ubuntu」とする。
  • SSL対応はSteveLTN/https-portal[2]コンテナを使う。
  • 大人数で使うわけではないので、Memcachedは対応しない。
  • Gメール設定で通知できるようにする。

なお、事前調査は「DockerでRedmineを立ち上げるための事前調査」でまとめているので、よろしければご覧ください。[3]

 

ConoHa VPSでサーバ構築する

本記事では、ConoHa VPS上に「Ubuntu 18.04.4 LTS」を立ち上げ、その上にDocker、Docker Composeを構築しています。Linux環境であれば、本記事の手順は有効だと思いますので、ご自分のLinux環境がある場合は、この章は飛ばしていただいて結構です。

 

ConoHa VPSは初期費用不要で月に数百円で利用できる仮想サーバのサービスです。
以下の記事でConoHa VPSにUbuntuを構築する方法をまとめたので、よろしければご覧ください。[5]

 

SSH接続するので、ドメインがあると良いです。
ConoHa VPSにドメインを設定する方法もまとめたので、よろしければご覧ください。[6]

 

 

「Docker + Docker Compose」環境を構築する

「DockerとDocker Compose」をインストールします。
以下の記事で、インストール方法をまとめたので、よろしければご覧ください。[7]

 

 

「https-portal + Redmine + postgreSQL」環境を構築する

構築の流れとしては以下です。

  • ネットワーク構成を考える
  • フォルダ構成を考える
  • webサーバ(https-portal)のdocker-compose.ymlを作成する
  • appサーバ(Redmine + postgreSQL)のdocker-compose.ymlを作成する
  • 環境ファイルを作成する
  • メール設定用のconfiguration.ymlを作成する
  • DNSサーバでRedmineとpostgreSQLのホスト名を設定する
  • appサーバ⇒webサーバという順番でコンテナを起動する

 

 

ネットワーク構成を考える

ネットワーク構成は以下の図のようにしました。

  • コンテナとしては、https-portalコンテナ、redmineコンテナ、postgresコンテナを作成
  • https-portalコンテナはWebアクセスのために、ホスト側と80番(http)、443番ポート(https)を共有
  • web_netというコンテナネットワークを作成し、各コンテナ間を接続
  • web/docker-compose.ymlでhttps-portalコンテナを生成、app/docekr-copose.ymlでredmineコンテナとpostgresコンテナを生成
  • https-portalコンテナはホスト側のnginx/ssl_certsディレクトリを共有
  • redmineコンテナはホスト側のredmine/plugins, redmine/themes, redmine/configディレクトリを共有
  • postgresコンテナはホスト側のdb/initdb, db/dbdataディレクトリを共有

 

 

フォルダの構成を考える

以下のような構成としました。
事前にmkdirコマンドでディレクトリを作成してください。

myenv
|-- app
|   |-- db
|   |   |-- dbdata
|   |   `-- initdb
|   |-- docker-compose.yml
|   `-- redmine
│       ├── config
│       │   └── configuration.yml
|       |-- plugins
|       `-- themes
`-- web
    |-- docker-compose.yml
    `-- nginx
        `-- ssl_certs

 

 

webサーバ(https-portal)のdocker-compose.ymlを作成する

webサーバとして、https-portalコンテナを立ち上げるdocker-compose.ymlを作成します。

 

【myenv/web/docker-compose.yml】

version: '3.7'
services:
  web:
    image: steveltn/https-portal:1
    container_name: web
    restart: always
    volumes:
      - ./nginx/ssl_certs:/var/lib/https-portal
    networks:
      web_net:
        ipv4_address: ${HTTPS_PORTAL_NET_IP4_ADDR}
    ports:
      - '80:80'
      - '443:443'
    env_file:
      - .env
    environment:
      DOMAINS: >-
        ${HOSTNAME_REDMINE}.${SITE_DOMAIN} -> http://redmine:${REDMINE_DOCKER_PORT}/,
      STAGE: 'staging'
networks:
  web_net:
    external: true
  • services.web.environment.STAGEstagingとしています。すべての構築が完了し、問題ないことが確認できたら、productionに変更します。

 

 

appサーバ(Redmine + postgreSQL)のdocker-compose.ymlを作成する

appサーバとして、redmineコンテナとpostgresコンテナを立ち上げるdocker-compose.ymlを作成します。

 

【myenv/app/docker-compose.yml】

version: '3.8'
services:
  redmine:
    image: redmine:latest
    container_name: ${APP_CONTAINER_NAME}
    restart: always
    volumes:
      - ./redmine/plugins:/usr/src/redmine/plugins
      - ./redmine/themes:/usr/src/redmine/public/themes
      - ./redmine/config/configuration.yml:/usr/src/redmine/config/configuration.yml
    networks:
      web_net:
        ipv4_address: ${APP_IP4_ADDR}
    expose:
      - ${APP_DOCKER_PORT}
    env_file:
      - .env
    environment:
      - REDMINE_DB_POSTGRES=reddb
      - REDMINE_DB_DATABASE=${DB_NAME}
      - REDMINE_DB_USERNAME=${DB_USER}
      - REDMINE_DB_PASSWORD=${DB_PASSWORD}
      - TZ=${DB_TZ}
    depends_on:
      - reddb
  reddb:
    image: postgres:latest
    container_name: ${DB_CONTAINER_NAME}
    restart: always
    volumes:
      - ./db/initdb:/docker-entrypoint-initdb.d
      - ./db/dbdata:/var/lib/postgresql/data
    networks:
      web_net:
        ipv4_address: ${DB_IP4_ADDR}
    expose:
      - ${DB_DOCKER_PORT}
    env_file:
      - .env
    environment:
      - POSTGRES_DB=${DB_NAME}
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - TZ=${DB_TZ}
    command: --port=${DB_DOCKER_PORT}
networks:
  web_net:
    name: web_net
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: ${NET_SUBNET}

 

 

環境ファイルを作成する

秘密情報や環境依存性があるものは、環境ファイルで設定します。

docker-composeは同じディレクトリに.envというファイルを生成すると勝手に読み取ってくれるので、web用とapp用の2つの.envを作成することにします。

 

【myenv/web/.env】

HTTPS_PORTAL_NET_IP4_ADDR=192.168.1.200
SITE_DOMAIN=[環境に合わせる]
HOSTNAME_REDMINE=redmine
HOSTNAME_REDMINE_DB=db_redmine
REDMINE_DOCKER_PORT=3000
REDDB_DOCKER_PORT=5432
  • SITE_DOMAINはご自分のサイトのドメイン名を設定してください。

  

【myenv/app/.env】

APP_CONTAINER_NAME=redmine
APP_IP4_ADDR=192.168.1.11
APP_DOCKER_PORT=3000
DB_CONTAINER_NAME=db_redmine
DB_IP4_ADDR=192.168.1.12
DB_DOCKER_PORT=5432
DB_USER=[環境に合わせる]
DB_PASSWORD=[環境に合わせる]
DB_NAME=REDMINE_DB
DB_TZ=sia/Tokyo
NET_SUBNET=192.168.1.0/24
  • DB_USER、DB_PASSWORDはご自分の環境に合わせてください。

  

 

メール設定用のconfiguration.ymlを作成する

メールの設定はredmineコンテナの「 config/configuration.yml」で設定します。「 config/configuration.yml」はホスト側の「myenv/app/redmine/config/configuration.yml」と共有しているので、そちらの設定を行います。

Gmailのアカウント当てにメールを送信するには、以下のように設定します。[10],[11],[12]

 

【myenv/app/redmine/config/configuration.yml】[10],[11],[12]

production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      enable_starttls_auto: true
      address: "smtp.gmail.com"
      port: 587
      domain: "smtp.gmail.com"
      authentication: :plain
      user_name: "xxxx@gmail.com"
      password: "xxxpassword"
  • user_nameにGmailメールアドレス、passwordにGmailのパスワードを設定します。
  • passwordは後でGメールのアプリパスワードを設定しますので、ここでは適当な値で問題ないです。

 

 

DNSサーバでRedmineとpostgreSQLのホスト名を設定する

以下は、ConoHa VPSの例ですが、DNSサーバにRedmineとpostgreSQLのホスト名を設定します。
これにより、「ホスト名:サイトのドメイン」へのアクセスはサイトのIPアドレスにアクセスしに行きます。https-portalコンテナは、ホストと80、443ポートを共有しているため、サイトのIPアドレスへの通信はhttps-portalコンテナに到達します。
https-portalはNGINXを内蔵しており、アクセスされたホスト名から、適切なコンテナに中継をします。今回の設定では、https-portalのdocker-compose.ymlで設定した通り、「redmine.サイトのドメイン」はredeminコンテナへ中継されます。

 

 

appサーバ⇒webサーバという順番でコンテナを起動する

appサーバのコンテナを起動させる

~/myenv/appディレクトリに移動して、以下のコマンドを実行することで、appサーバのコンテナを起動させます。

$ cd ~/myenv/app
$ docker-compose up

以下のように表示されたらOKです。

redmine    | [2020-09-29 23:20:41] INFO  WEBrick 1.4.2
redmine    | [2020-09-29 23:20:41] INFO  ruby 2.6.6 (2020-03-31) [x86_64-linux]
redmine    | [2020-09-29 23:20:41] INFO  WEBrick::HTTPServer#start: pid=1 port=3000

※もしここで、「FATAL: database "DBコンテナ名" does not exist」というエラーが出てredmineコンテナの起動が失敗していた場合は、以下の方法を試してみてください。
> posgresコンテナ初回起動時に「FATAL: database "DBコンテナ名" does not exist」が出たときの対処法

 

これで、redmineコンテナが問題なく起動することを確認出来きました。
ただし、このままでは、appサーバのコンテナの出力がターミナルソフトとなっており、ターミナルソフトが操作できなくなってしまうので、appサーバのコンテナをバックグランドで起動させることにします。

一度「Ctrl+c」でappサーバのコンテナを停止させます。
そして、再度以下のコマンドを実行します。

$ cd ~/myenv/app
$ docker-compose up -d
  • docker-compose upコマンドに-dオプションをつけることで、バックグラウンドでコンテナを起動させることができます。

 

webサーバのコンテナを起動させる

appサーバの起動方法と同じです。
~/myenv/webディレクトリに移動して、以下のコマンドを実行することで、webサーバのコンテナを起動させます。

$ cd ~/myenv/web
$ docker-compose up

以下のように表示されたらOKです。

web    | [services.d] starting services
web    | [services.d] done.

 

appサーバのときと同様に、Ctrl+cでwebサーバのコンテナを停止させて、docker-compose up -dコマンドでwebサーバのコンテナをバックグラウンドで起動させます。

 

Redmineサーバにアクセスする

「https://redmine.サイトのドメイン」にブラウザからアクセスします。
アクセス成功すると、以下のようなRedmineのホーム画面が表示されるはずです。

 

注意:プライバシーエラーについて

「myenv/web/docker-compose.yml」の「services.web.environment.STAGE」がstagingのため、証明書がオレオレ証明書になっており、プライバシーエラーが出ます。

Redmineにアクセスすることができたら、「myenv/web/docker-compose.yml」の「services.web.environment.STAGE」をproductionに変更しておきましょう。
productionに変更することで、プライバシーエラーが出なくなります。

 

Redmineの設定

Redmineの設定として、以下を実施しました。

  • 初期設定
  • メールの設定

 

初期設定

Redmineの初期設定は公式ページを参考にするとよいです。[9]

Redmineを使い始めるための初期設定

 

Gメールの設定

Gメールを使うには、2段階認証を有効にして、そのうえでRedmine向けにアプリパスワードを発行する必要があります。
詳しいやり方は、「Redmineの通知メールをGoogleのSMTPサーバーから発信する方法 | A1 Style」が分かりやすかったです。[12]

 

Redmine用のアプリパスワードを入手できたら、そのパスワードをconfig/configuration.ymlpasswordに設定し、redmineコンテナを再起動させます。

【config/configuration.yml】

production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      enable_starttls_auto: true
      address: "smtp.gmail.com"
      port: 587
      domain: "smtp.gmail.com"
      authentication: :plain
      user_name: "xxxx@gmail.com"
      password: "xxxpassword"
  • passwordは取得したGメールのアプリパスワードを設定します。

 

 

メールが設定できたかの確認は、「管理」→「設定」画面で「メール通知」タブを開き、画面左下の「テストメールを送信」で可能です。[10],[11],[12]

 

 

まとめ

RedmineをDockerコンテナで構築することができました。
この備忘録が皆様の参考になれば幸いです。

 

ConoHa上でDockerを導入したり、Webアプリを立ち上げたりした内容を以下の記事でまとめました。こちらもよろしければご覧になってください。

 

 

参考

[1] redmine(公式) | docker hub
[2] SteveLTN/https-portal | docker hub
[3] DockerでRedmineを立ち上げるための事前調査 | Create it Myself
[4] postgres(公式) | docker hub
[5] ConoHa VPSでサーバ構築する | Create it Myself
[6] ConoHa VPSにドメイン設定する | Create it Myself
[7] ConoHa VPS上にDocker環境を構築する | Create it Myself
[8] 公式Redmine+postgeSQL環境をdocker-composeで構築 | Qiita
[9] Redmineを使い始めるための初期設定 | Redmine.JP
[10] メール通知のためのconfiguration.ymlの設定 | Redmine.JP
[11] 【Redmine】メール通知を Gmail から送信する設定とテストメール送信方法 | ぴぐろぐ
[12] Redmineの通知メールをGoogleのSMTPサーバーから発信する方法 | A1 Style

 

 

広告

Dockerをやるなら以下の書籍がオススメです。
Dockerとは何か?から複数のコンテナを管理することができるDocker Compose、Kubernetesまでまとめられています。

 


 

ConoHa VPS は初期費用不要で月に数百円で利用できる仮想サーバのサービスです。
以下のような方には非常にオススメのサービスとなっています!

  • 勉強がてらLinuxの環境をちょっと触ってみたい
    管理者権限が実行可能なLinuxサーバ環境が構築可能です!
  • スモールスタートでサービスを提供して、うまくいったら規模をスケールアップしたい
    後からメモリサイズやCPU数などのスケールアップ/スケールダウン可能です!
  • AWSやGCPなどのクラウドサービスは高いので、もっと安くサーバ構築したい
    初期費用なし、月数百円(1時間単位も可)で利用可能です!

 

以上!

コメント

タイトルとURLをコピーしました