🌨️

【Fediverse】MastodonをGitpodで動かすためにやったこと【2022年冬】

2022/11/05に公開

TL;DR

  1. Ruby 2.7かRuby3.0が必要。
    Ruby 2.6は公式サポートが終了しており、現在のMastodonはRuby 3.1ともうすぐ公開されるRuby 3.2に対応していない。
    Gitpodは現在Ruby 3.1なのでRVMでバージョンを下げておく。
  2. Mastodon 3.5とMastodon 4.0ではcld3-rubyを使わなくなったため、Protocol Buffersに関するパッケージインストールが不要になりビルド時間とエラー発生率が減った。
    Mastodon 3.4.0~Mastodon 3.4.8では変わらずcld3-rubyを使うため、Protocol Buffersに関するパッケージインストールが必要になることがある。
    例えばMastodonのフォークであるFedibirdは現在Mastodon 3.4.1なので、Protocol Buffersの3系統をインストールする。
  3. Mastodon 4.0でtootctl accounts createコマンドを使う際--roleオプションで渡すロールは大文字で始まる。
    Mastodon 3.4とMastodon 3.5では--role adminにする。
    Mastodon 4.0では上記オプションでエラーが発生するので、--role Ownerにする。

Intro

1年程前に以下のような記事を書きました。

https://zenn.dev/tkithrta/articles/e6e5848cf675ce

少し前にこのGitpod Mastodonが動かなくなっていることに気づき、本日ようやく解決することができたのでまたまた覚書程度の文章を残しておきます。

本当は前回の記事を修正するかスクラップ記事を公開するだけにしようと思ったのですが社会情勢を鑑みて今回新たに記事を作成することにします。
そのため前回の記事で解説した部分は省きます。

公開当時はMastodon 3.4だったのですが、途中Mastodon 3.5が公開されましたし、もうすぐ公開されるMastodon 4.0のRC1が今回メインで動かせるようにしたバージョンなので、各バージョンを順次紹介していきたいと思います。
必要に応じて読み飛ばしてください。

前回と同じく.gitpod.ymlのtasks:をメインに解説します。

Mastodon 3.4

2021年3月9日からRC1が公開され、2021年3月17日に正式に公開されたバージョンです。

https://blog.joinmastodon.org/2021/02/developing-an-official-ios-app-for-mastodon/

ちょうどMastodon公式アプリがiOSとAndroidで公開された頃になります。

History

  • v3.4.0rc1 on May 9, 2021 d1442a0x
  • v3.4.0rc2 on May 11, 2021 7bd2b54
  • v3.4.0 on May 17, 2021 4c7efdb
  • v3.4.1 on Jun 3, 2021 d6486c9
  • v3.4.2 on Nov 6, 2021 8a74d85
  • v3.4.3 on Nov 6, 2021 4b66688
  • v3.4.4 on Nov 26, 2021 fd868f8
  • v3.4.5 on Feb 1, 2022 1c8c318
  • v3.4.6 on Feb 3, 2022 93a6c14
  • v3.4.7 on Mar 30, 2022 2a28247
  • v3.4.8 on May 27, 2022 d4ee7e8
  • v3.4.9 on Nov 15, 2022 ecd0cf1
  • v3.4.10 on Nov 15, 2022 4a5f458

Gitpod

