野良ビルドのARM用Mattermostを題材に、Docker Compose風運用をPodmanでする

Posted by 雅楽斎 on Sunday, October 22, 2023

TOC

昔も今もARM対応には消極的なMattermost

オープンソースのチャットツール(Slackみたいなやつ)として2大巨頭として挙げられる(個人の感想です)Rocket.chatとMattermostですが、以前Rocket.chatはsnap版で構築しましたが、実際にはその後バージョンアップに失敗し、全てを捨てました。snapはローカルファイルから反映させる方法をsnap内で決めないといけないような感じで、Docker/Podmanみたいにローカルファイル・ディレクトリをボリュームとしてマウントできるような自由度がないと取り回しが難しいなぁというのが現在のsnapへの認識です。ARMで構築できるという点ではやる価値はあったと思っていますが。

SlackクローンのRocket.ChatをRaspberry Pi 4で運用する

で、もう一方のMattermostはどうなっているのかというと開発はとても活発でamd64についてはDockerイメージも公開されている一方で、ARM対応は2016年から一貫してずっと消極的で、2023年10月現在もARM用のDockerイメージは公開されていません。

ELF: not found · Issue #387 · mattermost/mattermost-docker · GitHub

Raspberry Pi 4, Mattermost inside Docker? - Troubleshooting - Mattermost Discussion Forums

Compiling on ARM - Troubleshooting - Mattermost Discussion Forums

ARM用MattermostのDockerイメージを野良ビルドしている人を見つける

ARM(というよりRaspberry Pi)で動くようにMattermostをビルドする人はたまに見かけるものの、ARMのDockerイメージをビルドしている人はたまに思い立って検索した限りでは見つけられなかったのですが、ついに先日見つけたので今回Orange Pi 5で構築した次第です。

rheens/mattermost-app - Docker Image | Docker Hub

いうて野良ビルドなのでコードの品質やセキュリティについては注意深く見る必要があるのは言わずもがなですが、tagsを見る限りは数日内にupstreamに追従しているので、そこだけ見る限りは現時点ではそこまで品質を気にする必要はないのかなという気がします。

Mattermostのバージョン(今回はリリース済みの最新ESR)

Mattermostは開発が非常に活発で、数日ごとに何らかの新バージョンのビルドがリリースされますが、メジャーバージョン(ただしバージョン番号は小数第一位までを指す)は毎月15〜16日に最新版がリリースされます。

その中で、毎年1〜2月と7〜8月にリリースされるメジャーバージョンを他よりもサポートの長いESRとして9ヶ月間サポートするみたいです(他のバージョンは3ヶ月)

Release Lifecycle — Mattermost documentation

執筆時のサポート中のESRは7.8と8.1、最新バージョンは9.2です。で、ARM用MattermostのDockerイメージの野良ビルドを提供している人がリリースしているのは7.10.0、8.1.2、8.1.3、9.0.0、9.0.1、9.1.0なので、現在の最新ESRである8.1を提供してくれているので、今回は8.1.3を採用します。

淡々と作業

弊BlogでのPodmanシリーズとしては以下の続きです。環境はOrange Pi 5(RAM 16GB)でJoshua Riek氏のビルドしたUbuntu 22.04 Serverを使っています。

MediaWikiのバージョンアップとデータ移行とDocker Compose風管理をpodmanとsystemdでする

podman-composeで動かす

作業ディレクトリを作る

$ mkdir -p ~/podmancompose/mattermost
$ cd ~/podmancompose/mattermost/

docker-compose.ymlを作成

作業ベースは8.1のブランチから持ってきました。

https://github.com/remiheens/mattermost-docker-arm/blob/support-8.1/docker-compose.yml.local

最終形はこうなりました。

version: "3"

