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。