プロジェクト管理 on Redmine on Dockerで運用含めて考えてみる~環境構築編~
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の構築コストが低い
- プラグインや添付ファイル、テーマはコンテナに含めない
- Redmineのプラグインが自由に追加可能
- 添付ファイル、テーマなどのバックアップが可能
- URLに「/redmine」を入れること
- HTTPSである事
Dockerfileはどうするのか?
Dockerでredmineを動かすにも、一からDockerfileを書いてもいいのですが、車輪の再発明の匂いがするのでDocker Hubで検索すると480リポジトリもありました。
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でもいけるけど、RedmineはPostgreSQL推奨なので、PostgreSQLを使います。
cf. Defect #19344: MySQL 5.6: IssueNestedSetConcurrencyTest#test_concurrency : always fails - RedmineRedmine本体は現状PostgreSQL推奨です。MySQL 5.6以降だとデッドロックが発生するケースがあります。 #redmineThttps://t.co/zRSmVfGY8Thttps://t.co/y9KtUtJ8SG https://t.co/AS0A6KDeaZ
— MAEDA Go (@g_maeda) 2017年5月13日
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/redmineの tag にあるものを指定します。 今回は、 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
でブラウザで開くと起動が確認出来ます。
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の初期設定と初期データ登録」