Docker GitLab(gitlab/gitlab-ce)のMattermostにGitLabアカウントでログインしたいのに上手くいかなかった話

## 事始め
元々はVM(VirtualBox + CentOS7.1)でGitLabを公開していたのですが、
VMの置き場が自分の管理下のマシンではなく扱いづらいのが我慢できなくなったため、
思い切って自身が使っているLinuxマシン上でDockerを利用してGitLabを建て直そうと言うことになりました。

その際、Mattermost先生にも今まで通り活躍していただこうと設定していたのですが、
GitLabアカウントでのログインが出来るようになるまでエラい時間がかかってしまいました。

ちなみに私はGitLabのバックアップはMattermostのバックアップも併せてやっていると思っていたので、
この記事を書いている時点ではまだMattermostの完全な移行は完了していません。
手順をそのままなぞってもMattermostは新品を使う羽目になりますので、
その点では全く参考になりません。

あと、記事を書いたおかげで気付けましたが、
gitlab-runnerの登録が死にました。
多分Tokenの値が変わっちゃったんでしょうね。
この点も上手く移行出来ないと使い勝手悪いので、
やり方がわかり次第追記することとしてこの記事は書き逃げます！

## 前提条件

- Linuxマシン(以下Dockerホストと呼称します)のOS
    - CentOS Linux release 7.4.1708 (Core)
