AWS EC2にDockerでRedmineを導入


## 実行情報
* Amazon Linux AMI (EC2) 新規立ち上げ
* `ec2-user` で実行

## Dockerとは？
簡単に言うと、コンテナ型の仮想環境のこと。
それぞれ独立したプロセスで環境が起動することで、各コンテナが干渉し合わない作りとなっている。

また、仮想環境と言われるだけあり仮想ネットワークI/Fが用意されておりコンテナごとにポートを設定できたりするのもメリット。

## docker-composeとは？
各Dockerコンテナをリンクさせるためのユーティリティである。
今回の場合は、RedmineコンテナとMySQLコンテナのそれぞれ独立したコンテナをリンクさせることで、Redmineで登録した情報をMySQLでデータを保存をできる仕組みに利用。


## 既存パッケージの最新化
新規で立ち上げたサーバーのため、デフォルトでAWS EC2にインストールされている各モジュールを最新化する。

```bash
$ sudo yum update -y
```


## Dockerインストール
```bash
$ sudo yum install -y docker
```

### Dockerサービス起動
Dockerのインストールが成功したら、Dockerサービスを起動しないと利用ができない。
そのため、Dockerサービスを起動する。

※ 以下コマンドは、起動だけではなく起動確認も含む。

```bash
$ sudo service docker start
$ sudo service docker status
$ sudo service docker info
```


## docker-compose導入(1.22.0)
docker-compose.ymlファイルに記載するversion3.5を利用したいため、2018/09/03時点最新バージョンを導入する。
インストールはrootユーザーで実施する。

```bash
$ sudo su
$ curl -L --fail https://github.com/docker/compose/releases/download/1.22.0/run.sh > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ exit
```

### ユーザーパス設定
.bash_profileのPATHに `/usr/local/bin` を追加してdocker-composeコマンドを利用できるように設定。

```bash
$ vi .bash_profile
$ source .bash_profile
```

## ec2-userにdockerグループの紐づけ
インストールした後に何も設定をせずにec2-userユーザーで`docker`コマンドや`docker-compose`コマンドを実行すると権限エラーが発生。

権限エラーを解消するためには、dockerグループにec2-userを紐づける必要がある。

```bash
$ sudo su
$ grep -i docker /etc/group
$ sudo gpasswd -a ec2-user docker
$ grep -i docker /etc/group
$ exit
```

## docker-compose.ymlファイルの作成
今回はRedmineとMySQLのDockerコンテナを作成するようなymlファイルを作成。
Redmineに登録する情報はUTF-8で登録するようにする。

また、Dockerを再起動したときにDBデータやRedmineデータがリセットされないようにコンテナ内で情報を保存せずに、AWS EC2サーバに保存するように設定。

```yml
version: '3.5'

services:
  redmine:
    image: redmine:passenger
    container_name: redmine
    ports:
      - 3000:3000
    environment:
      TZ: Asia/Tokyo
      REDMINE_DB_MYSQL: mysql
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_USERNAME: redmine
      REDMINE_DB_PASSWORD: redmine
      REDMINE_DB_ENCODING: utf8
    depends_on:
      - mysql
    restart: always
    volumes:
      - /var/www/redmine/files:/usr/src/redmine/files
      - /var/www/redmine/log:/usr/src/redmine/log
      - /var/www/redmine/plugins:/usr/src/redmine/plugins
      - /var/www/redmine/public/themes:/usr/src/redmine/public/themes

  mysql:
     image: mysql:5.7
     container_name: mysql
     restart: always
     environment:
       TZ: Asia/Tokyo
       MYSQL_ROOT_PASSWORD: devops
       MYSQL_DATABASE: redmine
       MYSQL_USER: redmine
       MYSQL_PASSWORD: redmine
     volumes:
       - mysql-data:/var/lib/mysql
     command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci

volumes:
  mysql-data:
    name: mysql-redmine
```

## Dockerコンテナの初期設定

## Dockerコンテナの起動
※ docker-compose.ymlファイルが配置されているディレクトリに移動する

```bash
$ docker-compose up -d
$ docker ps
```

### Remineコンテナ
```bash
$ docker exec redmine bundle exec rake redmine:load_default_data RAILS_ENV=production REDMINE_LANG=ja
```