.gitpod.yml全文
image: gitpod/workspace-postgres
tasks:
  - name: streaming
    before: gp sync-await before
    init: gp sync-await init
    command: |
      cd mastodon
      NODE_ENV=production BIND=0.0.0.0 PORT=8008 STREAMING_CLUSTER_NUM=1 node ./streaming
  - name: sidekiq
    before: |
      gp sync-await before
      export PATH="$(brew --prefix protobuf)@3/bin:$PATH"
      export LD_LIBRARY_PATH="$(brew --prefix protobuf)@3/lib:$LD_LIBRARY_PATH"
      export PKG_CONFIG_PATH="$(brew --prefix protobuf)@3/lib/pkgconfig:$PKG_CONFIG_PATH"
      redis-server --daemonize yes
    init: gp sync-await init
    command: |
      cd mastodon
      RAILS_ENV=production DB_POOL=5 bundle exec sidekiq -c 5
  - name: web
    before: |
      mkdir -p /workspace/.rvm
      rvm install 3.0.4
      brew install protobuf@3 libidn redis
      export PATH="$(brew --prefix protobuf)@3/bin:$PATH"
      export LD_LIBRARY_PATH="$(brew --prefix protobuf)@3/lib:$LD_LIBRARY_PATH"
      export PKG_CONFIG_PATH="$(brew --prefix protobuf)@3/lib/pkgconfig:$PKG_CONFIG_PATH"
      if [ -z "$GITTAG" ]; then export GITTAG=v3.4.8; fi
      gp sync-done before
    init: |
      git clone -b "$GITTAG" https://github.com/mastodon/mastodon.git
      echo "$RUBY_VERSION" | cut -d- -f2 > mastodon/.ruby-version
      cd mastodon
      git checkout "$GITTAG"
      bundle config --local build.idn-ruby --with-idn-dir="$(brew --prefix libidn)"
      bundle install
      yarn install
      echo "LOCAL_DOMAIN=$(gp url 8080 | cut -d/ -f3)" > .env.production
      cat ../.env.production.example >> .env.production
      echo "SECRET_KEY_BASE=$(RAILS_ENV=production bundle exec rake secret)" >> .env.production
      echo "OTP_SECRET=$(RAILS_ENV=production bundle exec rake secret)" >> .env.production
      RAILS_ENV=production bundle exec rake mastodon:webpush:generate_vapid_key >> .env.production
      RAILS_ENV=production rails db:setup
      RAILS_ENV=production rails assets:precompile
      RAILS_ENV=production bin/tootctl accounts create a --email "admin@$(gp url 8080 | cut -d/ -f3)" --confirmed --role admin
      echo "E-mail address: admin@$(gp url 8080 | cut -d/ -f3)"
      cd ..
      gp sync-done init
    command: |
      cd mastodon
      RAILS_ENV=production BIND=0.0.0.0 PORT=8080 RAILS_SERVE_STATIC_FILES=true bundle exec puma -C config/puma.rb
ports:
  - port: 8080
    visibility: public
    onOpen: open-preview
  - port: 8008
    onOpen: ignore
  - port: 5432
    onOpen: ignore
  - port: 6379
    onOpen: ignore
vscode:
  extensions:
    - mtxr.sqltools
    - mtxr.sqltools-driver-pg

https://github.com/mastodon/mastodon/blob/8ae0936ddd92eadb519c0440aae3961fcd820106/.ruby-version

まず現在のMastodonはRuby 2.7かRuby3.0が必要になります。
Ruby 2.6は公式サポートが終了しており、Ruby 3.1ともうすぐ公開されるRuby 3.2に対応していません。
Gitpodは現在Ruby 3.1だったため、RVMでバージョンを下げておきます。

https://github.com/akihikodaki/cld3-ruby

また、Mastodon 3.4.0~Mastodon 3.4.8ではcld3-rubyを使うため、Protocol Buffersに関するパッケージインストールが必要になります。

https://github.com/fedibird/mastodon

例えばMastodonのフォークであるFedibirdは現在Mastodon 3.4.1なので、Protocol Buffersの3系統をインストールします。
今回もUbuntuのaptとは別にHomebrew(Linuxbrew)を使用しているため環境変数LD_LIBRARY_PATHとPKG_CONFIG_PATHにHomebrewのパスを通す必要があるのですが、この際@3を指定する必要がある他、別途binのパスもPATHに追加する必要があります。

ただcld3-rubyの3.5.0からProtocol Buffersを使わなくなったそうなので、今後公開されるMastodon 3.4でcld3-rubyのバージョンが上がり、Protocol Buffersに関するパッケージインストールが不要になるかもしれません。

https://github.com/akihikodaki/cld3-ruby/releases/tag/v3.5.0

Diff

