公式Redmine+postgeSQL環境をdocker-composeで構築

# 概要

* 老朽化したサーバからの移行に伴い、Redmine環境もdokerで再構築・移行した
  * 構築環境情報を明確化するためと、ミドルウェアやツールのバージョンアップを容易にするため

# 前提

* サーバにdockerおよびdocker-composeがインストールされていること

# 結論(docker-compose.yml)

* 以下の`docker-compose.yml`をサーバに配置し、`docker-compose up -d`で実行する

```docker:docker-compose.yml

version: '3.7'

services:
    # Redmine本体
    redmine:
        image: redmine:3.4.13-passenger
        container_name: redmine
        ports:
            - '33000:3000'
        expose:
            - '3000'
        volumes:
            - ./redmine/files:/usr/src/redmine/files
            - ./redmine/log:/usr/src/redmine/log
            - ./redmine/plugins:/usr/src/redmine/plugins
            - ./redmine/public/themes:/usr/src/redmine/public/themes
        restart: always
        environment:
            REDMINE_DB_POSTGRES: postgres
            REDMINE_DB_DATABASE: redmine
            REDMINE_DB_USERNAME: redmine
            REDMINE_DB_PASSWORD: redmine
            TZ: Asia/Tokyo
        links:
            - postgres

    # DBサーバ
    postgres:
        image: postgres:11.5
        container_name: postgres_redmine
        volumes:
            - ./postgres/db-data:/var/lib/postgresql/data
            - ./postgres/initdb:/docker-entrypoint-initdb.d
        ports:
            - "5432:5432"
        restart: always
        environment:
            POSTGRES_ROOT_PASSWORD: postgres
            POSTGRES_USER: redmine
            POSTGRES_PASSWORD: redmine
            POSTGRES_DATABASE: redmine
            TZ: Asia/Tokyo

volumes:
    redmine:
    postgres:
```

* 正常に起動したら、ブラウザから、`ホストIP:33000`でアクセスしてRedmineのトップ画面が表示されることを確認する。

## (余談)postgreSQLを日本語ロケールで設定する場合

* postgreSQLのimageには初期ロケールはen_US.utf8しか設定されていないので、日本語ロケールを使う場合には、docker imageを作る必要があります。[(参考)Docker for Mac で 日本語locale設定を含む PostgreSQL を構築](https://qiita.com/kisk_tech/items/eb142b2287779e0751ee#%E6%97%A5%E6%9C%AC%E8%AA%9Elocale%E3%82%92%E5%90%AB%E3%82%80docker-image%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E8%B5%B7%E5%8B%95)

* 上記docker-compose.ymlのDBサーバ部分を書き換え、docker image作成用のDockerfileを作ります

```docker:docker-compose.yml
    # DBサーバ
    # 日本語ロケールのdocker imageを利用
    postgres:
        build:
            context: ./
            dockerfile: ./Dockerfile
        container_name: postgres_redmine
        volumes:
```

```dockerfile:Dockerfile
FROM postgres:11.5

RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8

ENV LANG ja_JP.utf8

```

# 旧環境からの移行(リストア)

* 構築したRedmine環境に、旧環境からデータを移行する際には、以下の手順で実施します。

1. 移行元環境から、DBデータ、添付ファイル、プラグインを取得し、移行先環境に転送します。
  * DBデータバックアップ： `pg_dump -U redmine redmine > [任意のファイル名]`
  * filesディレクトリ(添付ファイル)： `/var/lib/redmine/files`
  * pluginディレクトリ(プラグイン)： `/var/lib/redmine/plugin`
1. redmineコンテナにアクセスし、 [公式のインストール手順](http://guide.redmine.jp/RedmineInstall/) の、以下の作業を実施します。
  * redmineコンテナへアクセス： `docker exec -it redmine /bin/bash`
  * [Step 4 - 依存するソフトウェアのインストール](http://guide.redmine.jp/RedmineInstall/#step-4-)
  * [Step 5 - セッションストア秘密鍵の生成](http://guide.redmine.jp/RedmineInstall/#step-5-)
  * コンテナから出る：`exit`
1. 移行元のDBデータを、移行先環境にリストアします  
(※ 環境初期構築時にDBに初期データが事前に入ってしまうため、テーブルを削除→再作成という流れで実施)
  * ホストのバックアップデータをpostgresqlコンテナにコピー： `docker cp [ホストのバックアップファイル] postgres_redmine:[コンテナ内の任意のディレクトリ]`
  * postgresqlコンテナにアクセス： `docker exec -it postgres_redmine /bin/bash`
  * DBに登録されている初期データを削除
    * テーブルの削除
        * RedmineDBにアクセス：`psql -U redmine -d　redmine`
        * テーブル全削除：`drop schema public cascade;`
        * スキーマの再構築：`create schema public;`
        * RedmineDBから出る：`\q`
    * テーブルの再作成
        * `psql -U redmine redmine < [redmineコンテナ内に格納したバックアップDBデータ]`
        * postgresqlコンテナから出る：`exit`
1. redmineコンテナに再度アクセスし、[公式のアップグレード手順](https://redmine.jp/guide/RedmineUpgrade/)の、以下の作業を実施
  * [Step 4 – データベースの更新]：データベースのマイグレーションとプラグインのマイグレーションを実施
1. redmine関連コンテナを再起動し、設定を反映させる
  * redmineコンテナを再起動：`docker-compose restart`

# 参考

* [(公式ドキュメント)Redmineのインストール](http://guide.redmine.jp/RedmineInstall/)
* [(公式ドキュメント)Redmineのアップグレード](https://redmine.jp/guide/RedmineUpgrade/)
* [(Qiita)Redmine＋PostgreSQLでのバックアップとリストア方法](https://qiita.com/tamaryoo/items/e067e9de1f12e54dbd60)
* [(Qiita)Redmine を Docker 公式イメージで運用する](https://qiita.com/bezeklik/items/b5c39136a8db23e2e81c)
* [(Qiita)PostgreSQLの基本的なコマンド](https://qiita.com/H-A-L/items/fe8cb0e0ee0041ff3ceb)
* [(Qiita)PostgreSQLのbackup, restore方法まとめ](https://qiita.com/rice_american/items/ceae28dad13c3977e3a8)
* [(Qiita)PostgreSQL ですべてのテーブルを削除する方法](https://qiita.com/a-suenami/items/e231adc2e083ef9449f6)
* [(Qiita)Docker for Mac で 日本語locale設定を含む PostgreSQL を構築](https://qiita.com/kisk_tech/items/eb142b2287779e0751ee#%E6%97%A5%E6%9C%AC%E8%AA%9Elocale%E3%82%92%E5%90%AB%E3%82%80docker-image%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E8%B5%B7%E5%8B%95)