背景
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 から新しめの TAG を指定しておく。
vi .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
# 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のノイズキャンセリングってかなり優秀だった。