Mattermostのシステムコンソール(GUI)で設定変更をしたいなら、GitLab 11ではgitlab.rbにMattermost設定をしてはいけない

## この記事を書いた背景

GitLabを10から11にアップデートしたら、Mattermostのシステムコンソール（Mattermost管理画面）で10では変更可能だったいくつかの設定が変更できなくなっていました（非活性になっていました）。
このことについて、いろいろ調べましたので記事に残すことにしました。

## 私が試した環境

- CentOS 7
- GitLab CE 11.0.2  
※Omnibus packageでインストール  
- Mattermost 4.10.1

## GitLab 10での仕様（前知識）

Mattermostには以下の３つの設定方法があります（すみません。私の知る限りはです。）

1. /etc/gitlab/gitlab.rb
2. システムコンソール（Mattermost管理画面）
3. /var/opt/gitlab/mattermost/config.json

**それぞれの役割**

- 3での設定が有効なMattermost設定となる。

- 2と3は連携している。どちらかを変えればお互いに即座に反映される。

- `gitlab-ctl reconfigure`を実行すると、1のMattermost設定を元に3が生成される。設定がないものはデフォルト値となって生成される。


**上記の仕様で注意しなければならないこと**

`gitlab-ctl reconfigure`は、GitLabアップデートなどでも自動で実行されます。
従って、2（つまり、3）だけでMattermost設定の変更をしていると、GitLabアップデートなどで設定がデフォルト値に戻ってしまいます。そのため、GitLab 10では設定を永続化するために1に変更したMattermost設定を手動で反映する必要があります。つまり、Mattermost設定が1, 3で二重管理になっていました。  ​

## GitLab 11での仕様（本題）

※Mattermostの設定方法が３つというのはGitLab 10と変わりません。

### 公式ドキュメントの説明

結局のところ公式ドキュメントにしっかりと書いてあります。アップデート前にちゃんと読んでおこうねって話・・・

#### 1. [GitLab Mattermost | GitLab](https://docs.gitlab.com/omnibus/gitlab-mattermost/README.html#with-gitlab-11-0) に以下のような記述があります。

> You can specify environment variables used to run Mattermost by changing the mattermost['env'] setting in gitlab.rb. Any settings configured in this way will be disabled from the System Console and cannot be changed without restarting Mattermost.

**つまり**

**gitlab.rbに設定されたMattermostの設定項目はシステムコンソールから変更が不可になります。**

少なくとも私は、`gitlab-ctl reconfigure`で設定がデフォルト値に戻らないようにgitlab.rbにMattermost設定をしていたのでこの事象に出くわしました。そしてこの記事を書いています。

#### 2. [GitLab Mattermost | GitLab](https://docs.gitlab.com/omnibus/gitlab-mattermost/README.html#upgrading-gitlab-mattermost-from-versions-prior-to-11-0) に以下の記述があります。

> To resolve this problem, gitlab.rb will include only the configuration necessary for GitLab<=>Mattermost integration in 11.0. GitLab will no longer generate the config.json file, instead passing limited configuration settings via environment variables.

**つまり**

**GitLab 11ではgitlab.rbからconfig.jsonを生成しなくなりました。**

ということは、`gitlab-ctl reconfigure`でデフォルト値に戻る仕様もなくなったわけです。

#### 3. [GitLab Mattermost | GitLab](https://docs.gitlab.com/omnibus/gitlab-mattermost/README.html#upgrading-gitlab-mattermost-from-versions-prior-to-11-0)の章の最後「Please note」に以下の記述があります。

> If a configuration setting is specified via both gitlab.rb (as env variable) and via config.json file, environment variable gets precedence.

**つまり**

**gitlab.rbとconfig.jsonファイルの両方でMattermostの設定がされている場合は、gitlab.rbの設定が優先されます。**

ということは、GitLab 10のときに行ったgitlab.rbに対するMattermostの変更設定は、GitLab 11にアップデートした後にそのままにしていても、設定はしっかり維持されるわけです。

### 実際に検証して分かったこと

ここまでは公式ドキュメントの引用でしかありません・・・。
幸い？、どうも公式ドキュメントに記載されたことだけでは説明がつかない仕様がある模様。

#### その１

gitlab.rbのMattermost設定が必要最小限（mattermost_external_urlのみ）でもシステムコンソールで変更不可（非活性）となる設定項目があるようです。

以下が該当項目です。

- 全般
  - 設定
      - サイトURL
      - 接続待ちアドレス
  - ログ
      - ログファイルの出力ディレクトリー
- 認証
  - GitLab
      - GitLabの認証を有効にする
      - アプリケーション ID
      - アプリケーションシークレットキー
      - GitLab Site URL
- ファイル
  - ストレージ
      - ローカルストレージディレクトリー
- 詳細
  - データベース
      - アーカイブされたデータの暗号化キー
  - 開発者
      - 信頼されていない内部接続を許可する


**つまり、GitLab 11では無条件でシステムコンソールからの変更が不可となった設定項目があるということです（少なくとも私が試したGitLab 11.0.2では）。**

#### その２

全ての項目を確かめたわけではないので、あくまで気付いたものだけですが、以下の設定項目は公式ドキュメントの説明と矛盾してました。

- 全般 -> ユーザーとチーム -> チーム毎の最大ユーザー数

gitlab.rbで設定していても変更可能（活性状態）です。ただし、システムコンソールで変更するとconfig.jsonに反映はされますが、システムコンソール上では変わりません（勝手にgitlab.rbでの設定値に戻ります）。また、`gitlab-ctl reconfigure`を行っても同様です。これはやはりgitlab.rbの設定が優先だからだと考えられます。ある意味、変更不可（非活性状態）と同じ（つまり公式ドキュメントの説明通り）とも考えられますが・・・。

- 詳細 -> 開発者 -> 信頼されていない内部接続を許可する

**その１**で記載した通り、gitlab.rbで設定していなくても常に非活性となる項目なのですが、さらに、gitlab.rbで設定しないとシステムコンソールには反映されませんでした（gitlab.rbに設定せず、config.jsonの設定値をデフォルトから変えても反映されませんでした）。これはなぞです。
この設定だけは必ずgitlab.rbに設定するしかないのかもしれません（少なくとも私が試したGitLab 11.0.2では）。

## 結論

GitLab 11で、システムコンソールから設定を変更できるようにしたいのであればgitlab.rbではなくconfig.jsonで設定しましょう（`gitlab-ctl reconfigure`でデフォルト値に戻ったりしないから）という仕様になったようです。そのおかげで、Mattermost設定をconfig.jsonだけで管理できるようになったわけです（ありがたい）。一部例外はありましたが（「**実際に検証して分かったこと**」を参照）。

もちろん、GitLab 11でもgitlab.rbで引き続き設定していてもいいと思います。システムコンソールからではなく、常にgitlab.rbからのみ変更したいという管理者もいるはずです。その運用もGitLab 11では実現できるようになったわけす。**でも、その場合は反映に`gitlab-ctl reconfigure`が必要なので注意してください。**