Mattermost使ってますか?
私が以前勤めており、今で契約という形で保守など諸々お手伝いしている地方企業で活用しており、
そもそも私が導入してしまった責任から保守を行っています。
MattermostがVer11くらいでMYSQLのサポート止めると公式発表していますので移管方法を模索しました。
そんな何度も何度もチャレンジしてようやく移管に辿り着いたフローを公開です。
そんなワケで私の環境。
目次
私の環境
環境は以下の通り
OS:ubuntu22.04
MYSQL:Ver 8.0.39
Mattermost:9.10.1
バージョンが違うとやる事変わる可能性あり。
ちなみに公式のフロー通りにやっても上手く行かなくて、色々参考にしたり、
AIに聞いたりで凄い大変でした。
そもそも PostgreSQL の知識が無さ過ぎてマジで分からなかった。
以下は参考にさせて頂いたサイト様。
Mattermostを『v7.8.0@MySQL』から『v8.1.2@PostgreSQL』に移行
公式:Migration guidelines from MySQL to PostgreSQL
ではフローを紹介。
以下に出てくる
<'mmuser'>と<'mmuser-password'>は置き換えて下さい。
Mattermost停止
# systemctl stop mattermost
PostgreSQLインスト
Ver14も何度も試したのですがどうしても上手く行かなかった。
スキーマの問題っぽいけど解決方法を分からんでした。
なのでpostgresql-15を選択です。
# apt install -y postgresql-common # /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh # apt update # apt -y install postgresql-15
SQLにDB作ったり色々
# sudo -u postgres psql postgres=# CREATE DATABASE mattermost; postgres=# CREATE USER <mmuser> WITH PASSWORD '<mmuser-password>'; postgres=# GRANT ALL ON DATABASE mattermost TO <mmuser>; postgres=# ALTER DATABASE mattermost OWNER TO <mmuser>; postgres=# GRANT USAGE, CREATE ON SCHEMA PUBLIC TO <mmuser>; postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to <mmuser>; postgres=# GRANT USAGE, CREATE ON SCHEMA PUBLIC TO <mmuser>; postgres=# ALTER DATABASE mattermost SET search_path TO public; postgres=# \q
そんで確認
# psql -h localhost -U <mmuser> -d mattermost
pg_hba.confの変更
//pg_hba.confを探す # find / -name pg_hba.conf 2> /dev/null //pg_hba.conf 変更 # nano /etc/postgresql/15/main/pg_hba.conf local all all trust ※peerをtrustに変更 host all all 127.0.0.1/32 trust ※scram-sha-256をtrustに変更 host all all ::1/128 trust ※scram-sha-256をtrustに変更 # systemctl reload postgresql
GOインスト
# sudo snap install go --classic //パスを通す # export PATH="$HOME/go/bin:$PATH"
ターゲットデータベースの準備
# go install github.com/mattermost/morph/cmd/morph@v1 # git clone -b release-9.10 https://github.com/mattermost/mattermost-server.git --depth=1 # morph apply up --driver postgres --dsn "postgres://<mmuser>:<mmuser-password>@localhost:5432/mattermost?sslmode=disable" --path ./mattermost-server/server/channels/db/migrations/postgres --number -1
migration-assistのインスト
# go install github.com/mattermost/migration-assist/cmd/migration-assist@latest
pgloaderインストール
pgloaderはソースから入れないとエラーしました。
MySQLバージョンが8じゃ無ければ、aptでも行けるのかも??
# git clone https://github.com/dimitri/pgloader.git # apt-get install sbcl unzip libsqlite3-dev make curl gawk freetds-dev libzip-dev # cd pgloader # make pgloader # cd ~
MySQL8だと以下の設定変更も必要
# nano /etc/mysql/mysql.conf.d/mysqld.cnf //以下を追加 default-authentication-plugin=mysql_native_password
# mysql -u root -p -h localhost mattermost mysql> ALTER USER '<mmuser>'@'localhost' IDENTIFIED WITH mysql_native_password BY '<mmuser-password>'; mysql> \q # systemctl restart mysql
migration-assistで準備
# migration-assist mysql "<mmuser>:<mmuser-password>@tcp(localhost:3306)/mattermost" 2024-08-08 06:30:52 pinging mysql... 2024-08-08 06:30:52 connected to mysql successfully... 2024-08-08 06:30:52 running checks for artifacts... 2024-08-08 06:30:52 4 checks been made, all good for artifacts 2024-08-08 06:30:52 running checks for unicode... 2024-08-08 06:30:53 11 checks been made, all good for unicode 2024-08-08 06:30:53 running checks for varchar... 2024-08-08 06:30:53 8 checks been made, all good for varchar 2024-08-08 06:30:53 running checks for varchar-extended... 2024-08-08 06:30:53 a fix is required for: linkmetadata.url 2024-08-08 06:30:53 12 checks been made, 1 fix(es) is required for varchar-extended
私はこんな感じで一番下に何か出たので再度オプション入れて実行
# migration-assist mysql "<mmuser>:<mmuser-password>@tcp(localhost:3306)/mattermost" --fix-varchar 2024-08-08 06:33:28 pinging mysql... 2024-08-08 06:33:28 connected to mysql successfully... 2024-08-08 06:33:28 running checks for artifacts... 2024-08-08 06:33:28 4 checks been made, all good for artifacts 2024-08-08 06:33:28 running checks for unicode... 2024-08-08 06:33:28 11 checks been made, all good for unicode 2024-08-08 06:33:28 running checks for varchar... 2024-08-08 06:33:28 8 checks been made, all good for varchar 2024-08-08 06:33:28 running checks for varchar-extended... 2024-08-08 06:33:28 a fix is required for: linkmetadata.url 2024-08-08 06:33:28 the fix query has been executed successfully. 2024-08-08 06:33:28 12 checks been made, all good for varchar-extended
# migration-assist pgloader --mysql="<mmuser>:<mmuser-password>@tcp(localhost:3306)/mattermost" --postgres="postgres://<mmuser>:<mmuser-password>@localhost:5432/mattermost" > migration.load 2024-08-10 14:39:22 pinging postgres... 2024-08-10 14:39:22 connected to postgres successfully.
これでpgloader用のファイルが出来るみたい。
移管作業
# ./pgloader/build/bin/pgloader migration.load > migration.log
心配な人はmigration.logを見る。
見るとそれはそれで心配になるけど。
データ比較
参考サイト様のスクリプトを丸っとコピーさせて頂きました。
マジ感謝。
# nano check_record_counts.sh #!/bin/bash # MySQLの接続情報 MYSQL_USER="<mmuser>" MYSQL_PASSWORD="<mmuser-password>" MYSQL_DATABASE="mattermost" # PostgreSQLの接続情報 PG_USER="<mmuser>" PG_PASSWORD="<mmuser-password>" PG_DATABASE="mattermost" # 差分をチェックするテーブルのリスト TABLES=("Status" "Audits" "Sessions" "Jobs" "Threads" "FileInfo") for table in "${TABLES[@]}"; do # PostgreSQLのテーブル名は小文字 pg_table=$(echo $table | tr '[:upper:]' '[:lower:]') # MySQLとPostgreSQLのそれぞれのテーブルのレコード数を取得 mysql_count=$(mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -D$MYSQL_DATABASE -Bse "SELECT COUNT(*) FROM $table;") pg_count=$(PGPASSWORD=$PG_PASSWORD psql -U $PG_USER -d $PG_DATABASE -t -c "SELECT COUNT(*) FROM public.$pg_table;") # 差分を表示 if [ "$mysql_count" -ne "$pg_count" ]; then echo "Table $table: MySQL has $mysql_count records, PostgreSQL has $pg_count records." else echo "Table $table: Record counts match ($mysql_count)." fi done
# chmod 755 check_record_counts.sh # ./check_record_counts.sh 2>/dev/null Table Status: Record counts match (54). Table Audits: Record counts match (20033). Table Sessions: Record counts match (65). Table Jobs: Record counts match (152026). Table Threads: Record counts match (810). Table FileInfo: Record counts match (6280).
マッチしてます。
boardsの移管
# migration-assist pgloader boards --mysql="<mmuser>:<mmuser-password>@tcp(localhost:3306)/mattermost" --postgres="postgres://<mmuser>:<mmuser-password>@localhost:5432/mattermost" > boards.load 2024-08-10 15:21:57 pinging postgres... 2024-08-10 15:21:57 connected to postgres successfully.
以下でpgloader実行
# ./pgloader/build/bin/pgloader boards.load > boards.log
config.json変更
mattermostの設定ファイルをPostgreSQLに向けます。
# nano /opt/mattermost/config/config.json //以下の部分を変える "DriverName": "postgres", "DataSource": "postgres://<mmuser>:<mmuser-password>@localhost:5432/mattermost?sslmode=disable",
起動確認
# systemctl start mattermost # systemctl status mattermost ● mattermost.service - Mattermost Loaded: loaded (/lib/systemd/system/mattermost.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2024-08-10 15:14:19 JST; 17min ago Main PID: 8724 (mattermost) Tasks: 52 (limit: 2309) Memory: 265.8M CPU: 15.500s CGroup: /system.slice/mattermost.service ├─8724 /opt/mattermost/bin/mattermost ├─8740 plugins/com.mattermost.plugin-channel-export/server/dist/plugin-linux-amd64 ├─8747 plugins/com.mattermost.apps/server/dist/plugin-linux-amd64 ├─8754 plugins/com.mattermost.calls/server/dist/plugin-linux-amd64 ├─8765 plugins/focalboard/server/dist/plugin-linux-amd64 └─8789 plugins/com.mattermost.nps/server/dist/plugin-linux-amd64
サービス変更
MySQLが紐付いてるので変えます。
# systemctl stop mattermost # nano /lib/systemd/system/mattermost.service [Unit] Description=Mattermost After=network.target After=postgresql.service BindsTo=postgresql.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=postgresql.service # systemctl daemon-reload # systemctl enable mattermost # systemctl start mattermost
MYSQL削除
# apt-get remove --purge mysql-server* mysql-common # rm -r /etc/mysql # rm -r /var/lib/mysql # reboot
ここまでで移管作業完了です。
playbooksは私の環境では使っていませんでしたので、そこは無しです。
以下はオマケ的な作業。
migration-assist と morph の削除
rm -r /root/go/pkg/mod/github.com/mattermost rm -r /root/go/bin/migration-assist rm -r /root/go/bin/morph
PostgreSQL のバックアップとリストア
仕事で使っているので万が一クラッシュして私が怒られるの嫌なので毎日定期バックアップをS3に送っています。
その際リストア出来ないとお話にならないのでやってみました。
バックアップ
pg_dump -Fc -h YOUR_HOST -U YOUR_USER -d YOUR_DBNAME > backup.dump
リストア
pg_restore --clean -h YOUR_HOST -p YOUR_PORT -U YOUR_USER -d YOUR_DBNAME backup.dump
これを実行してちゃんとリストア出来たのを確認しました。
これで安心。
まとめ
ワタクシ、とある地方企業のサーバー管理やWEBサイト管理&開発全般を専属契約で月25万、ボーナス無しで請け負っている底辺フリーエンジニアですので、
役に立ったら寄付とか、お仕事くれると凄く嬉しいです。
私営業出来ませんので・・・
ではでは