きっかけ

弊社では、あらかじめテンプレートデータやプラグインなどが組み込まれている状態のRedmineをAWS AMIとして保存しておき、Redmineが必要なPJに対して素早くRedmine環境を提供する、という作業を実施してきました。
ですが、このAMIは標準サポート期間が終了するAmazon Linux AMIで作成されていたためリプレイス作業が必要になったのですが、どうせリプレイスするならDocker上でRedmineを構築してAWS以外(Windowsなど)でも動かせるようにしてしまおう、というのがこの作業のきっかけです。

構成・構築手順

docker-composeを使って下記4つのコンテナ作りました。それぞれの構築内容を簡単に説明していきます。
①Redmine
②MySQL
③Subversion
④nginx

①Redmine、②MySQL

RedmineのDockerイメージとして有名なsameersbn/redmineを使って構築しました。
sameersbn/redmineにはすぐに使えるdocker-compose.ymlもいくつか用意されていて、デフォルト状態であればすぐにRedmine環境を作ることができます。

今回は、Redmine立ち上げ時にあらかじめプラグインをテンプレートデータを登録されている状態にする必要があるので、それぞれ下記のように準備しました。

  • プラグイン
    sameersbn/redminereadmeに手順が記載されていますが、ほとんどの場合は、docker build前にマウント先のディレクトリにプラグインファイルを配置しておくだけで大丈夫です。(一部プラグインを除く)
    プラグインを配置した後にdocker buildすれば自動的にインストールしてくれます。
  • テンプレートデータ
    やり方はいくつかあるのでしょうが、今回はDatabase(MySQLを使いました)のディレクトリを丸ごとバックアップしておき、docker build前にマウント先のディレクトリへ展開しておく、という方法にしました。こうすることで、バックアップしたときのデータの状態で再開することができます。

上記内容を実行するための sh(AmazonLinux2で動確) は下記のような感じです。
※ shから呼び出されているdocker-compose.ymlは省略

  • shサンプル
#!/bin/bash
echo "### install docker. ###"
yum install -y docker
service docker start
echo "### install docker compose. ###"
curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
echo "### install git. ###"
yum install -y git
echo "### download plugin source code. ###"
mkdir -p /srv/docker/redmine/redmine/plugins
mkdir -p /srv/docker/redmine/redmine-logs
git clone https://github.com/jbbarth/redmine_base_deface /srv/docker/redmine/redmine/plugins/redmine_base_deface --depth 1
git clone https://github.com/koppen/redmine_github_hook /srv/docker/redmine/redmine/plugins/redmine_github_hook --depth 1
# 必要に応じてここにプラグインを追加
echo "### initdata(mysql) setup. ###"
mkdir /srv/docker/redmine/mysql
tar -xvf ./initdata/mysql.tar -C /srv/docker/redmine/mysql
docker-compose up -d --build

③Subversion、④nginx

③はUbuntuにapt-getでSubversionをインストール、④は公式Dockerイメージを利用しました。
今時Subversionって、、、という意見もあるかも思いますが、簡単なドキュメント管理であればシンプル&扱える人が多いSubversionのほうが便利だったりするので、今回も組み込んでいます。

ちなみに、Subversionに対して下記2つの機能を組み込んでいます。

  • Redmineアカウントを共有
    Redmineに付属されている Redmine.pmファイル を使うことで、RedmineのアカウントをSubversionにも共有することができ、RedmineのID/PASSでSubversionにもログインすることができます。(PJごとのアクセス権限も設定可能)
  • Subversionリポジトリを自動作成
    自作の常駐バッチを使ってRedmine Database(今回はMySQL)のテーブルを監視し、Redmine上で新しくプロジェクトが作成されたらSubversionにも同名のリポジトリを自動的に作成して、すぐにSubversionを使えるようにしました。

nginxには自己証明書を組み込んでSSL通信も可能にしています。自己証明書はこちらのツールを使ってサクッと作成しました。複雑なコマンドを用意せずとも簡単に自己証明書が作れてしまうので楽ですね。

上記①~④をdocker-compose.ymlに組み込むことで、すぐにDockerでのRedmine環境を提供できるようになりました。

最後に

と、ここまでいとも簡単に構築できたように書いてきましたが、自分がDockerやサーバ構築作業に慣れていないこともあって実際には結構時間がかかりました。でも、そのおかげで色々な知識・経験を積むことが出来ました。やはり実際に手を動かすことが大事ですね。
もっと簡単な構築の仕方とかもあると思うので、これからも日々勉強していきます。