【学習メモ】Mattermost4.9+MySQL5.7/8.0.11インストール

## 概要
Mattermost4.9+MySQL5.7をインストールしてみました。
ついでに8.0.11も試してみました。

手順は公式の[Installing Mattermost on RHEL 7.1](https://docs.mattermost.com/install/install-rhel-71.html#installing-mattermost-on-rhel-7-1)をなぞっています。

加えて、[Mattermostの日本語メッセージ全文検索対応まとめ(MySQL編)](https://qiita.com/terukizm/items/858bd63daa2c4dba7829#4-fulltext-index%E3%81%AE%E5%86%8D%E6%A7%8B%E7%AF%89)と、[MattermostでSlackのメール連携みたいなことがしたい](https://qiita.com/cocoon/items/16699f2aa4b319c6f0b0)を参考に取り入れました。

##環境
VMware Fusion 10.1.1上の
CentOS 7.4.1708
MySQL 5.7.22 / 8.0.11
nginx 1.12.2

## Mattermostのインストール
公式の手順通りに進めます。
### Update
```bash:
yum update
yum upgrade
```
### MySQL
#### MySQLのインストール
```bash:MySQLのインストール(5.7)
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
cd /usr/local/src ; wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm && \
yum localinstall mysql57-community-release-el7-9.noarch.rpm
yum install mysql-community-server
systemctl start mysqld.service
```

```bash:MySQLのインストール(8.0.11)
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
cd /usr/local/src ; wget  https://repo.mysql.com//mysql80-community-release-el7-1.noarch && \
yum localinstall mysql80-community-release-el7-1.noarch.rpm
yum install mysql-community-server
systemctl start mysqld.service
```

#### MySQLのパスワード取得と変更
デフォルトのパスワードを取得します。

```bash:MySQLのパスワード取得と変更
grep 'temporary password' /var/log/mysqld.log
?dTLtPylC0#a
```

標準ではパスワード作成時のチェックが厳しいので、パスワード作成時の検証プラグインを無効にします。

MySQL 5.7と8.0.11では異なります。

```bash:パスワード作成時の検証プラグインの無効化(5.7)
vim /etc/my.cnf

-------------
[mysqld]
validate-password=OFF
-------------

systemctl restart mysqld
```

```bash:パスワード作成時の検証プラグインの無効化(8.0.11)
vim /etc/my.cnf

-------------
[mysqld]
validate_password.check_user_name=OFF
validate_password.length=0
validate_password.mixed_case_count=0
validate_password.number_count=0
validate_password.policy=0
validate_password.special_char_count=0
-------------

systemctl restart mysqld
```
完全に無効化する場合はPLUGINのUninstallが必要です。

参考資料
[6.5.3.1 Password Validation Component Installation and Uninstallation(dev.mysql.com)](https://dev.mysql.com/doc/refman/8.0/en/validate-password-installation.html)



パスワードを変更します。

```bash:MySQL上のrootパスワードの削除
mysql -uroot -p
Password: ?dTLtPylC0#a

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '';
mysql> quit

systemctl enable mysqld
```

#### Mattermost用のカスタマイズ
Mattermost用のDBとユーザーを作成します。
パスワードも念のため設定します。

MySQL8.0.11では、デフォルトの認証形式がcaching_sha2_passwordになっています。
Mattermostでcaching_sha2_passwordに対応していなかったようなので、既存のmysql_native_passwordを使用します。

```bash:DBとmmuserの作成(5.7)
mysql -uroot

mysql> create user 'mmuser'@'%' identified by 'z@Nf95#L';
mysql> create database mattermost;
mysql> grant all privileges on mattermost.* to 'mmuser'@'%';
mysql> quit
```
```bash:DBとmmuserの作成(8.0.11)
mysql -uroot

mysql> create user 'mmuser'@'%' identified with mysql_native_password by 'z@Nf95#L';
mysql> create database mattermost;
mysql> grant all privileges on mattermost.* to 'mmuser'@'%';
mysql> quit
```
```mysql_native_password```無しで作ってしまった場合は、```mysql> drop user mmuser;```でユーザーを削除して作り直します。

```bash:ユーザーごとの認証を確認する
mysql> select user,host,plugin,authentication_string from mysql.user;                                                
+------------------+-----------+-----------------------+-------------------------------------------+                 
| user             | host      | plugin                | authentication_string                     |
+------------------+-----------+-----------------------+-------------------------------------------+
| mmuser           | %         | mysql_native_password | *914C0873C8148224CF267E2F9ADD0C6AEBA89978 |
| mysql.infoschema | localhost | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.session    | localhost | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys        | localhost | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| root             | localhost | caching_sha2_password |                                           |
+------------------+-----------+-----------------------+-------------------------------------------+
```


参考資料
[MySQL 8.0.4におけるデフォルト認証形式の変更(yoku0825.blogspot.jp)](https://yoku0825.blogspot.jp/2018/01/mysql-804.html)
[MySQL 8.0.4 : New Default Authentication Plugin : caching_sha2_password(mysqlserverteam.com)](https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/)


### Mattermost
#### Mattermostのインストール

```bash:Mattermostのインストール
wget https://releases.mattermost.com/4.9.1/mattermost-4.9.1-linux-amd64.tar.gz

tar xf mattermost-4.9.1-linux-amd64.tar.gz
mv mattermost /opt
mkdir /opt/mattermost/data

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

#### Mattermostのカスタマイズ
config.jsonファイルを編集します
password, localhost, mattermost tableの3か所を修正します。

```bash:/opt/mattermost/config/config.json
cd /opt/mattermost/config
cp config.json config.json.original

vim config.json
-----------------------
# diff config.json.original config.json
108c108
<         "DataSource": "mmuser:mostest@tcp(dockerhost:3306)/mattermost_test?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s",
---
>         "DataSource": "mmuser:z@Nf95#L@tcp(localhost:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s",
-----------------------
```

#### Mattermostの試験起動

```bash:Mattermostの試験起動
cd /opt/mattermost/bin
sudo -u mattermost ./platform
```

Server is listening on :8065 が見えたら、Ctrl+Cで終了します。
MySQL8.0.11でnative passwordを使用してユーザーを作成していないと、こんな認証失敗が表示されます。

```bash:認証失敗のエラー
[2018/05/08 13:08:08 JST] [INFO] Using config file at /opt/mattermost/config/config.json
[2018/05/08 13:08:08 JST] [INFO] Loaded system translations for 'en' from '/opt/mattermost/i18n/en.json'
[2018/05/08 13:08:08 JST] [INFO] Server is initializing...
[2018/05/08 13:08:08 JST] [INFO] Pinging SQL master database
[2018/05/08 13:08:08 JST] [EROR] Failed to ping DB retrying in 10 seconds err=this authentication plugin is not supported
```
mmuserをnative_passwordで作成し直せば改善します。


#### 起動スクリプトの作成
公式の手順に加えて、requiresをいくつか追加しています。

```bash:起動スクリプトの作成
vim /etc/systemd/system/mattermost.service

-------------------
[Unit]
Description=Mattermost
After=syslog.target network.target
Requires=network-online.target

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

[Install]
WantedBy=multi-user.target
-------------------
```
```bash:起動スクリプトの有効化と起動
chmod 664 /etc/systemd/system/mattermost.service
systemctl daemon-reload

systemctl enable mattermost
systemctl start mattermost
```

#### firewallの穴あけ
8065ポート、80ポート、443ポートを空けます。

```bash:firewallのポート開放
firewall-cmd --add-port=8065/tcp --zone=public --permanent
firewall-cmd --add-port=80/tcp --zone=public --permanent
firewall-cmd --add-port=443/tcp --zone=public --permanent
firewall-cmd --list-all --zone=public
firewall-cmd --reload
```

### Mattermostの設定
ブラウザからlocalhost:8065にアクセスします。

Nortifications>Emailを以下のように設定します。

gmailを利用した設定例になります。
GmailのSMTP認証で使うパスワードは、アプリケーション用パスワードでログインしないとうまく動作しませんでした。
Mattermost用にアプリケーションパスワードを事前に発行しておきます。

```bash:ブラウザ上からNortifications>Emailを設定する
Enable Email Notifications > true
Enable Email Batching      > false
Notification Display Name  > No-Reply
Notification From Address  > -----@gmail.com
Notification Footer Mailing Address > 空白
SMTP Server                > smtp.gmail.com
SMTP Server Port           > 587
Enable SMTP Authentication > true
SMTP Server Username       > -----@gmail.com
SMTP Server Password       > Application Password
COnnection Security        > STARTTLS
```

test connectionを押して No errorsと出ればOKです。

参考資料
[アプリ パスワードでログイン(support.google.com)](https://support.google.com/mail/answer/185833?hl=ja)

### nginx
#### nginxのインストール

```bash:nginxのインストール
yum install nginx
systemctl start nginx
systemctl enable nginx
```

#### nginx.confの編集
標準のlisten 80のserverディレクティブをコメントアウトします。

```bash:nginxポート80設定のコメントアウト
vim /etc/nginx/nginx.config

-------------
38 ##    server {
39 ##        listen       80 default_server;
40 ##        listen       [::]:80 default_server;
41 ##        server_name  _;
42 ##        root         /usr/share/nginx/html;
43 ##
44 ##        # Load configuration files for the default server block.
45 ##        include /etc/nginx/default.d/*.conf;
46 ##
47 ##        location / {
48 ##        }
49 ##
50 ##        error_page 404 /404.html;
51 ##            location = /40x.html {
52 ##        }
53 ##
54 ##        error_page 500 502 503 504 /50x.html;
55 ##            location = /50x.html {
56 ##        }
57 ##    }
-------------
```
#### 自己証明書の作成

```bash:自己証明書の作成
mkdir /opt/mattermost/ssl
cd /opt/mattermost/ssl

openssl genrsa 2048 > server.key
openssl req -new -key server.key > server.csr

(適当に)

openssl x509 -req -days 3650 -signkey server.key < server.csr > server.crt
ls /opt/mattermost/ssl
```

参考資料
[OpenSSL で SSL 自己証明書を発行する手順(weblabo.oscasierra.net)](https://weblabo.oscasierra.net/openssl-gencert-1/)

#### mattermost.confの作成
変更箇所
・backgroudをmattermostが動いているIPアドレスに変更
・listen 80のserver_nameをhost名に変更
・listen 80の通信を443へリダイレクト
・自己証明書の設定
・iconsの指定(メールで投稿する機能のため)

```bash:mattermost用のconfを作成
vim /etc/nginx/conf.d/mattermost.conf

-------------
upstream backend {
   server 192.168.122.96:8065;
}

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    192.168.122.96 mattermost7.localhost;
   return 301 https://$host$request_uri;
}

server {
   listen 443 ssl http2;
   server_name    mattermost7.localhost;
   ssl on;
   ssl_certificate /opt/mattermost/ssl/server.crt;
   ssl_certificate_key /opt/mattermost/ssl/server.key;
   ssl_session_timeout 5m;
   ssl_protocols TLSv1.2;
   ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
   ssl_prefer_server_ciphers on;
   ssl_session_cache shared:SSL:10m;


   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;
       proxy_read_timeout 600s;
       proxy_pass http://backend;
   }

   location / {
       proxy_http_version 1.1;
       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_pass http://backend;
   }

   location /icons {
       root /opt/mattermost ;
   }
}
-------------
```


#### nginxの再起動と動作確認

```bash:nginxの再起動と動作確認
nginx -t
systemctl restart nginx

 curl localhost
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.12.2</center>
</body>
</html>

curl https://mattermost7.localhost --insecure
<!DOCTYPE html> <html lang=en> <head> <meta http-equiv=Content-S (略)
```

https://無しでアクセスすると400 Bad Requestとなります。

httpsで 502 Bad Gatewayが出続けるときはSELinuxの設定を見直します。


### 全文検索の追加

[Mattermostの日本語メッセージ全文検索対応まとめ(MySQL編)(qiita.com/terukizm)](https://qiita.com/terukizm/items/858bd63daa2c4dba7829#4-fulltext-index%E3%81%AE%E5%86%8D%E6%A7%8B%E7%AF%89)を参考に、全文検索機能を入れます。

#### テーブルの修正
```bash:テーブルの修正
mysql mattermost -ummuser -p
z@Nf95#L

mysql> ALTER TABLE `Posts` DROP INDEX idx_posts_message_txt;
mysql> ALTER TABLE Posts ADD FULLTEXT INDEX idx_posts_message_txt (`Message`) WITH PARSER ngram COMMENT 'ngram index';
mysql> quit;
```

#### my.cnfの修正
/etc/my.cnfを編集します。
mysqlとmysqldにそれぞれ追加します。

```bash:my.cnfの修正(5.7)
vim /etc/my.cnf

##下記設定を追加

------------
[mysql]
default-character-set = utf8mb4

[mysqld]
# setting for utf8mb4
character-set-server = utf8mb4
innodb_large_prefix = ON
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
------------

systemctl restart mysqld
```
```bash:my.cnfの修正(8.0.11)
vim /etc/my.cnf

##下記設定を追加

------------
[mysql]
default-character-set = utf8mb4

[mysqld]
# setting for utf8mb4
character-set-server = utf8mb4
innodb_large_prefix = ON
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
------------

systemctl restart mysqld
```

### メール連携の追加

[MattermostでSlackのメール連携みたいなことがしたい(qitia.com/cocoon)](https://qiita.com/cocoon/items/16699f2aa4b319c6f0b0)を参考に入れます。

#### CPANのインストール
```bash:CPANのインストール
yum install cpan
cpan -h
#[ENTER]連打
cpan -i Email::MIME JSON
```
4, 5分かかります。

#### postfixの修正
myhostnameを書き換えます。

```bash:postfixの設定修正
vim /etc/postfix/main.cf

# 77行目あたりを修正

----------
myhostname = mattermost7.localhost
----------

# ファイル末尾に追加
----------
recipient_delimiter = +
transport_destination_recipient_limit = 1
----------
```

#### aliasの修正

```bash:MailAliasの修正と反映
vim /etc/aliases
-----
support:        postmaster
bot: "| /opt/emailbot/mail2channel"
-----

newaliases

```

#### mail2channelの作成


```bash:mail2channelの作成
mkdir /opt/emailbot
touch /opt/emailbot/mail2channel
chmod +x /opt/emailbot/mail2channel
```

元記事のスクリプトをコピーします。
修正箇所は、```$curl```、```$hooks```、```$iconurl```の3か所です。
[メールを受け取ってwebhookにPOSTするスクリプト](https://qiita.com/cocoon/items/16699f2aa4b319c6f0b0#%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%81%A3%E3%81%A6webhook%E3%81%ABpost%E3%81%99%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88)

```bash:
diff mail2channel.original mail2channel
12,13c12,13
< my $curl     = '/usr/bin/curl -s --data-urlencode';
< my $hooks    = 'http://my.domain.name/hooks/';
---
> my $curl     = '/usr/bin/curl -s --insecure --data-urlencode';
> my $hooks    = 'https://mattermost8.localhost/hooks/';
15c15
< my $iconurl  = 'http://my.domain.name/icons/mail.png',
---
> my $iconurl  = 'https://mattermost7.localhost/icons/mail.png',
```


#### スクリプトの作成時の注意
- 自己証明書の場合、curlコマンドに```--insecure```を追加します。```'/usr/bin/curl -s --insecure --data-urlencode'```
- /opt/mattermost/iconにアイコン用のpngファイルを作成しておきます。

#### 送信テスト

webhook用のトークンを利用し、メールを送信し、投稿されるか確認します。

```bash:メール送信テスト
 echo "test " | mail -s " test mail " _your_token_@mattermost7.localhost
```

投稿されないときは、curlコマンドで投稿できるか確認します。

```bash:
curl -i -X POST --insecure --data-urlencode 'payload={"text": "Hello, this is some text\nThis is more text. :tada:"}' https://mattermost7.localhost/hooks/_your_token_
```
登録されていれば、メールのリレーに問題がありそうです。

正常に送信されていれば、```/var/log/maillog```に以下のようなログが残ります。

```bash:成功時の/var/log/maillog
May  8 03:47:51 mattemost7 postfix/local[15689]: 04DAD1076445: to=<bot+_your_token_@mattermost7.localhost>, relay=local, delay=0.58, delays=0.1/0.05/0/0.43, dsn=2.0.0, status=sent (delivered to command:  /opt/emailbot/mail2channel)
```


以上で終わりです。
``` firewall-cmd --remove-port=8065/tcp --zone=public --permanent ; firewall-cmd --reload```を実施したほうが良いでしょう。