Redmine を Docker コンテナで運用する

twitter bot を動かすのに Ubuntu 1804 LTS サーバー上に Docker の運用環境を構築したついでに、Windows 10 の Hyper-v の仮想マシン上に構築していた Redmine サーバーを Docker のコンテナで運用するように環境の設定 & 移行を行ったので、備忘録代わりに書いておきます。また、git のサーバーも Windows 10 の Hyper-v の仮想マシン上に構築していたものを移行しました。

環境構築は、次の方針で行った。

  • Redmine の Docker イメージは既存の sameersbn/docker-redmine
    を利用する
  • Docker コンテナのホストマシンのポートに Redmine コンテナのポートを割り当てる
  • MYSQL はホストマシン上のものを利用し、 Redmine 用のデータベースを置く
  • 既存の Redmine のデータは mysqldump でバックアップして移行する
  • git サーバーはホストマシン上に置き、Redmine の Docker コンテナと連携できるようにする
  • https 接続できるようにする

上記の項目順とは前後するが、最初は MYSQL 環境から。

MYSQL 環境設定

MYSQL の最新版をインストール

sudo apt install mysql-server

ここで、root ユーザーの初期パスワードの設定画面が出てこなないため、root ユーザーで MYSQL にログインできないというトラブルに。「MySQL 5.7 インストール後に root パスワードを変更する方法」を参照して解決した。

続いて、「redmine」データベースの作成、’redmine’@’localhost’ ユーザーの作成を行った。

CREATE DATABASE redmine CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost' IDENTIFIED BY 'パスワード';

ここで、データの移行を行っておく。
ちなみに、旧 Redmine サーバーでのデータベースのバックアップは次のコマンドで行う。

mysqldump --single-transaction -u root -p Redmine用データベース名 > 作成するバックアップファイル名

リストアのコマンドは次のとおり。

mysql -u root -p redmine < mysqldumpでバックアップしたファイル名

※ 移行するデータがない場合、説明文章からは、テーブル・初期データがない状態で sameersbn/docker-redmine イメージからコンテナを起動するとテーブルの作成・初期データの登録をするように作ってあるように読める(試してないので実際にどうなるのかは不明)。

リモート接続設定

MySQLにリモートホストから接続できるようにする」を参照。
ユーザーについては、テスト用に内部ネットワークからの接続設定と Dockder ネット―ワークからの接続設定を行った(ローカルネットワークを 192.168.1.0/24 と仮定して記述)。

GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'192.168.1.%' IDENTIFIED BY 'パスワード';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'172.17.%' IDENTIFIED BY 'パスワード';

Docker ネットワークについては、「Docker コンテナ・ネットワークの理解」を参照。
ローカルネットワークからの接続テストは、Windows 10 の Hyper-v の仮想マシン上に構築していた Redmine サーバー上から mysql コマンドで接続して確認。

mysql --host=MYSQLをインストールしたマシンのIPアドレス

Redmine 環境設定

準備

sameersbn/docker-redmine イメージの最新版を取得。

docker pull sameersbn/redmine:latest

HTTPS 設定用のサーバー証明書は、構築する Redmine サーバーが内部ネットワーク上のサーバーなので、自己認証局の自己証明書とする。自己認証局は、以前に、Windows 10 の Hyper-v の仮想マシン上に構築していたものを利用。仮想マシンなので、必要な時のみ稼働させている。
自己認証局の構築、自己証明書の発行については、「やむを得ない場合の自己証明書と自己認証局によるSSLサイト構築 」を参照。
CSR(署名要求) の Common Name(実際に使うサーバホスト名) については、Docker コンテナのホストマシンのホスト名(わたしの場合は内部 DNS サーバーを立てているので ホスト名.makcraft.com となる)を設定する(Redmine は Docker ネットワーク(172.17.0.1/16)上で稼働し、Docker コンテナのホストが受け取った接続要求は iptables の設定で Docker ネットワーク上のコンテナへ転送されるが、http ヘッダーのホスト名には Docker ホストマシンのホスト名がセットされているため)。
Docker ホスト上に Docker コンテナのポートを割り当てた際のネットワーク構成については、「ホスト上にコンテナのポートを割り当て」を参照。
サーバー証明書の保存先については、「sameersbn/docker-redmine
の説明の SSL の項
」を参照(保存ファイル名は説明中のものと同じにすること。また、sameersbn/docker-redmine コンテナの Web サーバーは nginx なので、サーバー証明書と中間 CA の証明書はファイル連結しておく)。