--- .3400.gitpod.yml	2022-11-05 09:55:00.000000000 +0000
+++ .3401.gitpod.yml	2022-11-05 09:55:00.000000000 +0000
@@ -12,2 +12,3 @@
-      export LD_LIBRARY_PATH="$(brew --prefix protobuf)/lib:$LD_LIBRARY_PATH"
-      export PKG_CONFIG_PATH="$(brew --prefix protobuf)/lib/pkgconfig:$PKG_CONFIG_PATH"
+      export PATH="$(brew --prefix protobuf)@3/bin:$PATH"
+      export LD_LIBRARY_PATH="$(brew --prefix protobuf)@3/lib:$LD_LIBRARY_PATH"
+      export PKG_CONFIG_PATH="$(brew --prefix protobuf)@3/lib/pkgconfig:$PKG_CONFIG_PATH"
@@ -22,3 +23,5 @@
-      brew install protobuf libidn redis
-      export LD_LIBRARY_PATH="$(brew --prefix protobuf)/lib:$LD_LIBRARY_PATH"
-      export PKG_CONFIG_PATH="$(brew --prefix protobuf)/lib/pkgconfig:$PKG_CONFIG_PATH"
+      rvm install 3.0.4
+      brew install protobuf@3 libidn redis
+      export PATH="$(brew --prefix protobuf)@3/bin:$PATH"
+      export LD_LIBRARY_PATH="$(brew --prefix protobuf)@3/lib:$LD_LIBRARY_PATH"
+      export PKG_CONFIG_PATH="$(brew --prefix protobuf)@3/lib/pkgconfig:$PKG_CONFIG_PATH"

Mastodon 3.5

2022年3月15日からRC1が公開され、2022年3月30日に正式に公開されたバージョンです。

https://blog.joinmastodon.org/2022/03/mastodon-3.5/

当時Twitterにはなかった投稿の編集機能が追加され話題を呼びました。

History

  • v3.5.0rc1 on Mar 15, 2022 4bdce2c
  • v3.5.0rc2 on Mar 26, 2022 07f8b4d
  • v3.5.0rc3 on Mar 26, 2022 d7d049a
  • v3.5.0 on Mar 30, 2022 8c7223f
  • v3.5.1 on Apr 9, 2022 ed5491e
  • v3.5.2 on May 4, 2022 0140659
  • v3.5.3 on May 27, 2022 fbcbf78
  • v3.5.4 on Nov 15, 2022 105ab82
  • v3.5.5 on Nov 15, 2022 696f7b3

Gitpod

.gitpod.yml全文
image: gitpod/workspace-postgres
tasks:
  - name: streaming
    before: gp sync-await before
    init: gp sync-await init
    command: |
      cd mastodon
      NODE_ENV=production BIND=0.0.0.0 PORT=8008 STREAMING_CLUSTER_NUM=1 node ./streaming
  - name: sidekiq
    before: |
      gp sync-await before
      redis-server --daemonize yes
    init: gp sync-await init
    command: |
      cd mastodon
      RAILS_ENV=production DB_POOL=5 bundle exec sidekiq -c 5
  - name: web
    before: |
      mkdir -p /workspace/.rvm
      rvm install 3.0.4
      brew install libidn redis
      if [ -z "$GITTAG" ]; then export GITTAG=v3.5.3; fi
      gp sync-done before
    init: |
      git clone -b "$GITTAG" https://github.com/mastodon/mastodon.git
      echo "$RUBY_VERSION" | cut -d- -f2 > mastodon/.ruby-version
      cd mastodon
      git checkout "$GITTAG"
      bundle config --local build.idn-ruby --with-idn-dir="$(brew --prefix libidn)"
      bundle install
      yarn install
      echo "LOCAL_DOMAIN=$(gp url 8080 | cut -d/ -f3)" > .env.production
      cat ../.env.production.example >> .env.production
      echo "SECRET_KEY_BASE=$(RAILS_ENV=production bundle exec rake secret)" >> .env.production
      echo "OTP_SECRET=$(RAILS_ENV=production bundle exec rake secret)" >> .env.production
      RAILS_ENV=production bundle exec rake mastodon:webpush:generate_vapid_key >> .env.production
      RAILS_ENV=production rails db:setup
      RAILS_ENV=production rails assets:precompile
      RAILS_ENV=production bin/tootctl accounts create a --email "admin@$(gp url 8080 | cut -d/ -f3)" --confirmed --role admin
      echo "E-mail address: admin@$(gp url 8080 | cut -d/ -f3)"
      cd ..
      gp sync-done init
    command: |
      cd mastodon
      RAILS_ENV=production BIND=0.0.0.0 PORT=8080 RAILS_SERVE_STATIC_FILES=true bundle exec puma -C config/puma.rb
