Cent OS 9 で Mattermost / nginx の設定

先日…といってももう大分経ってしましましたが、Slackの無料版の制限がきつくなりましたね。
90日より前の投稿が locked in されて閲覧不能になってしまうのはかなり問題です。

何とか非技術系の利用者を含めて移住可能なOSSビジネスチャットツールがないか模索していた中で
Mattermost が候補になりました。

  • OSS版が存在し、セルフホストが可能
  • サーバスペックが許す限りデータや投稿の保存が可能
  • Slackライクな見た目
  • Windows / Linux / mac os / Android / iOS 用のクライアントアプリ完備

特に下2つはITツールの移行を嫌うユーザーが多い場合かなり重要です。
機能的には申し分ないのですが、そもそもセルフホストしてメンテナンスする手間がどれくらいかが
重要なので実際に設定してみました。

もし実際に使うならリバースプロキシの環境にしたり、おそらく同一サーバー上で GRAVを使った
メモサイトなども共存させたい気がするので nginxをはさむ設定にします。

Mattermost について

基本的な機能はほぼ slackと同じです。カンバン方式のタスク管理ボードなどの機能も使えます。
また投稿にcode blockのシンタックスハイライト付きのMarkdownやTeXも使えるのがよさそうです。
セルフポストした場合、基本的な機能(ポストやファイルの永久保存を含む)が無料で使えるのが一番の魅力です。

slackでメッセージ履歴への無制限アクセスを行う場合プロプランで ユーザー一人当たり 925円/月 となります。

Mattermostの場合は 月額1000円以下のVPSをレンタルして、自分でサービスを立ち上げてしまえば
ランニングコストとしてはサーバーレンタルの費用のみで、サーバースペックの許す範囲でユーザーも自由に増やせます。
また、自前のサーバで運用するため、部外秘の研究に関する投稿などを外部のサーバに記録しなくて済むということも
重要なポイントである気がします。

ただ、サーバーの設定やトラブル時には対応も基本的に自分でするということになり、その分の別種の負担が発生します。
これがどれだけ問題になるか、つまり設定難易度やソフトウェアの安定性、ログの見やすさなどが気になると思うので
今回試してみることにしました。

Step.0 SELinuxの無効化

色々トラブルになって疲れてしまうので…
Cent OS Stream 9 では昔ながらの SELINUX=disable が使えません。
起動時のカーネルオプションを変更する必要があります。

sudo grubby --update-kernel ALL --args selinux=0
sudo reboot

Step.1 データベースの設定

公式サイトには MySQL / PostgreSQL に対応しているとあるのですが、
MySQLの代わりに MariaDB を使用した場合、 Mattermost ver 7.4 + Mattermost Boards プラグイン
を有効にするとBoardsの機能が使えなかったのでご注意ください。

1-a MariaDBを使う場合

sudo dnf -y install mariadb-server

今回はデータ中に絵文字等のデータを含む可能性があります。
以下の設定を追加しておきます。

/etc/my.cnf.d/charset.cnfを新しく作成し

[mysqld]
character-set-server = utf8mb4

[client]
default-character-set = utf8mb4

保存して置きます。

ここまでの設定で mariadbを立ち上げることができます。

sudo systemctl enable --now mariadb
sudo firewall-cmd --add-service=mysql
sudo firewall-cmd --runtime-to-permanent

最後に初期設定が必要です。

sudo mysql_secure_installation

以下のように答えていけばOKです。

Switch to unix_socket authentication [Y/n] n
Change the root password? [Y/n] n
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

これでMariaDBが使用可能になりましたので

mysql -u root -p

で インタラクティブシェルに入り
mattermost用のデータベース(mattermost_db) と データベース用のユーザ(mm_user)を設定します。

CREATE DATABASE mattermost_db;
GRANT ALL PRIVILEGES ON mattermost_db.* TO mm_user@localhost IDENTIFIED BY 'データベース用パスワード';
FLUSH PRIVILEGES;
QUIT;

1-b PostgreSQL を使う場合

(こちらの手順は未検証です。)

sudo dnf -y install postgresql-server
sudo postgresql-setup --initdb
sudo systemctl enable --now postgresql
sudo firewall-cmd --add-service=postgresql
sudo firewall-cmd --runtime-to-permanent

