Redmineインストール from Docker Hub

# Redmineインストール from Docker Hub

CentOS7上にRedmineをdocker hubから最新版~~(3.3.3)~~(3.3.4)を取得してきてインストールしてみたときのメモ

実際にデータのバックアップ・リストアを行ってみたので更新(2017/04/20)
redmine(3.3.4)とpostgres(9.6.3)のバージョンが上がっていたので、手元の環境をバージョンアップしたときのメモを追加(2017/07/06)

環境は CentOS 7.3.1611、docker-1.12.6

## イメージの取得

docker hubよりイメージを取得する。コンテナ起動時に自動的に取得するだろうけど、一応先に取得しておく。

```
$ docker pull redmine:3.3.4
$ docker pull postgres:9.6.3
$ docker images
REPOSITORY                    TAG                   IMAGE ID            CREATED             SIZE
docker.io/redmine             3.3.4                 e973f4256163        36 hours ago        638.3 MB
docker.io/postgres            9.6.3                 f8d91fbcfa35        7 days ago          268.8 MB
```

## 構成

  永続化のためのデータボリュームを先に作成しておき、DB(postgres)、redmineを起動する。
  永続化するデータは、以下の通り。

 * postgres DB(/var/lib/postgresql/data)
 * redmine files(/usr/src/redmine/files)
 * redmine plugins(/usr/src/redmine/plugins)
 * redmine vendor/plugins(/usr/src/redmine/vendor/plugins)
 * redmine public/themes(/usr/src/redmine/public/themes)

  redmineのテーマも永続化の対象にした。

## redmine起動

### データボリュームの作成

dockerのデータボリュームを先に作成、出来上がっていることを確認する。

```
$ docker volume create --name main-redmine-db
$ docker volume create --name main-redmine-files
$ docker volume create --name main-redmine-plugins
$ docker volume create --name main-redmine-vplugins
$ docker volume create --name main-redmine-themes
```

### redmineを構成するコンテナの起動

* DB(postgres)コンテナを起動

```
$ docker run -d --restart=always --name main-postgres \
             -v main-redmine-db:/var/lib/postgresql/data \
             -e POSTGRES_PASSWORD=rdpassword -e POSTGRES_USER=redmine postgres:9.6.3
0f533f196ef0bd1516da24239f971a3fa6b35adf03f4f83f6f0c676c95c1d862
$
```

* redmineを起動

```
$ docker run -d --restart=always --name main-redmine \
             -v main-redmine-files:/usr/src/redmine/files \
             -v main-redmine-plugins:/usr/src/redmine/plugins \
             -v main-redmine-vplugins:/usr/src/redmine/vendor/plugins \
             -v main-redmine-themes:/usr/src/redmine/public/themes \
             -e REDMINE_DB_PASSWORD=rdpassword \
             -p 80:3000 --link main-postgres:postgres redmine:3.3.4
ec2365d662ceb835e3c9a5a84e4b8e5d4cacdba291442567dc79b9fda15bc61f
$
```

ここで、プラグインを入れたときにいくつか気になることが起きたので、先に対応しておく。

----
#### DBの反映を行ったときに以下のメッセージが出る。