次に、Dockerのコンテナとフォルダを共有するデータストアを作成する。

sudo mkdir -p /srv/docker/redmine

コンテナの起動

準備ができたので、取得したイメージからコンテナを起動させる。
環境は次のものを仮定している。

  • ホストマシンの 58080 ポートへのアクセスを refmine コンテナの 80 ポートへ転送する
  • ホストマシンの 54443 ポートへのアクセスを refmine コンテナの 443 ポートへ転送する
  • MYSQL サーバーの IP アドレスは、192.168.1.2
  • データベース名は、redmine
  • DB ユーザー名は、redmine
  • データ共有のホスト側ディレクトリは、/srv/docker/redmine

次のコマンドで Docker コンテナを起動する。

docker run --name=redmine -it -d \
> --publish=58080:80 --publish=54443:443 \
> --env='REDMINE_HTTPS=true' \
> --env='DB_ADAPTER=mysql2' \
> --env='DB_HOST=192.168.1.2' --env='DB_NAME=redmine' \
> --env='DB_USER=redmine' --env='DB_PASS=DBユーザーのパスワード' \
> --volume=/srv/docker/redmine:/home/redmine/data \
> sameersbn/redmine:latest

コンテナの起動後にブラウザから https://ホストマシンのホスト名.ドメイン名:54443/ へ接続すると Redmine のウェブページが表示される。
ちなみに、次のコマンドで Redmine コンテナにコンソール接続できる。

docker exec -it redmine /bin/bash

git サーバー側の設定

記述の前提は次のとおり。

  • git のデータ転送用のプロトコルはSSH を使う
  • 既存の git サーバー上のリポジトリ: oldhost.example.com:/var/git
  • 上記リポジトリの所有者: git、グループ: git
  • 作成する git サーバーのリポジトリ: newhost.example.com:/var/git

newhost.example.com にユーザー git、グループ git を作成
ユーザー git のホームディレクトリに .ssh ディレクトリを作り、~/.ssh/authorized_keys ファイルに git サーバーを利用するユーザーの公開鍵を追加していく。
既存の git サーバーから git リポジトリを持ってくる。

sudo mkdir /var/git
sudo scp -r git@oldhost.example.com:/var/git /var/git/
sudo chown -R git:git /var/git

これで git clone git@newhost.example.com:/var/git/プロジェクト.git できるようになっている。
既に取得しているローカルのリポジトリは、origin の url を変更する。

git remote set-url origin git@newhost.example.com:/var/git/プロジェクト.git

Redmine の git リポジトリ連携の設定

Redmine の git リポジトリ連携は、Redmine 稼働サーバーのローカル環境に git リポジトリが存在する必要があるので、Redmine コンテナにマウントしているホスト側のディレクトリ上に git リポジトリのミラーを設置し、git サーバー上のリポジトリの post-update トリガで fetch を行うように設定する(「Redmine で別サーバーにある git リポジトリーを参照する」を参照)。

[Redmine コンテナにマウントしているホストのディレクトリ側]

cd /srv/docker/redmine/git
git clone --mirror /var/git/プロジェクト.git
chown -R git:git ./プロジェクト.git

[git サーバーのリポジトリ側]

cd /var/git/プロジェクト.git/hooks
sudo -u git cp post-update.sample post-update
sudo -u git chmod 755 post-update

post-update を次のように修正する

#exec git update-server-info ← コメントアウト

cd /srv/docker/redmine/git/プロジェクト.git
git fetch --all

修正した後、スクリプトを動かして問題がないことを確認する。

sudo -u git ./post-update

これで git push origin master などを行うと、Redmine のコンテナにマウントされる /sev/docker/redmine/git 側のミラーリポジトリで fetch が行われることで、リポジトリが同期される。
あとは、Redmine に admin でログインし、管理しているプロジェクトのリポジトリ設定を「設定」タブ⇒「リポジトリ」タブでリポジトリ情報を削除し、「新しいリポジトリ」からリポジトリのパス「/home/redmine/data/git/プロジェクト.git」で追加しておけばOK。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です