プロジェクト管理 on Redmine on Dockerで運用含めて考えてみる~環境構築編~

f:id:yassan0627:20171202151039p:plain

Redmine Advent Calendar 2017 の 11日目です!

redmine.tokyo という、Redmine勉強会でコアスタッフをしている やっさん🍶(@yassan168) です。

今回は、RedmineをDocker使って環境を構築し、運用面まで考えてみます。 、、、のつもりでしたが、ボリュームがでかいので次回12/25に運用編は分けます。
(´-`).。oO(2段階認証のGmailアカウントからのメール送信を解決するのに時間がかかった上に成果が無いという悲惨な話。。)

前提条件

  • 実行環境は、Ubuntu 16.04 LTS(私のノートがUbuntuなので)
  • RDBは、PostgreSQLがすでに用意してある
  • パブリックIPは、192.168.11.6
  • サイトドメインredmine.yassan.local とするため、hostsに設定追加
192.168.11.6 redmine.yassan.local
  • 実行ユーザは、 redmine を新規に作成(PW指定無し。 sudo su - redmine で切り替え)
  • SELinuxはdisable

要件

  • Redmineの構築コストが低い
  • プラグインや添付ファイル、テーマはコンテナに含めない
  • Redmineプラグインが自由に追加可能
  • 添付ファイル、テーマなどのバックアップが可能
  • URLに「/redmine」を入れること
  • HTTPSである事

Dockerfileはどうするのか?

Dockerでredmineを動かすにも、一からDockerfileを書いてもいいのですが、車輪の再発明の匂いがするのでDocker Hubで検索すると480リポジトリもありました。 f:id:yassan0627:20171203112104p:plain

Docker公式の library/redmine - Docker Hub もありますが、こちらは割とプレーンな状態で、一から運用面などを考慮する必要があります。独自にどうこうしたい人はこちらを使って、docker-compose使ってイイ感じしたら良いかと思います。

今回は、 その中でも sameersbn/redmine を使います。

Redmine.tokyo の事前アンケート でも利用している人が多い bitnami のイメージ bitnami/redmine - Docker Hub もあります。

こちらは、コンポーネントをALL bitnamiなので、bitnamiユーザならこちらでも良いのかも。

また、今回使用するDockerイメージの作者 sameersbn (Sameer Naik) さんは、bitnamiの中の人ですね。

dockerの用意

その辺はお手本が山程あると思いますのでおぐぐりください。 私は諸般の事情で Hosts in Rancher にある Install Scriptで docker-ce 17.06をインストール後、うっかりアップグレードしないようVer.固定してます。

また、rootじゃなくてもdockerを実行出来るようにしています cf. Post-installation steps for Linux

$ curl https://releases.rancher.com/install-docker/17.06.sh | sh
$ apt-mark hold docker-ce
$ sudo groupadd docker
$ sudo usermod -aG docker redmine

docker-composeの用意

Install Docker Compose | Docker Documentation を参考にしてインストールください。

Ver.確認

$ docker --version
Docker version 17.06.2-ce, build cec0b72
$ docker-compose --version
docker-compose version 1.17.0, build ac53b73

添付ファイルやバックアップ、証明書の置き場の作成

docker起動時に参照するディレクトリを作成

$ sudo mkdir /srv/docker/redmine/redmine
$ cd /srv/docker/redmine/redmine
$ sudo mkdir backups files plugins themes tmp certs
$ sudo chown -R redmine:redmine /srv/docker/

(新規向け)redmine用のデータベースとユーザを作成

sameersbn/redmine 自体は、MySQLでもいけるけど、RedminePostgreSQL推奨なので、PostgreSQLを使います。

cf. Defect #19344: MySQL 5.6: IssueNestedSetConcurrencyTest#test_concurrency : always fails - Redmine
cf. Feature #17460: MySQL 5.7 support - Redmine

$ sudo -u postgres createuser -P redmine
※パスワードは pass0000
$ sudo -u postgres createdb -E UTF-8 -l ja_JP.UTF-8 -O redmine -T template0 redmine_dev

接続確認

$ psql -h 192.168.11.6 -U redmine redmine_dev -W
Password for user redmine: 
psql (10.1)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

redmine_dev=> \q

SSLの用意

お手軽にオレオレ証明で作成。

$ sudo su - redmine
redmine$ mkdir ~/ssl
redmine$ cd ~/ssl
redmine$ openssl genrsa -out redmine.key 2048
redmine$ openssl req -new -key redmine.key -out redmine.csr
  :
Common Name (e.g. server FQDN or YOUR name) []:redmine.yassan.local
  :
redmine$ openssl x509 -req -days 3650 -in redmine.csr -signkey redmine.key -out redmine.crt
redmine$ openssl dhparam -out dhparam.pem 2048

docker側で利用できるよう作成したファイルを証明書置き場へコピー

redmine$ cd /srv/docker/redmine/redmine/certs
redmine$ cp ~/ssl/redmine.key .
redmine$ cp ~/ssl/redmine.crt .
redmine$ cp ~/ssl/dhparam.pem .
redmine$ chmod 400 redmine.key

redmine on dockerの環境構築

sameersbn/docker-redmine: Docker Image for Redmine に必要なことはすべて書いてあります。

redmineのVer.は、 sameersbn/redminetag にあるものを指定します。 今回は、 3.4.2を使います。

また、リバプロには、 sameersbn/docker-nginxをつかい、1ユーザだけなのに、無駄に、memcachedとして、 sameersbn/docker-memcached を使います。

また、DBユーザとかパスワードなど、あまり公開したくないファイルは、 docker-compose.yml と同じ階層に、 .env を作成してそこに環境変数として書き込んで、yml側で指定します。
cf. Compose ファイル・リファレンス — Docker-docs-ja 17.06.Beta ドキュメント

redmine$ mkdir docker
redmine$ cd docker
redmine$ vim .env
redmine$ vim docker-compose.yml

編集したファイルは以下

SMTP_USER=アカウント@gmail.com
SMTP_PASS=パスワード
DB_HOST=192.168.11.6
DB_PORT=5432
DB_USER=redmine
DB_PASS=pass0000
DB_NAME=redmine_dev
※以下は必要な人だけ
HTTP_PROXY=http://IPアドレス:ポート
HTTPS_PROXY=http://IPアドレス:ポート
NO_PROXY=127.0.0.1,localhost,自分のパブリックIP,通信が必要なローカルホスト(Gitサーバとかあれば)
version: '2'                                                                         
 
services:
  redmine:
    image: 'sameersbn/redmine:3.4.2'
    depends_on:
    - memcached
    environment:
    - TZ=Asia/Tokyo

     ※必要な人は追加
    - HTTP_PROXY: ${HTTP_PROXY}
    - HTTPS_PROXY: ${HTTPS_PROXY}
    - NO_PROXY: ${NO_PROXY}
 
    - DB_ADAPTER=postgresql
    - DB_ENCODING=utf8  
    - DB_HOST=${DB_HOST}
    - DB_PORT=${DB_PORT}
    - DB_USER=${DB_USER}
    - DB_PASS=${DB_PASS}
    - DB_NAME=${DB_NAME}
 
    - REDMINE_PORT=10445
    - REDMINE_HTTPS=true
    - REDMINE_RELATIVE_URL_ROOT=/redmine
    - REDMINE_SECRET_TOKEN=${REDMINE_SECRET_TOKEN}
 
    - REDMINE_SUDO_MODE_ENABLED=false
    - REDMINE_SUDO_MODE_TIMEOUT=15
    
    - REDMINE_CONCURRENT_UPLOADS=2
    
    - REDMINE_BACKUP_SCHEDULE=weekly
    - REDMINE_BACKUP_EXPIRY=
    - REDMINE_BACKUP_TIME=04:00
    
    - SMTP_USER=${SMTP_USER}
    - SMTP_PASS=${SMTP_PASS}

    - MEMCACHE_HOST=memcached
    - MEMCACHE_PORT=11211
    ports:
    - "10083:80"
    - "10445:443"
    volumes:
    - /srv/docker/redmine/redmine:/home/redmine/data
    
  memcached:
    image: 'sameersbn/memcached:latest'
    ports:
    - '11211:11211'
    restart: always    

注意: Gmailアカウントを指定する場合、2段階認証済みのアカウントの場合、なぜかうまく行きません。
https://myaccount.google.com/security から「アプリパスワード」選んで生成したものを使ってみたけど、使い方が悪いのかメールが飛びません。。。知ってる人いたら教えてください。

起動

redmine$ docker-compose up

https://redmine.yassan.local:10445/redmine でブラウザで開くと起動が確認出来ます。 f:id:yassan0627:20171204002501p:plain admin/adminでは入れます。

プラグインのインストール

ローカル内にプラグイン用のディレクトリ作成

$ sudo su - redmine
redmine$ mkdir -p /srv/docker/redmine/redmine/plugins

あとは、そこにいつものようにプラグインを配置するだけ。 例として、みんな大好き Redmine Drafts Plugin を例に挙げて見ましょう。

redmine$ cd /srv/docker/redmine/redmine/plugins
redmine$ git clone https://github.com/jbbarth/redmine_drafts.git
redmine$ git ls-remote --tag
From https://github.com/jbbarth/redmine_drafts.git
ff78367305399c26477a2522d080e2ca39e5bb5b    refs/tags/v0.1.0
338032656bd94d3bca57b9f7715860ebc3ed92f6    refs/tags/v0.1.0^{}
f40a06d2d891e6f165f6bfdffcbcfded7b7d5420    refs/tags/v0.1.1
30aaaf6dd1b30d97f3e9ac2717629ea9b719e78c    refs/tags/v0.2.0   ※最新はこれ
redmine$ git checkout v0.2.0

また、Dockerイメージ作者がいくつか自動で配置するようにしているようです。参考になると思います。
cf. Redmine Plugins Installation

後は、起動して完了。

テーマのインストール

プラグインと同様です。

ローカル内にテーマ用のディレクトリ作成

$ sudo su - redmine
redmine$ mkdir -p /srv/docker/redmine/redmine/themes

後は、作成したディレクトリ以下に、プラグインの時と同様にテーマを配置して、 docker-compose up し直すだけです。

まとめ

以上が、環境構築編でした。 次回は、バックアップや本体、プラグイン、テーマのアップデートや、プラグイン、テーマのアンインストールなど、日常で遭遇しそうな話メインで書いていきます。

明日は、 forenoonM さんです。お楽しみに。


FAQ

昨日動いてた(違う場所で動かした)ら、動かなくなった

パブリックIPが変わってませんか?ご確認を。

redmineの内部が見たい場合

以下のコマンドから名前を検索

redmine$ docker-compose ps
       Name                     Command               State                       Ports                    
-----------------------------------------------------------------------------------------------------------
docker_memcached_1   /sbin/entrypoint.sh /usr/b ...   Up      0.0.0.0:11211->11211/tcp, 11211/udp          
docker_redmine_1     /sbin/entrypoint.sh app:start    Up      0.0.0.0:10445->443/tcp, 0.0.0.0:10083->80/tcp

docker_redmine_1 と分かったので、以下のコマンドで内部に入ります。

redmine$ docker exec -it docker_redmine_1 bash
root@9e96d3bbbbcc:/home/redmine/redmine# ls
CONTRIBUTING.md  Gemfile  Gemfile.lock  README.rdoc  Rakefile  app  appveyor.yml  bin  config  config.ru  db  doc  extra  files  lib  log  plugins  public  script  test  tmp  vendor

あとは、いつも通りです。

初回起動で500エラーの場合

DB作成失敗している可能性があります(私は試行錯誤しながらやってて、DB作成失敗してました)。 redmine内部に入って以下を実行して作成しました(最初と最後のコマンドはおまけ)。

root@9e96d3bbbbcc:/home/redmine/redmine#bundle exec rake generate_secret_token
root@9e96d3bbbbcc:/home/redmine/redmine#RAILS_ENV=production bundle exec rake db:migrate
root@9e96d3bbbbcc:/home/redmine/redmine#RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data

cf. Redmine 3.4をCentOS 7.3にインストールする手順 | Redmine.JP Blog の「Redmineの初期設定と初期データ登録」