【Ubuntu】 Mattermost をインストール

この記事で解説すること:

Amazon Lightsail で Ubuntu のインスタンスを立ち上げ、そこに Mattermost をインストールします。

構成は、Nginx + MySQL です。

また、独自ドメインを適用し、Let's Encrypt で SSL化も行います。

以下については、別の記事にまとめます。

  • Slack から Mattermost へ データを移行

  • Mattermost を操作する mmctl コマンドについて (チャンネルの削除方法など)

サーバーの立ち上げ

インスタンスの立ち上げ

Amazon Lightsail を利用します。

Amazon Lightsail インスタンスを作成する | Lightsail ドキュメント

インスタンスを立ち上げる際の設定内容は以下です。

  • プラットフォーム:Linux / Unix

  • OSのみ:Ubuntu20.04 LTS

  • インスタンスプラン:$10 プラン
    ※ メモリが2GBないと、SSHの際に重くて固まったりするので…

  • SSHキーペア:デフォルトのまま

  • 自動スナップショットの有効化:未チェック

作成後、状態が「保留中」から「実行中」になるまで待ちます。

料金は、Amazon EC2 と違い、実行中・停止中に関係なく課金されます。

IPアドレスの固定

「ネットワーキング」タブから、静的IPアドレスを作成し、アタッチします。
料金は、アタッチしている間は無料です。

ファイアウォールの設定

同じく「ネットワーキング」タブから、セキュリティルールを追加します。

Mattermost のポートはデフォルトで :8065 なので、そのポートを開けておきます。
その他に、80番ポート (HTTP) と 443番ポート (HTTPS) も開けておきます。

SSH接続

「接続」タブから「SSHを使用して接続」で接続し、サーバー内にログインします。

他にもいくつか方法はありますが、このブラウザベースの接続が一番手軽で良いです。
以降の手順は、すべてサーバー内で作業します。

Mattermost の設定

以下の公式の手順に沿って行います。

Install Mattermost on Ubuntu 20.04 LTS — Mattermost documentation

下準備

最新のセキュリティパッチが適用されていることを確認します。

$ sudo apt update
$ sudo apt upgrade

// 紫の画面では「keep the local version currently installed」を選択

MySQL

以下の順に実行します。

まずはインストール

$ sudo apt install mysql-server

root ユーザーのパスワードを設定

$ sudo mysql
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'hogehoge';
mysql> exit

公式では最初に「sudo mysql_secure_installation」を実行していますが、この手順を踏んでおかないと以下のエラーが出ます。

Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the au
thentication method used doesn't store authentication data in the MySQL server. Please con
sider using ALTER USER instead if you want to change authentication parameters.

セキュリティ設定

$ sudo mysql_secure_installation  // 先程のパスワードでログイン

実行後、以下の質問だけ「No」で答えます

  • 「Would you like to setup VALIDATE PASSWORD component?」:No

  • 「Change the password for root ?」:No

ログイン

$ mysql -u root -p  // 先程のパスワードでログイン

ユーザー (mmuser) を作成

mysql> create user 'mmuser'@'%' identified by 'mmuserP@22w0rd';
mysql> show grants for 'mmuser'@'%';

DB作成

Mattermost のデータを保存するためのデータベースを作成します。

mysql> create database mattermost;

アクセス権限の付与

先ほど作成したユーザー (mmuser) が データベース (mattermost) にアクセスできるよう、権限を付与します。

mysql> grant all privileges on mattermost.* to 'mmuser'@'%';
mysql> show grants for 'mmuser'@'%';
mysql> exit

以上で、MySQL の設定は完了です。

Mattermost

次に、Mattermost をインストールしていきます。

ダウンロード

$ wget https://releases.mattermost.com/7.2.0/mattermost-7.2.0-linux-amd64.tar.gz

latest ver. はこちらから確認できます。

Deploy Your Self-Hosted Mattermost Server | Mattermost

解凍

$ tar -xvzf mattermost*.gz

/opt ディレクトリに移動させ、dataディレクトリを作成

$ sudo mv mattermost /opt
$ sudo mkdir /opt/mattermost/data

システムユーザー及びグループの作成

mattermost 実行用のシステムユーザー及びグループ を作成し、権限を付与します。

$ sudo useradd --system --user-group mattermost
$ sudo chown -R mattermost:mattermost /opt/mattermost
$ sudo chmod -R g+w /opt/mattermost

設定ファイルの編集

Mattermost の設定ファイル (config.json) について、必要な箇所を編集します。

$ sudo vim /opt/mattermost/config/config.json

編集内容は以下です。

"SiteURL" : "https://example.com"

※ {example.com} には、、Mattermost に紐付けたい独自ドメインを設定します。 

※ ドメインをHPなどで利用している場合は、サブドメインなどを作成して割り当てるのがオススメです。

※ また、独自ドメインの DNS の設定をしておきます。Aレコードの値には、インスタンスのパブリックIPを設定します。

"DriverName": "mysql"
"DataSource": "mmuser:<mmuser-password>@tcp(localhost:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s"

※ <mmuser-password>… 先ほどのMySQLで作成したユーザー (mmuser) に設定したパスワード

※ 公式では <host-name-or-IP> と書いてありますが、"tcp(インスタンスのパブリックIP:3306)" ) とすると 「Failed to ping DB」とエラーが出るため、localhost に設定しています。

"DefaultServerLocale": "ja"
"DefaultClientLocale": "ja"

Mattermost を起動できるか、一旦テスト

$ cd /opt/mattermost
$ sudo -u mattermost ./bin/mattermost

色々表示され、最後に「Server is listening on :8065」と表示されれば成功です。