```
$ RAILS_ENV=production bundle exec rake redmine:plugins:migrate
`/home/redmine` is not a directory.
Bundler will use `/tmp/bundler/home/unknown' as your home directory temporarily.
```

bundleのキャッシュ領域をホームディレクトリ配下に作成するが、/home/redmine が無いために出力している。先に作成しておく。
/tmp/bundler/home/unknown で問題は無いが、不要なメッセージが出るのは嫌なので対処しておく。

```
docker exec main-redmine mkdir -pm 755 /home/redmine
docker exec main-redmine chown redmine.redmine /home/redmine
```

----
#### 必要とするコマンド(unzip、ghostscript)が入っていない。

プラグインのいくつかは、zip形式で公開されている物がある。
オフィシャルなイメージではなく、unzipコマンドが入っているイメージを使えばいいのだろうけど、やはりオフィシャルを使用したいので、最初にコマンドをインストールしておく。また、ghostscriptが入っていないとpng作成で失敗するので、入れておく。

```
docker exec main-redmine apt-get -y update
docker exec main-redmine apt install -y unzip ghostscript
```

http://localhost でredmineが起動していることを確認する。

----
## データのバックアップ

データのバックアップは、ホスト側にファイルを格納する形で行うが、コンテナ側からホスト側を参照するためには、バックアップディレクトリに SELinux コンテキスト ( svirt_sandbox_file_t )を付与していないと、コンテナ内から、書き込みが出来ない。

### redmineデータのバックアップ

redmineデータのバックアップは redmineイメージを使用してバックアップを行う。
--volumes-from を使用し、main-redmine コンテナを読み込み専用で参照し、ホスト側に tar 形式でバックアップを作成する。

postgresデータのバックアップは、pg_dumpコマンドを使用してバックアップを行う。
ホスト側に tar 形式のバックアップを作成する。

```
$ mkdir -pm 775 $PWD/backup
$ chcon -t svirt_sandbox_file_t $PWD/backup
$ docker run --rm -v $PWD/backup:/backup --volumes-from main-redmine:ro redmine:3.3.4 \
         tar zcf /backup/redmine_backup.tar.gz -C /usr/src/redmine files plugins vendor public/themes
$ docker run --rm -ti -v $PWD/backup:/backup --link main-postgres:postgres postgres:9.6.3 \
         pg_dump -h postgres -p 5432 -U redmine -W -Fc -f /backup/redmine-db.dmp redmine
Password:rdpassword
```

## データのリストア

バックアップしたデータのリストアできるかを確認、主に動かしている環境とは別にコンテナを作成する。
redmineを起動するが、バックアップ元のredmineを動かしたままにしてあるので、待ち受けポート番号は80ではなく、20080に変更している。
あとは、各リソースの「main-」が「test-」に変わっただけで、最初のredmineと同様に起動する。

 * リストア確認用データボリュームを作成する。

```
$ docker volume create --name test-redmine-db
$ docker volume create --name test-redmine-files
$ docker volume create --name test-redmine-plugins
$ docker volume create --name test-redmine-vplugins
$ docker volume create --name test-redmine-themes
```

* リストア確認用DB(postgres)、redmineを起動

```
$ docker run -d --name test-postgres \
             -v test-redmine-db:/var/lib/postgresql/data \
             -e POSTGRES_PASSWORD=rdpassword -e POSTGRES_USER=redmine postgres:9.6.3
$ docker run -d --name test-redmine \
             -v test-redmine-files:/usr/src/redmine/files \
             -v test-redmine-plugins:/usr/src/redmine/plugins \
             -v test-redmine-vplugins:/usr/src/redmine/vendor/plugins \
             -v test-redmine-themes:/usr/src/redmine/public/themes \
             -e REDMINE_DB_PASSWORD=rdpassword \
             -p 20080:3000 --link test-postgres:postgres redmine:3.3.4
```

* postgresデータのリストア

```
$ mkdir -pm 775 /dev/shm/backup
$ cp -p redmine-db.dmp /dev/shm/backup/.
$ sudo chcon -t svirt_sandbox_file_t /dev/shm/backup
$ docker run --rm -ti -v /dev/shm/backup:/backup:ro --link test-postgres:postgres postgres:9.6.2 \
         pg_restore -h postgres -p 5432 -U redmine -d redmine -W -c -Fc /backup/redmine-db.dmp
Password:rdpassword
```

この時、以下のようなエラーが大量に出たが、[ここ](https://www.postgresql.jp/document/9.3/html/app-pgrestore.html)でも
-c オプションを付けたとき、「データが無いとき害のないメッセージをいくつか出力するかもしれません。」とある。
とりあえず、無視する。

```
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2795; 2606 17589 FK CONSTRAINT easy_settings fk_rails_31c4b01147 redmine
pg_restore: [archiver (db)] could not execute query: ERROR:  relation "public.easy_settings" does not exist
    Command was: ALTER TABLE ONLY public.easy_settings DROP CONSTRAINT fk_rails_31c4b01147;