### MySQLのConfigを設定する
※ mysql_config_editorはMySQL5.6以降で使用可能

```bash
$ docker exec -it mysql mysql_config_editor set --host=localhost  --user=redmine  --password
```

## AWS EC2ポート開放
docker-compose.ymlでポート3000番を指定したため、サーバのインバウンド3000番を許可する必要がある。

AWS EC2にアクセスして「セキュリティグループ」を選択。
以下の図のように3000番ポートを登録することで3000番ポートが外部から接続できるようになる。
![redmine_set1JPG.JPG](https://qiita-image-store.s3.amazonaws.com/0/248805/b4a6ea33-9199-8342-7576-6beb712ddaa7.jpeg)


## Redmineの起動
自分のPCでブラウザを立ち上げ、`http://[AWSグローバルアドレス]:3000` にアクセスするとRedmineが使えるようになる。
これで完成！！！！！
![redmineJPG.JPG](https://qiita-image-store.s3.amazonaws.com/0/248805/ba512960-3b60-33e2-36c2-ad530016e0d5.jpeg)

## pluginの導入
docker-compose.ymlで設定した `/var/www/redmine/plugins` ディレクトリに各種Redmineのpluginを配置するだけで導入が可能。

### gitの導入
pluginは主にGithubから取得するためgitが必要となってくる。
gitはEC2デフォルトにインストールされていないため個別でインストール。

```bash
$ sudo yum install -y git
```

### plugin(Gantt With Date Plugin)の導入
今回は試しにRedmineプラグインの1つ`Gantt With Date Plugin`を導入する。
`/var/www/redmine/plugins`はrootユーザでのみ配置できるためスイッチが必要。

plugin一覧は<a href="https://qiita.com/y_hokkey/items/7c02a3af319b353136d5" target="_blank">こちら</a>

```bash
$ cd /var/www/redmine/plugins
$ sudo su
$ git clone https://github.com/akiko-pusu/redmine_issue_templates.git
```

#### データベース更新
docker起動中に実行する。

```bash
$ docker exec redmine bundle exec rake redmine:plugins:migrate RAILS_ENV=production
```

#### コンテナの再起動
```bash
$ docker-compose down
$ docker-compose up -d
$ docker ps
```

## 補足
### ① Docker-Composeのバージョンアップ
以下コマンドの1.22.0をバージョンアップしたい数値に置き換えて実行することでバージョンアップが可能。

```bash
$ sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
$  docker-compose -v
```

### ② Dockerコンテナのデタッチ
`docker-compose up -d`コマンドをDockerコンテナをアタッチした後に、デタッチしたい場合は以下のコマンドを実行する。

```bash
$ docker-compose down
$ docker ps
```

### ③ Redmine Plugin

#### Absolute dates
https://github.com/suer/redmine_absolute_dates.git

#### Gantt with date
※ Redmine3.2以降は該当プラグインを導入しなくてもよい。
https://github.com/vividtone/redmine_gantt_with_date.git

#### Issue Templates
https://github.com/akiko-pusu/redmine_issue_templates.git

#### Backlogs
Backlogsの導入は少し工夫が必要となる。

https://github.com/backlogs/redmine_backlogs

##### Dockerfile作成
Docker公式のredmineにカスタマイズが必要となる。

```dockerfile
FROM redmine:passenger

RUN apt-get update && apt-get install -y --no-install-recommends \
      gcc \
      make \
      g++

RUN bundle install --without development test \
    && gem install holidays --version 1.0.3 \
    && gem install holidays

RUN export RAILS_ENV=production && bundle install --without development test
```

##### Dockerイメージをビルド
```bash
$ docker build ./ -t redmine_build
$ docker image
```

##### docker-composeファイルの編集
変更前

```yml
services:
  redmine:
    image: redmine:passenger
```

変更後

```yml
services:
  redmine:
    image: redmine_build:latest
```

##### 再起動
`docker ps` コマンドで表示されたIMAGE欄がredmine_buildであれば完了

```bash
$ docker-compose down
$ docker-compose up -d
$ docker ps
```

#### ④ Dockerイメージの削除
```bash
$ docker rmi [IMAGE ID]
```

関連するイメージファイル全てを削除する場合

```bash
$ docker rmi -f [IMAGE ID]
```