【Mattermost Docker】ローカルでDiscordやSlackみたいなコミュニケーションツールサーバをたてる

## 背景
Discordに代わる、LAN内で完結できる通話アプリが欲しかったので。
外部に公開する予定はないので、ローカルIP & オレオレ証明書 で建てます。

## 動作環境
- Ubuntu 24.04.1 LTS
- Docker version 27.3.1

## 開放されるポート
- 80/tcp
- 443/tcp
- 8443/tcp
- 8443/udp

## デプロイ
### リポジトリ取得
ターミナルで `Mattermost` リポジトリをディレクトリ `./mattermost` にクローンし、ディレクトリに入る。
```
git clone https://github.com/mattermost/docker mattermost
cd mattermost
```

起動に必要なディレクトリを作成し、権限を変更する。
```
mkdir -p ./volumes/app/mattermost/{config,data,logs,plugins,client/plugins,bleve-indexes}
sudo chown -R 2000:2000 ./volumes/app/mattermost
```

### 環境設定ファイル変更
`.env` サンプルファイルをコピーする。
```
cp env.example .env
```

`.env` ファイルを修正する。
`MATTERMOST_IMAGE_TAG` に設定する値はそのままでもいいが、一応 [mattermost/mattermost-enterprise-edition Tags | Docker Hub](https://hub.docker.com/r/mattermost/mattermost-enterprise-edition/tags) から新しめの TAG を指定しておく。
```
vi .env
```
```.env
# ドメイン名をろーかるIPに変更
DOMAIN=mm.example.com
↓
DOMAIN=<サーバのローカルIPアドレス>

# タイムゾーンを JST(東京) に変更
TZ=UTC
↓
TZ=Asia/Tokyo

# Mattermost イメージのバージョンを変更
MATTERMOST_IMAGE_TAG=10.1.3
```

### オレオレ証明書作成
証明書を配置するディレクトリを作成する。
```
mkdir -p ./volumes/web/cert
```

秘密鍵を作成する。
```
openssl genrsa -out ./volumes/web/cert/key-no-password.pem 2048
```

CSRを作成する。
```
openssl req -new -key ./volumes/web/cert/key-no-password.pem -out ./volumes/web/cert/cert.csr

# 以下の質問に答える（オレオレ証明書なので基本適当でよい）
Country Name (2 letter code) [AU]:JP                         # 国名（一応日本を指定）
State or Province Name (full name) [Some-State]:             # 都道府県（空欄）
Locality Name (eg, city) []:                                 # 市町村（空欄）
Organization Name (eg, company) [Internet Widgits Pty Ltd]:  # 会社名（空欄）
Organizational Unit Name (eg, section) []:                   # 部署・部門名（空欄）
Common Name (e.g. server FQDN or YOUR name) []:<サーバのローカルIPアドレス>   # コモンネーム
Email Address []:                                            # メールアドレス（空欄）

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:                                     # パスワード（空欄）
An optional company name []:                                 # 会社の略称
```

上で作成した秘密鍵とCSRを使い証明書を発行する。
外部に公開しないので、有効期限は3650日とする。
```
openssl x509 -days 3650 -req -sha256 -signkey ./volumes/web/cert/key-no-password.pem -in ./volumes/web/cert/cert.csr -out ./volumes/web/cert/cert.pem
```

### 設定ファイル取得
設定ファイルを作成してもらうため、コンテナを立ち上げる。
`https` を使用するので、`nginx` 入りのコンテナを使用する。
```
sudo docker compose -f docker-compose.yml -f docker-compose.nginx.yml up -d
```

必要なファイルが作成されたので、一度コンテナを停止する。
```
sudo docker compose -f docker-compose.yml -f docker-compose.nginx.yml down
```

### 設定ファイル変更
`Mattermost` の設定ファイルを変更する。
```
sudo vi ./volumes/app/mattermost/config/config.json
```
```config.json
# 87行目 メール招待を無効にする
        "EnableEmailInvitations": true,
        ↓
        "EnableEmailInvitations": false,

# 256行目 メール通知を無効にする
        "SendEmailNotifications": true,
        ↓
        "SendEmailNotifications": false,

# 277行目 プレビューモードと表示されるバナーを無効にする
        "EnablePreviewModeBanner": true,
        ↓
        "EnablePreviewModeBanner": false,

# 278行目 サーバ証明書の検証をスキップする
        "SkipServerCertificateVerification": false,
        ↓
        "SkipServerCertificateVerification": true,

# 417, 418行目 デフォルトのロケールを日本に変更
        "DefaultServerLocale": "en",
        "DefaultClientLocale": "en",
        ↓
        "DefaultServerLocale": "ja",
        "DefaultClientLocale": "ja",
```

### コンテナ起動
コンテナを起動する
```
sudo docker compose -f docker-compose.yml -f docker-compose.nginx.yml up -d
```

## Mattermostサーバーの作成と参加
ブラウザから `https://<ローカルIPアドレス>` へアクセスすると、アカウントの作成と1個目のMattermostサーバの作成が促される。
（サーバ証明書の警告が出るが無視）

## あとがき
ローカル to ローカル だけで通話したいという状況は特殊だが需要はここにある。
Discordのノイズキャンセリングってかなり優秀だった。

## 参考
- [Deploy Mattermost via Docker - Mattermost documentation](https://docs.mattermost.com/install/install-docker.html)
- [GitHub - mattermost/docker: Install Mattermost server via Docker](https://github.com/mattermost/docker)
- [mattermost/mattermost-enterprise-edition Tags | Docker Hub](https://hub.docker.com/r/mattermost/mattermost-enterprise-edition/tags)