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で移行手順や動作確認などのテストをしたのですがそこは割愛します。
ということで、以下の方法でマイグレーションしました。
- redmineサーバからDBとfilesをコピーしてくる
- docker-composeの用意
- DBのマイグレーション
- 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良いですね