能書き
私的サーバー構築日誌:仕切り直しからの自宅サーバー構築の続きです。
一度は諦めたリバースプロキシ下でのMattermostですが、ふとした拍子に公式の解説を発見しまして、それを元に追求してみました。この記事はその成果です。
ちなみに現在は、公式のリバースプロキシ設定そのままでは動きません。nginxの方で何やら仕様変更があった模様です。
目標
- MattermostサーバーをDockerで建てる
- リバースプロキシにMattermostの設定を追加
GitLabサーバーに同梱されているMattermostサーバーは、リバースプロキシと同時には利用できない模様ですので、諦めました。詳しくは後述します。
参考文献
MattermostをDockerでインストールする為の公式ドキュメントです。英語なので自動翻訳してどうぞ。
Mattermostをプロキシ越しに動かす為の公式ドキュメントです。こちらも英語です。
上記の通りにnginxでリバースプロキシを設定すると、2つの警告と1つのエラーが発生します。
- nginxを再起動するとエラーが出る nginx: [warn] the “listen … http2” directive is deprecated - Linuxサーバー備忘録
- nginx: [warn] the "http2_push_preload" directive is obsolete & the "listen ... http2" directive is deprecated #1445 - GitHub : 正直、よくわからんので、今回は単純にhttp2_push_preloadディレクティブを削除しました。
- nginx: [emerg] unknown “tls1_3_early_data” variable - icod.de Webentwicklung
ちなみに、GitLabに関しては記事を投稿済です。今回はこれの続きになります。
それからGitLabに同梱されているMattermostの有効化についても、以前、記事を投稿しています。今回これは諦めますので、一つの参考記事として。
GitLab同梱のMattermostはリバースプロキシとの相性が最悪
GitLab-EE Omnibus版に同梱されていて、有効にすればGitLabと連携してハッピーになれるMattermostですが。
有効にするには、まず、gitlab.rb
のmattermost_external_url
を設定する必要があります。
mattermost_external_url 'http://mattermost.example.com'
ところがですね。ここを http ではなくて https にすると、502 BadGateway エラーになってしまいます。恐らくは https の時に中で何か特別な処理をしようとするんじゃないかと疑ってます。例えばLet'sEncryptにアクセスして証明書を勝手に取ってこようとするとか。どうなんでしょうね。
ちなみにhttpのままにしておくと、GitLabとの連携が上手くいかなくなります。GitLab側のGUIでサインインした後にリダイレクトする際、そのリダイレクト先に上記mattermost_external_url
が使われるようですので、ここがきちんと正しく設定できないとリダイレクト先が無いというエラーになってしまいます。
と言う訳で、手詰まりです。どうしようもありません。私は諦めました。
DNS
まず最初にDNSを設定します。外からアクセス可能にする関係で、お金を出して買った独自ドメインを使用して下さい。ここでは仮にexample.comにしておきますが、このまま設定しないで下さい。
MY_DOMAIN=example.com
APPL_NAME=mattermost
APPL_PORT=8065
MATTERMOST_DOMAIN=$APPL_NAME.$MY_DOMAIN
そして外部のDNSにこれを設定し、家庭内ルーターのポートフォワードなども設定しておきます。この辺りの手順はそれぞれ異なりますので、各々のマニュアルなどを参照して下さい。
そして家庭内DNSです。Unboundで上記のドメインを設定します。
サーバーの家庭内でのIPアドレスは、私の環境では下記の通りです。
HOST_IPADDR=172.16.1.2
CNAMEの設定は面倒なようなので、Aレコードを設定します。
cd /etc/unbound/unbound.conf.d/
cat <<___ | sudo tee -a machines.list >/dev/null
local-data: "$MATTERMOST_DOMAIN. 3600000 IN A $HOST_IPADDR"
___
設定したら文法チェックして、Unboundに読み込みます。
unbound-checkconf
sudo systemctl restart unbound
そしてSubversion登録。
sudo svn st /etc
sudo svn st /etc | grep "^?" | cut -b9- | sudo xargs -I{} find {} -type f -or -type d -or -type l | sudo xargs -t svn add
sudo svn ci /etc -m"DNS setting for Mattermost"
Mattermost
Dockerで動かす
cd
git clone https://github.com/mattermost/docker docker-$APPL_NAME
cd docker-$APPL_NAME
cp env.example .env
ここで、PostgreSQLのmmuserユーザーのパスワードを決めます。
read -s MMPWD
そして.env
ファイルに必要な修正をします。まずは修正内容が正しいか確認。
sed -e"/^DOMAIN=/c DOMAIN=$MATTERMOST_DOMAIN" -e"/^TZ=/c TZ=JST" -e"/^POSTGRES_PASSWORD=/c POSTGRES_PASSWORD=$MMPWD" .env | diff .env -
確認できたら反映します。
sed -i -e"/^DOMAIN=/c DOMAIN=$MATTERMOST_DOMAIN" -e"/^TZ=/c TZ=JST" -e"/^POSTGRES_PASSWORD=/c POSTGRES_PASSWORD=$MMPWD" .env
引き続き参考文献通りに作業します。
mkdir -p ./volumes/app/mattermost/{config,data,logs,plugins,client/plugins,bleve-indexes}
sudo chown -R 2000:2000 ./volumes/app/mattermost
いよいよ起動。
docker compose -f docker-compose.yml -f docker-compose.without-nginx.yml up -d
起動確認。まずはHTTPレスポンスが成功を返している事をエイヤッと確認します。
curl -i http://$HOST_IPADDR:$APPL_PORT/ 2>/dev/null | head -n1 | diff -s - <(echo "HTTP/1.1 200 OK"$'\r')
Files - and /dev/fd/63 are identical
と表示されればOK。
次にブラウザで http://172.16.1.2:8065/ にアクセスします。
リダイレクトされて最初の画面が表示されればOK。
リバースプロキシ
最初の設定
以前、GitLab用にリバースプロキシを設定しました。この時のnginxを利用します。
cd
cd docker-proxy
cat <<___ >config/nginx/$APPL_NAME.conf
server {
listen 80;
server_name $MATTERMOST_DOMAIN;
server_tokens off;
location ^~ /.well-known/acme-challenge/ {
root /usr/share/nginx/html/ssl-proof;
}
location / {
proxy_pass http://$HOST_IPADDR:$APPL_PORT;
}
}
___
設定ファイルをチェック。
docker compose exec proxy nginx -t
問題無ければnginxに読み込みます。
docker compose exec proxy nginx -s reload
この段階でブラウザから http://mattermost.example.com/ を表示できます。リダイレクトされて、最初の画面が表示されます。
curlコマンドを使う場合は下記。
curl -i http://$MATTERMOST_DOMAIN/
Let's Encrypt 証明書を取得
Let's Encrypt で証明書を取得して設定します。その為に必要なnginxの設定は、前節で仕込み済みです。
cd
cd docker-proxy
docker compose exec proxy certbot certonly --register-unsafely-without-email --agree-tos --webroot -w /usr/share/nginx/html/ssl-proof -d $MATTERMOST_DOMAIN
Mattermostのリバースプロキシの設定です。エラーも対処済みです。
cat <<___ >config/nginx/$APPL_NAME.conf
upstream backend {
server $HOST_IPADDR:$APPL_PORT;
keepalive 32;
}
server {
listen 80;
server_name $MATTERMOST_DOMAIN;
server_tokens off;
location ^~ /.well-known/acme-challenge/ {
root /usr/share/nginx/html/ssl-proof;
}
location / {
return 301 https://\$server_name\$request_uri;
}
}
server {
listen 443 ssl;
http2 on;
server_name $MATTERMOST_DOMAIN;
ssl_certificate /etc/letsencrypt/live/$MATTERMOST_DOMAIN/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$MATTERMOST_DOMAIN/privkey.pem;
ssl_session_timeout 1d;
ssl_early_data on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:50m;
# HSTS (ngx_http_headers_module is required) (15768000 seconds = six months)
add_header Strict-Transport-Security max-age=15768000;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
add_header X-Early-Data \$ssl_early_data;
location ~ /api/v[0-9]+/(users/)?websocket$ {
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 50M;
proxy_set_header Host \$http_host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
client_body_timeout 60;
send_timeout 300;
lingering_timeout 5;
proxy_connect_timeout 90;
proxy_send_timeout 300;
proxy_read_timeout 90s;
proxy_http_version 1.1;
proxy_pass http://backend;
}
location / {
client_max_body_size 100M;
proxy_set_header Connection "";
proxy_set_header Host \$http_host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
proxy_read_timeout 600s;
proxy_http_version 1.1;
proxy_pass http://backend;
}
}
___
docker compose exec proxy nginx -t
docker compose exec proxy nginx -s reload
ブラウザで確認と設定
ここまで来たら、ブラウザでアクセスして、実際に試してみます。残念ながらLDAPしてないしGitLabも連携してないので、Mattermost独自ユーザーの登録からになります。
ブラウザで https://mattermost.example.com/ にアクセスすると最初の画面が表示されます。デスクトップアプリにするか、このままブラウザで表示するか、の選択ですね。好みに応じてどちらでもいいんですが、今回はブラウザを選択しましょう。
Let's get started 画面になります。最初は管理者アカウント作成から始めます。
以下、Mattermostの操作になりますので、そちらを調べてください。アカウントは2つ作成し、ちゃんとリアルタイムでチャットできる事を確認しましょう。
ただ、どうも上手くいきませんな。操作に関する記事を検索しても、バージョンが合わないせいか記述が不正確だし、いまいち頼りにならない。少し研究してみます。