PostgreSQLはデフォルトで localhostからのpeer認証のみが許可されているため、
データベース用のアカウントと同名のアカウントがシステムユーザにも存在している必要があります。
postgreはシステムユーザとして自動で追加済みです。

sudo useradd mm_user
sudo passwd mm_user
sudo -u postgres psql
CREATE DATABASE mattermost_db;
CREATE USER mm_user WITH PASSWORD 'mm_userデータベース用パスワード';
GRANT ALL PRIVILEGES ON DATABASE mattermost_db to mm_user;
\q

Step.3

まず Mattermostのデプロイページにて最新バージョンを確認します。
Binaryのタブにて、

最新版 ver 7.4.0 と分かりました。

cd ~
wget https://releases.mattermost.com/7.4.0/mattermost-7.4.0-linux-amd64.tar.gz
tar xvf mattermost-*.tar.gz
sudo mv mattermost /opt
sudo mkdir /opt/mattermost/data

次に mattermostを動作させる mattermost ユーザ/グループを追加します。

sudo useradd -d /opt/mattermost -U -M mattermost
# -d ホームディレクトリパス
# -U ユーザー名と同名のグループを作成
# -M ユーザーディレクトリを生成しない
sudo chown -R mattermost:mattermost /opt/mattermost
sudo chmod -R g+w /opt/mattermost

これで設置完了です。
mattermostの設定ファイルは /opt/mattermost/config/config.json なので設定します。
設定が必要なのは "SqlSettings": の

DriverName
DataSource

の2か所でデータベースを指定する部分です。
デフォルトでは postgreSQLの設定になっているため、MariaDBを使っている場合は

"DriverName": "mysql",
"DataSource": "mm_user:(mm_userパスワード)@tcp(localhost:3306)/mattermost_db?charset=utf8mb4,utf8\u0026readTimeout=30s\u0026writeTimeout=30s",

postgreSQLを使う場合は

"DriverName": "postgres",
"DataSource": "postgres://mm_user:(mm_userパスワード)@localhost:5432/mattermost_db?sslmode=disable&connect_timeout=30",

のように設定します。

自動起動用の systemedのunit fileを作成

/etc/systemd/system/mattermost.service として

[Unit]
Description=Mattermost
After=syslog.target network.target mariadb.service(postgresql.service) <- どちらか

[Service]
Type=notify
WorkingDirectory=/opt/mattermost
User=mattermost
ExecStart=/opt/mattermost/bin/mattermost
PIDFile=/var/run/mattermost.pid
TimeoutStartSec=3600
LimitNOFILE=49152

[Install]
WantedBy=multi-user.target

やっと起動できます。

sudo systemctl enable --now mattermost

これで一応 mattermostが利用可能になっているはずです。

nginxの設定

導入されていなければ…

sudo dnf install nginx
sudo systemctl enable --now nginx

/etc/nginx/conf.d/mattermost.conf に リバースプロキシの設定を追加します。
公式ドキュメントをほぼそのまま流用します。

upstream backend {
   server 127.0.0.1:8065;
   keepalive 32;
}

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mattermost_cache:10m max_size=3g inactive=120m use_temp_path=off;

server {
   listen 80;
   server_name    (サーバホスト名);

   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_pass http://backend;
   }

   location / {
       client_max_body_size 50M;
       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_cache mattermost_cache;
       proxy_cache_revalidate on;
       proxy_cache_min_uses 2;
       proxy_cache_use_stale timeout;
       proxy_cache_lock on;
       proxy_http_version 1.1;
       proxy_pass http://backend;
   }
}
sudo nginx -t

にて syntax is ok が表示されることを確認し

sudo systemctl restart nginx
sudo firewall-cmd --add-service={http,https} --permanent
sudo firewall-cmd --reload

とします。

初回起動


初回開いたときに管理者ユーザーの追加画面になるので作成します。

使えるようになりました!!

smtp連携

設置した Mattermostは自由にIDが追加できるようにすることもできますが
通常は招待制でユーザーを追加して内輪で使うことになると思います。

招待メールや通知メールなどには smtpの設定が必要です。

Postfixの設定が完了している場合は

SMTPの設定でローカルの Postfixから通知ができます。
相手からは 上記記事の設定の場合相手からはリレーしたサーバ(記事ではgmail)のアカウントから
メールが届いているように見えるのでこの方法を使う場合は専用の gmailアカウントを取った方が
いいと思います。

お疲れ様でした~。

コメントを追加する