systemd を使うため、systemd unit file を作成し、中身を設定

$ sudo vim /lib/systemd/system/mattermost.service

MySQLを使うので、公式を参考に 中身は以下のようにします。

[Unit]
Description=Mattermost
After=network.target
After=mysql.service
BindsTo=mysql.service

[Service]
Type=notify
ExecStart=/opt/mattermost/bin/mattermost
TimeoutStartSec=3600
KillMode=mixed
Restart=always
RestartSec=10
WorkingDirectory=/opt/mattermost
User=mattermost
Group=mattermost
LimitNOFILE=49152

[Install]
  WantedBy=mysql.service

systemd をロードし、ちゃんとロードされたか確認

$ sudo systemctl daemon-reload
$ sudo systemctl status mattermost.service

以下のように表示されれば成功です。

● mattermost.service - Mattermost
Loaded: loaded (/lib/systemd/system/mattermost.service; disabled; vendor preset: enabled)
Active: inactive (dead)

Mattermost を起動

$ sudo systemctl start mattermost.service

以下を実行し、Matterhost の HTML が返ってくれば成功です。

$ curl http://localhost:8065

最後に、マシン起動時に、Mattermost が起動するよう設定しておきます。

$ sudo systemctl enable mattermost.service

NGINX

次に、ウェブサーバーを設定します。

まずはインストール

$ sudo apt update
$ sudo apt install nginx
$ curl http://localhost  // 確認のため

設定ファイルを作成

$ sudo vim /etc/nginx/sites-available/mattermost

中身は以下のようにします

※ {IPアドレス} は、インスタンスのパブリックIP です。

※ {example.com} は、Mattermost に紐付けたい独自ドメインを設定します。

upstream backend {
    server {IPアドレス}: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 default_server;
    server_name {example.com};

    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;
    }
}

既存の設定ファイルを削除

新しい設定ファイル (/etc/nginx/sites-available/mattermost) を作成したので、既存のファイルは削除しておきます。

$ sudo rm /etc/nginx/sites-available/default

設定ファイルの有効化

先ほど作成した設定ファイル (/etc/nginx/sites-available/mattermost) のシンボリックリンクを /etc/nginx/sites-enabled/ に張り、Nginx を起動します。

$ sudo rm /etc/nginx/sites-enabled/default
$ sudo ln -s /etc/nginx/sites-available/mattermost /etc/nginx/sites-enabled/mattermost
$ sudo nginx -t
$ sudo systemctl start nginx
$ curl http://localhost

SSL

次に、Let's Encrypt を利用し、サイトを SSL (TLS) 化します

Let's Encrypt - フリーな SSL/TLS 証明書

Certbot をインストール

Let's Encrypt で証明書を発行するには、Certbot という ACME クライアントを利用するので、その準備をします。

$ sudo snap install core; sudo snap refresh core
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

--dry-run で 一旦テスト

証明書を発行する前に、DNSが適切に構成されているかテストしておきます。

$ sudo certbot certonly --dry-run
// 1: Nginx Web Server plugin (nginx) を選択

※ 必ず 80番ポート (HTTP) を開けておいてください。開いていないと、エラーでチャレンジに失敗します。

証明書を発行

$ sudo certbot
$ curl https://{example.com}  // 確認のため

SSLセキュリティ設定

最後に、Nginx の設定ファイルを再度編集し、SSLセキュリティ設定を強化しておきます。

$ sudo vim /etc/nginx/site-availables/mattermost

編集内容は以下です。新しく追加する部分をコメントアウトしてあります。

upstream backend {
   server {IPアドレス}: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 default_server;
   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_http_version 1.1;  # この一文を追加
       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;
   }

# ここから下をすべて追加
   listen 443 ssl http2; # managed by Certbot
   ssl_certificate /etc/letsencrypt/live/{ドメイン}/fullchain.pem; # managed by Certbot
   ssl_certificate_key /etc/letsencrypt/live/{ドメイン}/privkey.pem; # managed by Certbot
   # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

   ssl_session_timeout 1d;

   # Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
   ssl_protocols TLSv1.2 TLSv1.3;

   # Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
   # prevent replay attacks.
   #
   # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
   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-SHA;
   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;
}


server {
   if ($host = {example.com}) {  // 忘れずに編集
      return 301 https://$host$request_uri;
   } # managed by Certbot


   listen 80 default_server;
   server_name {example.com};   // 忘れずに編集
   return 404; # managed by Certbot

}

反映

書き換えが終わったら、設定を反映させます。

$ sudo rm /etc/nginx/sites-enabled/mattermost
$ sudo ln -s /etc/nginx/sites-available/mattermost /etc/nginx/sites-enabled/mattermost
$ sudo nginx -t
$ sudo systemctl restart nginx

以下を実行し、Matterhost の HTML が返ってくれば成功です。

$ curl https://{example.com}

証明書の確認は、以下のサイトでドメインを検索することでも確認できます。

SSL Server Test (Powered by Qualys SSL Labs)

ブラウザから https://{example.com} にアクセスした際、Nginxの初期ページが表示されたり、「この通信は保護されていません」と表示される場合は、再読み込みをしてください。キャッシュの問題である可能性があります。

以上で、Mattermost を立ち上げ & SSL化が完了しました。


今回は Amazon Lightsail のインスタンスを利用しましたが、同じ OS であれば、Amazon EC2 などでも問題ないかと思います。

別の記事では、

も書く予定なので、よろしければご覧ください。


普段は、以下のブログで記事を書いていますので、よろしければご覧ください。


いいなと思ったら応援しよう!