(略)
pg_restore: [archiver (db)] Error from TOC entry 186; 1259 16393 SEQUENCE attachments_id_seq redmine
pg_restore: [archiver (db)] could not execute query: ERROR:  sequence "attachments_id_seq" does not exist
    Command was: DROP SEQUENCE public.attachments_id_seq;

pg_restore: [archiver (db)] Error from TOC entry 187; 1259 16395 TABLE attachments redmine
pg_restore: [archiver (db)] could not execute query: ERROR:  table "attachments" does not exist
    Command was: DROP TABLE public.attachments;

WARNING: errors ignored on restore: 329
```

### redmineデータのリストア

```
$ mkdir -pm 775 /dev/shm/backup
$ cp -p redmine_backup.tar.gz /dev/shm/backup/.
$ sudo chcon -t svirt_sandbox_file_t /dev/shm/backup
$ docker run --rm -v /dev/shm/backup:/backup:ro --volumes-from test-redmine -u redmine redmine:3.3.4 \
         tar xvf /backup/redmine_backup.tar.gz -C /usr/src/redmine
```

redmineのデータリストアでも以下のようなエラーが出た。原因は、バックアップ元の vendor/plugins のオーナが root:rootに
なっているため、tarコマンドがファイル情報の更新に失敗したようだ。 無視する。

```
tar: vendor/plugins: Cannot utime: Operation not permitted
```

一応、コンテナを再起動。(必要ないかもしれないが、気分で ^^;)

```
$ docker stop test-redmine
$ docker stop test-postgres
$ docker start test-postgres
$ docker start test-redmine
```

http://localhost:20080 でredmineが起動していることを確認する。
コピー元と同じようにアクセスできているようだ。

## ~~ガントチャートでPNGでインターナルエラー~~
redmineコンテナ作成時にghostscriptをインストールするので、発生しない。

~~上記で作成したredmine環境で、ガントチャートの他の形式にエクスポートでPNGを選択するとInternalErrorが発生してしまう。~~

![インターナルエラー](https://qiita-image-store.s3.amazonaws.com/0/137664/cc8af78a-0a8d-ec20-d29b-8f910ae4e049.png)

~~最初、日本語のフォントが無いのかと考えたけど。。。~~

```
# apt update
# apt search ipa
# apt install fonts-ipaexfont
# fc-list
```

~~やはりダメだった。 仕方が無いので普通にホスト側から strace コマンドで直接コンテナのプロセスが呼び出しているシステムコールをトレースしてみる。~~

```
3867  execve("/usr/local/sbin/gs", [....]) = -1 ENOENT (No such file or directory)
(略)
3867  execve("/bin/gs", [....]) = -1 ENOENT (No such file or directory)
```

~~ghostscriptが無かったのが原因のようだ。ghostscriptをインストールし、docker-redmineを再起動すると一応表示された。~~

```
# apt install ghostscript
```

しかし、~~InternalErrorは無くなったが、~~日本語が化ける。すでに解決方法はあるようだ。
[ガントチャートをPNG形式の画像に出力すると文字化けする](http://redmine.jp/faq/gantt/gantt-png-mojibake/)

```text:configuration.yml
default:
  # 日本語に対応したフォントのパスを指定。値は環境によって異なる。
  rmagick_font_path: /usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf
```

だたし、上記の対応でエラーは起きなくなったが、変更は main-redmine コンテナに対して行っているため、リストアを行った test-redmine コンテナについては、リストア後もエラーとなっている。この場合は、「docker commit main-redmine」でコピー元のイメージを作成し、そのイメージを使用してリストア環境の作成が必要かもしれない。

## 最後に

オフィシャルなイメージを使用しても、きちんと使おうとするとなんらか手を加えていかないといけない。もっと楽をする方法は無いものか。

## 参考

  [Redmineの公式Dockerイメージを例に、自分に合ったDockerの使い方を探る](https://www.ainoniwa.net/pelican/2016/1120a.html)