ようへいの日々精進XP

よかろうもん

Dockernize な Redmine を使いはじめるまでのメモ+RedminePM を使ってみた

tl;dl

ふと思い立ってチケットに todo やメモ書き、予定を登録して管理出来ないものかと考えて Redmine を試してみた。


目標

  • Redmine をサクッと構築する(Redmine を構築することが目的にならないように)
  • データベースは MySQL
  • 自己証明書で HTTPS 運用
  • iPhone アプリ RedminePMでの利用も想定して設定する(アプリをインストールする)
  • 出来れば Docker コンテナで構築しておいて引っ越ししやすいようにしておく

参考

www.redmine.org


Redmine memo

検証の環境

  • 構成図

f:id:inokara:20150821000648p:plain

$ cat /etc/debian_version 
8.1
  • Docker
# 構築当初
$ docker version
Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.3.3
Git commit (client): 7c8fca2
OS/Arch (client): linux/amd64
Server version: 1.6.2
Server API version: 1.18
Go version (server): go1.3.3
Git commit (server): 7c8fca2
OS/Arch (server): linux/amd64

# バージョンアップ
$ docker  version
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:20:14 UTC 2015
 OS/Arch:      linux/amd64

Server:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:20:14 UTC 2015
 OS/Arch:      linux/amd64

ちなみに iPhone は iPhone 5c で iOS 8.4 となる。

docker build

github.com

このマントおじさんの力を拝借するが、以下のように Redmine のバージョンを最新では無く一つ前のバージョンに変更する。

$ git diff Dockerfile
diff --git a/Dockerfile b/Dockerfile
index ad2333d..a1efeab 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,7 +1,7 @@
 FROM sameersbn/ubuntu:14.04.20150816
 MAINTAINER sameer@damagehead.com
 
-ENV REDMINE_VERSION=3.1.0 \
+ENV REDMINE_VERSION=3.0.4 \
     REDMINE_USER="redmine" \
     REDMINE_HOME="/home/redmine" \
     REDMINE_LOG_DIR="/var/log/redmine" \

一つ前のバージョンにする理由は iPhone アプリの RedminePM が Remine 3.1.0 だと認証でコケることを事前検証で確認した為。

docker build -t inokappa/redmine .

この Redmine コンテナを利用していく。

MySQL コンテナを起動

MySQL コンテナもマントおじさんのお力を拝借する。

$ docker run --name=mysql-redmine -d   \
  --env='DB_NAME=redmine_production'   \
  --env='DB_USER=redmine' \
  --env='DB_PASS=xxxxxxxxxxxx' \
  --volume=/srv/docker/redmine/mysql:/var/lib/mysql   \
sameersbn/mysql:latest

引っ越しを考えると Volume オプションは付けない方がよかったかもしれない。

Redmine コンテナを起動

コンテナの前に HTTPS プロキシを置く場合には REDMINE_HTTPS=true を Environment に渡す必要があるようだ。

$ docker run --name=redmine -d   \
  --link=mysql-redmine:mysql \
  --env='REDMINE_HTTPS=true' \
  --publish=10080:80   \
  --env='REDMINE_PORT=10080'   \
  --env='DB_NAME=redmine_production' \
  --env='DB_USER=redmine' \
  --env='DB_PASS=xxxxxxxxxxxx' \
  --volume=/srv/docker/redmine/redmine:/home/redmine/data \
inokappa/redmine

DB 接続パスワード等の情報を Environment で渡すのが嫌なら database.yml に直指定で docker build するのも検討したい。

MySQL コンテナ同様に引っ越し前提だと Volume オプションは無しで起動した方が良かったかな...まあ、いいや。

HTTPS 運用(Apache コンテナを利用する場合)

せっかくなので HTTPS のプロキシとして利用する Apache も Dockernize する。

github.com

HTTPS 運用(ホストの Apache を利用する場合)

  • mod_ssl と mod_proxy 関連モジュールを有効に
$ sudo a2enmod ssl
$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
  • 自己証明書の作成
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
  • 以下のように Apache の設定を用意する
$ sudo sh -c "cat << EOT > /etc/apache2/sites-available/redmine.conf
# <VirtualHost *:80>

#   ServerAdmin admin@example.com
#   Servername family.redmine.inokara.com
#   DocumentRoot /var/www/html/
  
#   ProxyPass / http://localhost:10080/
#   ProxyPassReverse / http://localhost:10080/

# </VirtualHost>