services:
  db:
    image: rheens/mattermost-db:v8.1.3
    restart: unless-stopped
    volumes:
      - /var/containers/mattermost_db/var/lib/postgresql/data:/var/lib/postgresql/data
      - /etc/localtime:/etc/localtime:ro
    environment:
      - POSTGRES_USER=mmuser
      - POSTGRES_PASSWORD=mmuser_password
      - POSTGRES_DB=mattermost
  app:
    image: rheens/mattermost-app:v8.1.3
    user: 1001:1002
    restart: unless-stopped
    ports:
      - '8065:8065'
    volumes:
      - /var/containers/mattermost_app/mattermost/config:/mattermost/config:rw
      - /var/containers/mattermost_app/mattermost/data:/mattermost/data:rw
      - /var/containers/mattermost_app/mattermost/logs:/mattermost/logs:rw
      - /var/containers/mattermost_app/mattermost/plugins:/mattermost/plugins:rw
      - /var/containers/mattermost_app/mattermost/client-plugins:/mattermost/client/plugins:rw
      - /etc/localtime:/etc/localtime:ro
    environment:
      - MM_USERNAME=mmuser
      - MM_PASSWORD=mmuser_password
      - MM_DBNAME=mattermost
      - MM_SQLSETTINGS_DATASOURCE=postgres://mmuser:mmuser_password@db:5432/mattermost?sslmode=disable&connect_timeout=10
      - MM_SERVICESETTINGS_SITEURL=http://192.168.1.212:8065/

元からの変更点は以下の通りです。

  • 環境変数を設定する
    • POSTGRES_USERとMM_USERNAMEを合わせる
    • POSTGRES_PASSWORDとMM_PASSWORDを合わせる
    • POSTGRES_DBとMM_DBNAMEを合わせる
    • MM_SQLSETTING_DATASOURCEはpostgres用にする
    • MM_SERVICESETTINGS_SITEURLは公開したいURLにする
  • マウントするボリュームをホストの/var/containers/以下に変更する
  • appにpodman-composeを実行するユーザーのuid:gid(1001:1002)を明記する
  • appに8065ポートを公開するのを明記する

ボリュームを共有するディレクトリを作成

rootユーザーで作業します。

# cd /var/containers/
# install -d -m 755 -o 166536 -g 166537 mattermost_db/var/lib/postgresql/data mattermost_app/mattermost/config mattermost_app/mattermost/data mattermost_app/mattermost/logs mattermost_app/mattermost/plugins mattermost_app/mattermost/client-plugins

installコマンドでディレクトリを作成すると作成した途中の親ディレクトリはownerを設定できない(実行ユーザーのrootになる)ので、一応同じディレクトリでownerとgroupを変更します。

# chown -R 166536:166537 mattermost_db mattermost_app

podman-composeでコンテナを起動する

docker-compose.ymlを作ったディレクトリでコンテナを起動します。

$ podman-compose up -d

ブラウザからMM_SERVICESETTINGS_SITEURLに設定したURLにアクセスします。

この画面が表示されれば成功です。

Systemdで管理する

Systemd管理用のユニットファイルを生成する

$ podman generate systemd --new --files --name mattermost_db_1 
/home/hogehoge/podmancompose/mattermost/container-mattermost_db_1.service
$ podman generate systemd --new --files --name mattermost_app_1
/home/hogehoge/podmancompose/mattermost/container-mattermost_app_1.service

それぞれの内容は次の内容になっています。

# container-mattermost_db_1.service
# autogenerated by Podman 3.4.4
# Sat Oct 21 00:04:16 JST 2023

[Unit]
Description=Podman container-mattermost_db_1.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=%t/containers

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=always
TimeoutStopSec=70
ExecStartPre=/bin/rm -f %t/%n.ctr-id
ExecStart=/usr/bin/podman run --cidfile=%t/%n.ctr-id --cgroups=no-conmon --rm --sdnotify=conmon --replace --name=mattermost_db_1 -d --label io.podman.compose.config-hash=b54ee70369f455986f8304b21d5f0b6f7289af081f6c77f238629c7ace1a7110 --label io.podman.compose.project=mattermost --label io.podman.compose.version=1.0.6 --label PODMAN_SYSTEMD_UNIT=podman-compose@mattermost.service --label com.docker.compose.project=mattermost --label com.docker.compose.project.working_dir=/home/hogehoge/podmancompose/mattermost --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=db -e POSTGRES_USER=mmuser -e POSTGRES_PASSWORD=mmuser_password -e POSTGRES_DB=mattermost -v /var/containers/mattermost_db/var/lib/postgresql/data:/var/lib/postgresql/data -v /etc/localtime:/etc/localtime:ro --net mattermost_default --network-alias db rheens/mattermost-db:v8.1.3
ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id
ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id
Type=notify
NotifyAccess=all