ports:
  - port: 8080
    visibility: public
    onOpen: open-preview
  - port: 8008
    onOpen: ignore
  - port: 5432
    onOpen: ignore
  - port: 6379
    onOpen: ignore
vscode:
  extensions:
    - mtxr.sqltools
    - mtxr.sqltools-driver-pg

Mastodon 3.5と後述するMastodon 4.0ではcld3-rubyを使わなくなったため、Protocol Buffersに関するパッケージインストールが不要になります。

Mastodon 3.4と比較してビルド時間とエラー発生率が減りました。

Diff

--- .3401.gitpod.yml	2022-11-05 09:55:00.000000000 +0000
+++ .3500.gitpod.yml	2022-11-05 09:55:00.000000000 +0000
@@ -12,3 +11,0 @@
-      export PATH="$(brew --prefix protobuf)@3/bin:$PATH"
-      export LD_LIBRARY_PATH="$(brew --prefix protobuf)@3/lib:$LD_LIBRARY_PATH"
-      export PKG_CONFIG_PATH="$(brew --prefix protobuf)@3/lib/pkgconfig:$PKG_CONFIG_PATH"
@@ -24,4 +21 @@
-      brew install protobuf@3 libidn redis
-      export PATH="$(brew --prefix protobuf)@3/bin:$PATH"
-      export LD_LIBRARY_PATH="$(brew --prefix protobuf)@3/lib:$LD_LIBRARY_PATH"
-      export PKG_CONFIG_PATH="$(brew --prefix protobuf)@3/lib/pkgconfig:$PKG_CONFIG_PATH"
+      brew install libidn redis

Mastodon 4.0

2022年5月27日から5ヶ月ぶりの2022年10月26日にRC1に関する情報がコミットされました。

https://github.com/mastodon/mastodon/pull/19473

その後Changelogなど加筆修正され、2022年11月6日にGitタグが付与されました。

History

  • v4.0.0rc1 on Nov 6, 2022 58fc889
  • v4.0.0rc2 on Nov 6, 2022 5187e4e
  • v4.0.0rc3 on Nov 11, 2022 5e796dc
  • v4.0.0rc4 on Nov 14, 2022 75299a0
  • v4.0.0 on Nov 15, 2022 fb389bd
  • v4.0.1 on Nov 15, 2022 4415dd6
  • v4.0.2 on Nov 15, 2022 03b0f3a

Gitpod