<VirtualHost *:443>
  ServerAdmin admin@example.com
  Servername family.redmine.inokara.com:443
  DocumentRoot /var/www/html/

  SSLEngine on
  SSLCertificateFile /etc/apache2/ssl/apache.crt
  SSLCertificateKeyFile /etc/apache2/ssl/apache.key
  
  # SSLProxyEngine on
  # RequestHeader set X_FORWARDED_PROTO 'https'
  ProxyPass / http://localhost:10080/
  ProxyPassReverse / http://localhost:10080/

</VirtualHost>
EOT
"
  • 設定を有効にする
$ sudo a2ensite redmine
$ sudo service apache2 reload

ログイン

f:id:inokara:20150818120425p:plain


RedminePM memo

RedminePM とは

自己証明書なサイトへアクセスする準備

$ openssl x509 -in /etc/apache2/ssl/apache.crt -outform DER -out /tmp/server.der

尚、DER 形式証明書については技術/Security/PKI,SSL,TLS/メモ01_拡張子の迷宮(pem,der,crt,cer,csr,...)RSA鍵、証明書のファイルフォーマットについてを参考にさせて頂いた。有難うございます。

f:id:inokara:20150820143347p:plain

証明書をメール添付で iPhone に転送して添付をタップする。尚、Apache コンテナを利用した場合には証明書を生成した際に assets/etc/apache2/ssl/server.der からコピーして利用する。

f:id:inokara:20150818164525p:plain

インストールをタップする。

f:id:inokara:20150818164610p:plain

警告が表示されるが引き続きインストールをタップする。

f:id:inokara:20150818164656p:plain

インストール完了。

API での操作を有効にする

RedminPM では認証の際に Redmine API を利用するので API での操作を有効にする必要がある。

f:id:inokara:20150818165112p:plain

[設定] → [認証] タブ→ [RESTによるWebサービスを有効にする] にチェックを付けて有効にする。

RedminePM の設定

  • アカウント設定

f:id:inokara:20150818164827p:plain

アカウント設定に Redmine の URL とアカウント名、パスワードを設定する。

RedminePM でチケットの一覧を確認

  • チケットの一覧を確認

f:id:inokara:20150818165824p:plain

おお、イケた。


その他メモ

Debian 8 jessie で Docker を動かす際の注意点

コンテナの名前解決が出来なかったので以下を修正して docker サービスを再起動する。

--- docker.bk   2015-08-18 10:14:42.912000000 +0900
+++ docker      2015-08-18 10:14:51.432000000 +0900
@@ -4,7 +4,7 @@
 #DOCKER="/usr/local/bin/docker"
 
 # Use DOCKER_OPTS to modify the daemon startup options.
-#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
+DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
 
 # If you need Docker to use an HTTP proxy, it can also be specified here.
 #export http_proxy="http://127.0.0.1:3128/"

systemd 管理下なので再起動は以下のように。

$ sudo systemctl restart docker.service

Papertrail で Apacheアクセスログ

Docker の Log Driver で syslog を指定しておいて Syslog サーバーとして Papertrail を利用した。Papertrail は Syslog 転送でログを登録出来る SaaS で登録したログの検索やアーカイブを可能。尚、Free プランで 48 時間分のログ検索や 7 日分をアーカイブ可能となっている。以下の記事が日本語で良く纏まっており参考にさせて頂いた。有難うございます。

ということで、Papertrail にサインアップして以下のように Apache コンテナを起動する。

$ docker run -d \
  --link redmine:redmine \
  --name=apache \
  -p 80:80 \
  -p 443:443 \
  --log-driver=syslog \
  --log-opt syslog-address=udp://xxxx.papertrailapp.com:xxxxx \
  --log-opt syslog-facility=daemon \
  --log-opt syslog-tag="apache" \
inokappa/apache

起動後、適当にアクセスしているうちに Papertrail のダッシュボードにてログを確認することが出来る。

f:id:inokara:20150821064836p:plain

尚、注意点としては...

  • 平文でログが飛んでしまう(※ Papertrail 自体は TLS で暗号化して TCP にて送信もサポートしている)
  • UDP 転送となるので取りこぼしが発生するかもしれない

セキュアな転送がサポートされているものの Docker の Log Driver では無理そうなのは残念だけど、構成を変えることで Papertrail へのセキュアなログ転送を実現


ということで

土台は出来たので

  • 予定を各チケットに登録して作成して予定表っぽく
  • メモやアイデアを各チケットに登録して付箋ボードっぽく

使ってみる。

その他のチケット駆動生活をサポートしてくれそうなツール

  • Google カレンダーの共有機能もあるなあと思っている
  • Backlog も良さそう
  • サイボウズ Live も良さそう

どんなに良いツールを使っても結局は使う本人次第ではあります...