Slack フリープランが改悪したので Mattermost をインストールしてみた
Mattermost
2022年9月1日から Slack のフリープランにおけるメッセージ履歴の制約が「1万件」から「過去90日間」に変更になるとアナウンスされました。[1]
Slack クローンの Mattermost はセルフホストが可能で、これを利用すれば制約を気にする必要がなくなります。
そこで、公式ドキュメントに基づいて Mattermost を RHEL クローンの Rocky Linux 8.6 にインストールする手順をまとめました。Slack からのデータ移行も記載しています。
環境
- VirtualBox 6.1.34 (2022-03-22) [2]
- Rocky Linux 8.6 (minimal) (2022-05-16) [3]
- MySQL Community Server 8.0.29 (2022-04-26) [4]
- Mattermost Server 7.1.1 (2022-07-15) [5]
インストール
Rocky Linux 8
「Rocky Linux 8 を VirtualBox に最小インストールする - Qiita」を参考に。
MySQL Server 8
MySQL Yum Repository の追加
dnf install https://repo.mysql.com/mysql80-community-release-el8.rpm
dnf module disable mysql
インストールと起動
dnf install mysql-server
systemctl --now enable mysqld
root パスワードの変更
DB_ROOT_PASSWORD=$(< /dev/urandom tr -dc 'A-HJ-NP-Za-km-z2-9!$%&()*+,-.:;<=>?[]^_{}~' | head -c 16; echo)
echo ${DB_ROOT_PASSWORD}
awk '/password/ {print $13}' /var/log/mysqld.log
mysql_secure_installation
ログに出力された初期パスワードを確認し、 mysql_secure_installation
コマンドで root パスワードの変更等のセキュリティ強化を行います。
データベースと DB ユーザーの作成
DB_USER_PASSWORD=$(< /dev/urandom tr -dc 'A-HJ-NP-Za-km-z2-9!$%&()*+,-.:;<=>?[]^_{}~' | head -c 16; echo)
echo ${DB_USER_PASSWORD}
mysqladmin --user=root --password create mattermost
mysql --user=root --password --execute="CREATE USER 'mmuser'@'localhost' IDENTIFIED BY '${DB_USER_PASSWORD}';"
mysql --user=root --password --execute="GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER ON mattermost.* TO 'mmuser'@'localhost';"
mysql --user=root --password
CREATE USER 'mmuser'@'localhost' IDENTIFIED BY '<DB_User_P@ssw0rd>';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER ON mattermost.* TO 'mmuser'@'localhost';
SELECT Host, User, plugin FROM mysql.user;
SHOW GRANTS FOR 'mmuser'@'localhost';
\q
mysql --user=mmuser --password mattermost
Mattermost Server
ダウンロード
RELEASE_NAME=$(curl -s https://api.github.com/repos/mattermost/mattermost-server/releases/latest | awk '/"name"/ {print $2}')
VERSION=${RELEASE_NAME:2:-2}
curl --location --remote-name https://releases.mattermost.com/${VERSION}/mattermost-${VERSION}-linux-amd64.tar.gz
dnf install tar
tar --extract --directory=/opt/ --file=mattermost-${VERSION}-linux-amd64.tar.gz
mkdir --verbose /opt/mattermost/data
useradd --system --user-group mattermost --comment 'Mattermost' --shell /sbin/nologin
chown --recursive mattermost:mattermost /opt/mattermost
chmod --recursive g+w /opt/mattermost
restorecon -Rv /opt/mattermost
設定の変更
cp --archive --verbose /opt/mattermost/config/config.json{,.org}
FQDN='192.168.56.100'
SITE_URL="http://${FQDN}/"
sed --in-place \
--expression='/DriverName/ s/postgres/mysql/' \
--expression='/"DataSource"/ s|postgres://||' \
--expression="/\"DataSource\"/ s/mostest/${DB_USER_PASSWORD}/" \
--expression='/"DataSource"/ s/localhost/tcp(localhost:3306)/' \
--expression='/"DataSource"/ s/mattermost_test/mattermost/' \
--expression='/"DataSource"/ s/sslmode=.*yes//' \
--expression='/"DataSource"/ s/\?"/\?charset=utf8mb4,utf8\&writeTimeout=30s"/' \
--expression="/\"SiteURL\"/ s|\"\"|\"${SITE_URL}\"|" \
/opt/mattermost/config/config.json
diff /opt/mattermost/config/config.json{.org,}
サービスの追加
systemctl edit --full --force mattermost.service
[Unit]
Description=Mattermost
After=syslog.target network.target mysqld.service
[Service]
Type=notify
WorkingDirectory=/opt/mattermost
User=mattermost
ExecStart=/opt/mattermost/bin/mattermost
PIDFile=/var/spool/mattermost/pid/master.pid
TimeoutStartSec=3600
KillMode=mixed
LimitNOFILE=49152
[Install]
WantedBy=multi-user.target
Mattermost の起動
systemctl --now enable mattermost
FirewallD
firewall-cmd --permanent --new-service=mattermost
firewall-cmd --permanent --service=mattermost --set-short='Mattermost Server'
firewall-cmd --permanent --service=mattermost --set-description='Mattermost is a Slack-like chat collaboration tool.'
firewall-cmd --permanent --service=mattermost --add-port=8065/tcp
firewall-cmd --permanent --add-service=mattermost
firewall-cmd --reload
firewall-cmd --list-services
ポートを開放したらブラウザからアクセスします。
Slack から Mattermost へのデータの移行
Slack データのエクスポート
- デスクトップの画面左上にあるワークスペース名をクリックします。
- メニューから「設定とその他管理項目」を選択し、「ワークスペースの設定」をクリックします。
- 「データのインポート/エクスポート」をクリックします。
- 「エクスポート」タブを選択します。
- 「日付範囲をエクスポートする」のドロップダウンメニューを開き、オプションを選択します。
- 「エクスポート開始」をクリックします。エクスポートファイルの準備ができるとメールが送付されます。
- 届いたメールに記載されている「ワークスペースのエクスポートページにアクセスする」をクリックします。
- 「ダウンロードを開始する」をクリックして zip ファイルにアクセスします。
<ワークスペース名> Slack export <開始年月日> - <終了年月日>.zip
というファイルがダウンロードされます。 - ファイル名にマルチバイトやスペースが含まれていてコンソールでの処理が面倒になるので、ファイル名を
slack-bulk-export.zip
などに変更しておきます。
データファイルの転送
scp slack-bulk-export.zip username@192.168.56.100:./
ローカル PC からサーバーにエクスポートデータを転送します。
Slack アプリの登録
- https://api.slack.com/apps にアクセスします。
- 「Create New App」ボタンを押下します。
- 「From scratch」を選択します。
- 「App Name」に「Slack Advanced Exporter」など任意の名前を入力し、「Pick a workspace to develop your app in:」でワークスペースを選択したら「Create App」ボタンを押下します。
- サイドバーから「OAuth & Permissions」を選択し、「Scopes」の「Bot Token Scopes」で「Add an OAuth Scope」ボタンを押下して
users:read
とusers:read.email
を追加します。 - 同じ「OAuth & Permissions」ページの「OAuth Tokens for Your Workspace」にある「Install to Workspace」ボタンを押下します。
- 「許可する」ボタンを押下します。
- 「OAuth Tokens for Your Workspace」の「Bot User OAuth Token」欄の値をコピーします。
Slack Advanced Exporter
SLACK_TOKEN=''
curl --location --remote-name https://github.com/grundleborg/slack-advanced-exporter/releases/download/v0.4.0/slack-advanced-exporter.linux-amd64.tar.gz
tar --extract --file=slack-advanced-exporter.linux-amd64.tar.gz
mv --verbose slack-advanced-exporter /usr/local/bin/
slack-advanced-exporter --input-archive slack-bulk-export.zip --output-archive export-with-emails.zip fetch-emails --api-token ${SLACK_TOKEN}
slack-advanced-exporter --input-archive export-with-emails.zip --output-archive export-with-emails-and-attachments.zip fetch-attachments
前段でコピーした「Bot User OAuth Token」欄の値を、変数 $SLACK_TOKEN
に代入します。
チームの作成
TEAM_NAME='mynewteam'
DISPLAY_NAME='My New Team'
MM_EMAIL='user@example.jp'
MM_USERNAME='userexample'
MM_PASSWORD=$(< /dev/urandom tr -dc 'A-HJ-NP-Za-km-z2-9!$%&()*+,-.:;<=>?[]^_{}~' | head -c 16; echo)
echo ${MM_PASSWORD}
ln --symbolic --verbose /opt/mattermost/bin/mmctl /usr/local/bin/
mmctl user create --email ${MM_EMAIL} --username ${MM_USERNAME} --password ${MM_PASSWORD} --system-admin
mmctl auth login http://${FQDN}:8065/
mmctl team create --name ${TEAM_NAME} --display-name ${DISPLAY_NAME}
インポート先のチーム(Slackで言うワークスペース)を作成します。
Connection name:
は空欄のままエンターを押下すれば大丈夫です。
Mattermost ETL (mmetl) のダウンロード
curl --location --remote-name https://github.com/mattermost/mmetl/releases/download/0.0.1/mmetl.linux-amd64.tar.gz
tar --extract --file=mmetl.linux-amd64.tar.gz
mv --verbose mmetl /usr/local/bin/
変換
mmetl transform slack --team ${TEAM_NAME} --file export-with-emails-and-attachments.zip --output mattermost_import.jsonl
dnf install zip
zip --recurse-paths mattermost-bulk-import.zip bulk-export-attachments mattermost_import.jsonl
インポート
mmctl import upload ./mattermost-bulk-import.zip
mmctl import list available
mmctl import process <IMPORT FILE NAME>
mmctl import job show <JOB ID> --json
ちなみに今回仮想環境で一度試した限りでは、以下の点が期待と異なりうまくいきませんでした。
- チャンネル名がランダムな文字列になってしまった(チャンネルの説明文などは正しく取り込まれている)
- 画像をインポートしたはずなのに表示されない
- 各ユーザーのメールアドレスが反映されない
-
"今回、フリープランの内容も変更し、ユーザーの皆さまが Slack のさまざまな新機能を試しやすくなります。いずれの変更も、2022 年 9 月 1 日から適用予定です。" "これまでフリープランでは、メッセージ数 10,000 件、ストレージ容量 5 GB という制限がありましたが、今後は過去 90 日間のメッセージ履歴とファイルストレージを無制限に利用できるため、チームはいつ上限に達するのか心配する必要はありません。" - Slack 初の料金改定とフリープランの内容変更のお知らせ | Slack ↩︎
-
"VirtualBox 6.1.34 (released March 22 2022)" - https://www.virtualbox.org/wiki/Changelog ↩︎
-
"MAY 16, 2022 Rocky Linux 8.6 Available Now" - Rocky Linux 8.6 Available Now | Rocky Linux ↩︎
-
MySQL :: MySQL 8.0 Release Notes :: Changes in MySQL 8.0.29 (2022-04-26, General Availability) ↩︎
-
"v7.1.1, released 2022-07-15" - Mattermost self-hosted changelog — Mattermost documentation ↩︎
Discussion