.gitpod.yml全文
image: gitpod/workspace-postgres
tasks:
  - name: streaming
    before: gp sync-await before
    init: gp sync-await init
    command: |
      cd mastodon
      NODE_ENV=production BIND=0.0.0.0 PORT=8008 STREAMING_CLUSTER_NUM=1 node ./streaming
  - name: sidekiq
    before: |
      gp sync-await before
      redis-server --daemonize yes
    init: gp sync-await init
    command: |
      cd mastodon
      RAILS_ENV=production DB_POOL=5 bundle exec sidekiq -c 5
  - name: web
    before: |
      mkdir -p /workspace/.rvm
      rvm install 3.0.4
      brew install libidn redis
      if [ -z "$GITTAG" ]; then export GITTAG=main; fi
      gp sync-done before
    init: |
      git clone -b "$GITTAG" https://github.com/mastodon/mastodon.git
      echo "$RUBY_VERSION" | cut -d- -f2 > mastodon/.ruby-version
      cd mastodon
      git checkout "$GITTAG"
      bundle config --local build.idn-ruby --with-idn-dir="$(brew --prefix libidn)"
      bundle install
      yarn install
      echo "LOCAL_DOMAIN=$(gp url 8080 | cut -d/ -f3)" > .env.production
      cat ../.env.production.example >> .env.production
      echo "SECRET_KEY_BASE=$(RAILS_ENV=production bundle exec rake secret)" >> .env.production
      echo "OTP_SECRET=$(RAILS_ENV=production bundle exec rake secret)" >> .env.production
      RAILS_ENV=production bundle exec rake mastodon:webpush:generate_vapid_key >> .env.production
      RAILS_ENV=production rails db:setup
      RAILS_ENV=production rails assets:precompile
      RAILS_ENV=production bin/tootctl accounts create a --email "admin@$(gp url 8080 | cut -d/ -f3)" --confirmed --role Admin
      echo "E-mail address: admin@$(gp url 8080 | cut -d/ -f3)"
      cd ..
      gp sync-done init
    command: |
      cd mastodon
      RAILS_ENV=production BIND=0.0.0.0 PORT=8080 RAILS_SERVE_STATIC_FILES=true bundle exec puma -C config/puma.rb
ports:
  - port: 8080
    visibility: public
    onOpen: open-preview
  - port: 8008
    onOpen: ignore
  - port: 5432
    onOpen: ignore
  - port: 6379
    onOpen: ignore
vscode:
  extensions:
    - mtxr.sqltools
    - mtxr.sqltools-driver-pg

--role adminにしていた箇所でエラーが発生していたため、--role Ownerにしました。

つまりMastodon 4.0でtootctl accounts createコマンドを使う際--roleオプションで渡すロールは大文字で始まることに注意しなくてはなりません。

また、--role Adminでは全権限が付与されておらず、ユーザー設定のメニューにSidekiqとPgHeroが表示されなくなるので--role Ownerにする必要があります。
Owner > Admin > Moderatorと表現すれば分かりやすいでしょうか。

https://zenn.dev/yakumo/articles/ef592c345afc77

その他気をつける点としてはNode.js 14以上を要求するようになった点ぐらいでしょうか。
Mastodon 3.4とMastodon 3.5ではNode.js 12以上を要求されていたため、必要に応じてnvmでバージョンを上げておきましょう。

https://github.com/mastodon/mastodon/blob/8ae0936ddd92eadb519c0440aae3961fcd820106/package.json#L5

Diff

--- .3500.gitpod.yml	2022-11-05 09:55:00.000000000 +0000
+++ .4000.gitpod.yml	2022-11-05 09:55:00.000000000 +0000
@@ -40 +40 @@
-      RAILS_ENV=production bin/tootctl accounts create a --email "admin@$(gp url 8080 | cut -d/ -f3)" --confirmed --role admin
+      RAILS_ENV=production bin/tootctl accounts create a --email "admin@$(gp url 8080 | cut -d/ -f3)" --confirmed --role Owner

Changelog

Mastodon 4.0.0 RC1の項目は何度か修正しているので編集履歴を残しておきます。

  • 2022/11/06 --role Adminから--role Ownerに修正
  • 2022/11/06 Gitタグが付与されRC2も公開されたため追加
  • 2022/11/13 RC3が公開されたため追加してNode.jsのバージョンについて補足説明
  • 2023/02/19 Mastodon 4.1が公開されたので各バージョンを追加

Outro

今回は一応.gitpod.yml内で使用している.env.production.exampleも掲載しておきます

.env.production.example全文
SINGLE_USER_MODE=true
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=postgres
DB_USER=gitpod
DB_PASS=
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=
SMTP_DELIVERY_METHOD=file

GitHubやGitLabで新しくリポジトリを作り、.gitpod.ymlと.env.production.exampleをアップロードしてGitpodで立ち上げれば簡単にMastodonを立てることができるので、皆さんも試しにGitpodでMastodonを動かしてみてください。

https://gitlab.com/acefed/gitpod-mastodon

https://acefed.gitlab.io/gitpod-mastodon

ところで2022年冬っていつ頃なんでしょう。私はもう冬気分です。

Discussion