読者です 読者をやめる 読者になる 読者になる

ArchLinux上で運用していたRedmineをDockerコンテナに移行したときのメモ

移行するにあたっての経緯

RedmineをArchLinux上で運用していたのですが、Redmine絡みのパッケージをアップデートするたびに問題が発生して運用が辛かった
やっぱ時代はDockerでしょ(適当

と言うことでdockerに移行しました。
その時の作業内容を残しておこうと思います。

そういえば...全く更新していなかったのですがRedmineって今バージョン3.2.0なんですね(アップデートほったらかしにしてた)
(RubyやOpenSSLを最新のパッケージにアップデートすると動作しなくなってたのこいつのせいなんじゃ...)

まずRedmineを最新バージョンに上げ、動作確認してからDockerに移行しました。
(せっかくArchLinuxで運用していたんだし、素直にaur/redmineのパッケージ使っておけばアップデート楽だったなと今更後悔)

ちなみにDockerに移行するとこの前やったowncloudとかの連携が全部出来なくなりますが、正直使ってなかったので無かったことにします。


現在のRedmineの環境

  • ArchLinux
  • Apache: 2.4.18-2
  • Redmine: 3.0.3
  • postgresql: 9.5.1-2

Dockerへ移行する前にRedmineのアップデート

Dockerに移行する前に、Redmineを最新バージョンに上げて動作確認したので一応手順を残しておこうと思います。

Redmineの公式ドキュメントを参考にアップデートしました。

バックアップ

まずPostgresqlをまるごとバックアップします。
身内用なので問答無用で落として物理&オフラインバックアップしました。(Postgres止めてディレクトリごとコピー)
その後Redmineもディレクトリごとコピーしてバックアップしておきました。

$ sudo systemctl stop httpd.service
$ sudo systemctl stop postgresql.service
$ sudo cp -a /srv/redmine-3.0.3 /srv/redmine-3.0.3-
$ sudo cp -a /var/lib/postgres/data /var/lib/postgres/data-
新しいバージョンのRedmineと入れ替える

では早速アップデートします。

Redmineの公式から最新バージョンのtarファイルを落として展開

$ wget http://www.redmine.org/releases/redmine-3.2.0.tar.gz
$ sudo tar fvxz redmine-3.2.0.tar.gz -C /srv/
設定ファイルやその他のファイルの移動

各設定ファイルを新しいconfigディレクトリにコピー

$ sudo cp redmine-3.0.3/config/database.yml redmine-3.2.0/config/database.yml
$ sudo cp redmine-3.0.3/config/configuration.yml redmine-3.2.0/config/configuration.yml

filesディレクトリを新しいRedmineにコピー

$ sudo cp -r redmine-3.0.3/files/* redmine-3.2.0/files/

pluginsディレクトリを新しいRedmineにコピー

$ sudo cp -r redmine-3.0.3/plugins/* redmine-3.2.0/plugins/
gemとかbundleとか(rubyワカラナイ

Redmineの実行に必要なgemをインストール

$ cd redmine-3.2.0/
$ bundle install --without development test
$ bundle exec rake generate_secret_token
パーミッションの設定
$ sudo chown root:root redmine-3.2.0/ -R
$ cd redmine-3.2.0
$ sudo chown -R http:http files log tmp public/plugin_assets
$ sudo chmod -R 755 files log tmp public/plugin_assets
データベースの更新
$ sudo systemctl start postgresql.service
$ sudo bundle exec rake db:migrate RAILS_ENV=production
$ sudo bundle exec rake redmine:plugins:migrate RAILS_ENV=production
クリーンナップ
$ sudo bundle exec rake tmp:cache:clear tmp:sessions:clear
Apacheの設定
#新しいRedmineのディレクトリに変更する
DocumentRoot "/srv/redmine-3.2.0/public"
トラブルシュート

エラーその1

There was an error parsing `Gemfile`: Permission denied @ rb_sysopen - /srv/redmine-3.2.0/config/database.yml. Bundler cannot continue.

https://wiki.blue-it.org/Redmine#Website_won.27t_come_up
ここを参考にしました

config/database.ymlのパーミッションを修正

$ sudo chmod 644 config/database.yml

エラーその2

App 8703 stderr: Rails Error: Unable to access log file. Please ensure that /srv/redmine-3.2.0/log/production.log exists and is writable (ie, make it writable for user and group: chmod 0664 /srv/redmine-3.2.0/log/production.log). The log level has been raised to WARN and the output directed to STDERR until the problem is fixed.

production.logのパーミッションを修正。
他にもあるかもしれないので以下をもう一度実行しておきました。

$ sudo chown -R http:http files log tmp public/plugin_assets
$ sudo chmod -R 755 files log tmp public/plugin_assets
新機能の追加

管理 -> ロールと権限
ここで新しく追加された機能を有効にしておきます。

動作確認

redmineにアクセスしてちゃんと動作するか確認します。


Dockerコンテナにマイグレーション

と、言うことでアップデートと動作確認が終了しました。
これをDockerコンテナ(別サーバ)に移行します。

今回本番環境はdocker-composeを使います。

kubernetesとかで管理出来たらいいのですが今回は時間が無いのでそのうちやります(たぶん

本番環境にマイグレーションする前に、ローカルのdockerで移行手順や動作確認などのテストをしたのですがそこは割愛します。

ということで、以下の方法でマイグレーションしました。

  1. redmineサーバからDBとfilesをコピーしてくる
  2. docker-composeの用意
  3. DBのマイグレーション
  4. filesディレクトリのマイグレーション

移行先の環境と使用するdockerイメージ

環境

  • ArchLinux
  • docker:1.10.3
  • docker-compose:1.6.2

使用するdockerイメージ(全部オフィシャル

  • redmine:latest
  • postgres:9.5
  • busybox:latest

移行先のdockerサーバは、別コンテナで複数のwebサービスが動いているのでそれらをリバースプロキシ(dmp1ce/nginx-proxy-letsencrypt)で振り分けています。

1. redmineサーバからDBとfilesをコピーしてくる

Redmineサーバで以下のコマンドを使用してDBデータとfiles内をdockerサーバにコピーします。

redmine_server$ sudo -u postgres pg_dumpall -c > pg_redmine.dump

redmine_server$ cd /srv/redmine-3.2.0/
redmine_server$ tar fvcz ~/redmine_files.tar.gz files

# (私は一度ローカルに持ってきてから移行先サーバにコピーしました)
redmine_server$ scp pg_redmine.dump redmine_files.tar.gz docker-server:distination

2. docker-composeの用意

ディレクトリ構成
redmine-compose
├── containers
│   ├── postgres-datastore
│   │   └── Dockerfile
│   └── redmine-files-datastore
│       └── Dockerfile
└── docker-compose.yml
containers/redmine-files-datastore/Dockerfile
FROM busybox
VOLUME /usr/src/redmine/files
CMD tail -f /dev/null
containers/postgres-datastore/Dockerfile
FROM busybox
VOLUME /var/lib/postgresql/data
CMD tail -f /dev/null
docker-compose.yml
postgres-datastore:
    build: containers/postgres-datastore

redmine-files-datastore:
    build: containers/redmine-files-datastore

some-postgres:
    image: postgres:9.5
    volumes_from:
        - postgres-datastore
    environment:
        POSTGRES_PASSWORD: PASSWORD
        POSTGRES_USER: redmine

some-redmine:
    image: redmine
    volumes_from:
        - redmine-files-datastore
    links:
        - some-postgres:postgres
    environment:
        VIRTUAL_HOST: redmine.example.org
        VIRTUAL_PORT: 3000
        LETSENCRYPT_HOST: redmine.example.org
        LETSENCRYPT_EMAIL: example@example.org

some-redmineのenvironmentは、リバースプロキシにdmp1ce/nginx-proxy-letsencryptを使用しているのでそっちで使用する環境変数です。
一応そのプロキシのdocker-composeを載せておきます。

#nginx-proxy-compose/containers/certs-datastore/Dockerfile
FROM busybox
VOLUME /etc/nginx/certs/
CMD tail -f /dev/null

#nginx-proxy-compose/docker-compose.yml
certs-datastore:
    build: containers/certs-datastore
some-proxy:
    image: dmp1ce/nginx-proxy-letsencrypt:latest
    ports:
        - "80:80"
        - "443:443"
    volumes_from:
        - certs-datastore
    volumes:
        - /var/run/docker.sock:/tmp/docker.sock:ro
    environment:
        DEFAULT_HOST: example.org

3. DBのマイグレーション

まずpostgresとpostgresのデータ用コンテナのみを建ち上げます。

docker_server$ docker-compose up -d postgres-datastore some-postgres

postgresコンテナにredmineデータベースのリストアをします。

docker_server$ cat pg_redmine.dump | docker exec -i redminecompose_some-postgres psql -U postgres

postgresのRedmineロールのパスワードを設定しなおします。
(Dockerに移行する際にRedmineロールのパスワードを変更していなければやらなくて大丈夫)

# docker exec -i -t redminecompose_some-postgres psql -U redmine
postgres=# \password
postgres=# \q

4. filesディレクトリのマイグレーション

残りのコンテナの建ち上げます。

# docker-compose up -d

redmineのfilesディレクトリをdocker側に移行

# docker run -i -t --rm \
            --volumes-from=redminecompose_redmine-files-datastore_1 \
            -v /path/to/redmine_file.tar.gz:/tmp/redmine_file.tar.gz \
            busybox sh

# tar fvxz redmine_files.tar.gz -C /usr/src/redmine/
(tarの仕方によっては/usr/src/redmine/files)

しばらく動かしてみて問題なかったので上手くdockerに移行できたみたいです。

メールの設定は必要になった時に行う予定です。

これからはRedmineの新しいバージョンがリリースされてもRedmineのコンテナだけを入れ替えれば済むので管理が楽になりそうです。
やっぱDocker良いですね

参考サイト

http://redmine.jp/guide/RedmineUpgrade/