- GitLabのバージョン
    - VM: [Omnibusパッケージ gitlab-ce-11.2.1](https://packages.gitlab.com/gitlab/gitlab-ce/packages/ol/7/gitlab-ce-11.2.1-ce.0.el7.x86_64.rpm)(10.2.1=>10.8.0=>10.8.5=>11.2.1と順にアップグレードしたもの)
    - Docker: [gitlab/gitlab-ce:11.2.1-ce.0](https://hub.docker.com/r/gitlab/gitlab-ce/tags/)
- その他
    - プロキシ環境下

## まずは手順
大まかに以下の内容で移行作業を行いました。

1. VMでGitLabのバックアップを取る。
2. Dockerホスト上でGitLabのDockerコンテナを建てる。
3. GitLabのデータをレストアする。
4. 設定ファイルを一部修正する。
5. MattermostにGitLabアカウントでログイン出来るようにする。 

## VMでGitLabのバックアップを取る
GitLabが用意しているバックアップコマンドを使います。

詳細を知るために公式サイトを確認しましょう。
[Backing up and restoring GitLab](https://docs.gitlab.com/ce/raketasks/backup_restore.html)


Omnibusパッケージでのバックアップ作業はこれだけです。

```
sudo gitlab-rake gitlab:backup:create
tar czf backup_etc_gitlab.tar.gz /etc/gitlab
```

簡単すぎて感謝しかない。。
あとは生成されたバックアップファイルを吸い出してください。
ちなみに一行目で生成されたファイルは`/var/opt/gitlab/backups`にあります。
私のときは`1535992280_2018_09_04_11.2.1_gitlab_backup.tar`というファイルが生成されました。

## Dockerホスト上でGitLabのDockerコンテナを建てる
元々使用していたGitLabと同じバージョンのコンテナを建てましょう。
今回は`gitlab-ce-11.2.1`が該当します。

まずはDockerイメージを`docker pull`します。
Dockerイメージのタグは[ここ](https://hub.docker.com/r/gitlab/gitlab-ce/tags/)から探してください。

```
sudo docker pull gitlab/gitlab-ce:11.2.1-ce.0
```

あとはもう`docker run`するだけとなりますが、
ここでまた公式サイトを確認しましょう。
[GitLab Docker images(run-the-image)](https://docs.gitlab.com/omnibus/docker/#run-the-image)

`hostname`だけ必ず変更が必要かと思います。
私はTCPポート22がsshdと衝突してダメだったので併せて変更しています。
また、後ほど使うMattermost先生のために追加で999を繋いでいます。
Dockerイメージのタグも適宜変更してください。

```
sudo docker run --detach \
    --hostname  ★任意のIP or ドメイン★\
    --publish 443:443 --publish 80:80 --publish 10022:22 --publish 999:999 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:11.2.1-ce.0
```

## GitLabのデータをレストアする
バックアップ時に生成されたファイルを用意してください。
上記の`docker run`を行っている場合はバックアップファイルを以下のディレクトリに置くとわかりやすいです。

```
1535992280_2018_09_04_11.2.1_gitlab_backup.tar
  => /srv/gitlab/data/backups

backup_etc_gitlab.tar.gz
  => /srv/gitlab/
```

ではレストアしていきます。
例によって公式サイトを確認しましょう。
バックアップファイルは上記の通り配置済みとします。
[Backing up and restoring GitLab (Restore for Omnibus installations)](https://docs.gitlab.com/ce/raketasks/backup_restore.html#restore-for-omnibus-installations)

```
sudo /srv/gitlab/config /srv/gitlab/config_bak
sudo tar xzf /srv/gitlab/backup_etc_gitlab.tar.gz -C /srv/gitlab/
sudo mv /srv/gitlab/gitlab /srv/gitlab/config
sudo docker exec -it gitlab /bin/bash

以下、dockerコンテナ内

gitlab-rake gitlab:backup:restore BACKUP=1535992280_2018_09_04_11.2.1
gitlab-ctl reconfigure
```

ここは後から考えると若干公式を無視していますね。。
手順は公式に従ってやった方が良いのでこれでもいけるのか程度にとどめてください。

## 設定ファイルを一部修正する
`/etc/gitlab/gitlab.rb(Dockerホスト上では/srv/gitlab/config/gitlab.rb)`を修正します。
元々の環境と変わるようなところだけなのでIPアドレスくらいの変更で良いです。
＃ 本当は良くないですが後述します。

ここまででGitLabはアクセス出来るようになっているはずです。
なっていない場合はファイアウォールなどの設定を確認してください。

## MattermostにGitLabアカウントでログイン出来るようにする
ようやく本題です。
先に答え(とりあえず動くようになった)の手順を書きます。

1. GitLabにrootでログインして`Admin Area > Applications`のMattermostの`Callback URL`を修正する。
2. Dockerコンテナ内で`chown -R mattermost:mattermost /opt/gitlab/emmbeded/service/mattermost`を実行する。
3. `/etc/gitlab/gitlab.rb`の`mattermost['gitlab_token_endpoint']`と`mattermost['gitlab_user_api_endpoint']`を修正する。

メモ上はこれで終わった形になっています。
再度試していないから本当に平気かはわからないので、
もしこのページを見て解決しようとして出来なかった場合は検証しますので是非コメントください。

### 手順１
ドメインではなくIPアドレスで運用していたのであれば、
VMからDockerホストに移住した関係で大体のケースでIPアドレスに変更があるはずです。
適宜変更してください。

### 手順２
`/opt/gitlab/emmbeded/service/mattermost`をmattermostユーザーが読み書き出来るようにします。
これを抜くと以下のようなエラーがログに残ります。

``` txt:/var/log/gitlab/mattermost/mattermost.log
{"level":"error","ts":1536110204.4357848,"caller":"app/plugin.go:545","msg":"Failed to start up plugins","error":"mkdir ./plugins: permission denied"}
```
ちなみにDockerホスト上では`/srv/gitlab/logs/mattermost/mattermost.log`にあります。
これが本当に問題あるのかどうかという点は手順を変えて確認しないとわかりませんが、
まぁディレクトリ作成に失敗して`error`だと言っているんだから対応しておくべきでしょう。

### 手順３
結局のところ詰まっていたのはここです。
私の環境ではこの設定をやらないとtokenの取得が出来ませんでした。

こんな感じ
![mattermost_token_error.png](https://qiita-image-store.s3.amazonaws.com/0/136003/4ed4e8e0-dda9-3165-4010-889ba9d8135b.png)

```
sudo docker exec -it gitlab /bin/bash

以下、Dockerコンテナ内

apt-get update
apt-get install -y iproute2
ip address
```

これでDockerコンテナ内での自身のIPアドレスがわかります。
私の場合は`172.18.0.2`でした。
このIPアドレスは要はGitLabのIPアドレスとして使いたいのですが、
多分こんなことをしているのはプロキシ環境下だからなのだと思います。
通常はDockerホストのIPアドレスを入れればイコールGitLabのIPアドレスになるのではないかと思います。

そんなわけで変更した結果は以下の通りです。

```
mattermost['gitlab_token_endpoint'] = "http://172.18.0.2/oauth/token"
mattermost['gitlab_user_api_endpoint'] = "http://172.18.0.2/api/v4/user"
```

## さいごに
あまりに苦戦したのでその時間を何かに昇華したくて本記事を書きました。
同じく苦戦している人が読んでその問題が解決出来たらそれはとても嬉しいなって、そう思います。
疲れた！