[Install]
WantedBy=default.target
# container-mattermost_app_1.service
# autogenerated by Podman 3.4.4
# Sat Oct 21 00:04:06 JST 2023

[Unit]
Description=Podman container-mattermost_app_1.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=%t/containers

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=always
TimeoutStopSec=70
ExecStartPre=/bin/rm -f %t/%n.ctr-id
ExecStart=/usr/bin/podman run --cidfile=%t/%n.ctr-id --cgroups=no-conmon --rm --sdnotify=conmon --replace --name=mattermost_app_1 -d --label io.podman.compose.config-hash=b54ee70369f455986f8304b21d5f0b6f7289af081f6c77f238629c7ace1a7110 --label io.podman.compose.project=mattermost --label io.podman.compose.version=1.0.6 --label PODMAN_SYSTEMD_UNIT=podman-compose@mattermost.service --label com.docker.compose.project=mattermost --label com.docker.compose.project.working_dir=/home/hogehoge/podmancompose/mattermost --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=app -e MM_USERNAME=mmuser -e MM_PASSWORD=mmuser_password -e MM_DBNAME=mattermost -e MM_SQLSETTINGS_DATASOURCE=postgres://mmuser:mmuser_password@db:5432/mattermost?sslmode=disable&connect_timeout=10 -e MM_SERVICESETTINGS_SITEURL=http://192.168.1.212:8065/ -v /var/containers/mattermost_app/mattermost/config:/mattermost/config:rw -v /var/containers/mattermost_app/mattermost/data:/mattermost/data:rw -v /var/containers/mattermost_app/mattermost/logs:/mattermost/logs:rw -v /var/containers/mattermost_app/mattermost/plugins:/mattermost/plugins:rw -v /var/containers/mattermost_app/mattermost/client-plugins:/mattermost/client/plugins:rw -v /etc/localtime:/etc/localtime:ro --net mattermost_default --network-alias app -p 8065:8065 -u 1001:1002 rheens/mattermost-app:v8.1.3
ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id
ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id
Type=notify
NotifyAccess=all

[Install]
WantedBy=default.target

今回は元のdocker.compose.ymlにlinksもdepends_onもなかったので依存はさせないまま進めます(dbを先に起動した方がいいような気がしないでもないですが)

Systemdで起動するようにするので現在起動しているpodmanコンテナを落とします。

$ podman-compose down

Systemdでコンテナを動かすようにする

自動生成したユニットファイルを登録します。

$ mv container-mattermost_db_1.service ~/.config/systemd/user/
$ systemctl --user enable container-mattermost_db_1.service 
Created symlink /home/hogehoge/.config/systemd/user/default.target.wants/container-mattermost_db_1.service → /home/hogehoge/.config/systemd/user/container-mattermost_db_1.service.
$ mv container-mattermost_app_1.service ~/.config/systemd/user/
$ systemctl --user enable container-mattermost_app_1.service 
Created symlink /home/hogehoge/.config/systemd/user/default.target.wants/container-mattermost_app_1.service → /home/hogehoge/.config/systemd/user/container-mattermost_app_1.service.

systemdからコンテナを起動します。

$ systemctl --user start container-mattermost_db_1.service
$ systemctl --user start container-mattermost_app_1.service

状態を確認します。

$ systemctl --user list-dependencies
default.target
● ├─container-mattermost_app_1.service
● ├─container-mattermost_db_1.service

もう一度ブラウザからMM_SERVICESETTINGS_SITEURLに設定したURLにアクセスし、Mattermostが表示されれば作業終了です。

Mattermost自体の使い方は他のサイトに譲ります。日本語化対応は完全に行われているので、表示言語を日本語にすることをおすすめします。

スポンサーリンク


comments powered by Disqus