🐘

MastodonをGitpodで動かすためにやったこと

2021/08/10に公開

2022/11/05追記:新しく記事を書きました。Mastodon 3.4をGitpodで動かす際、この記事で書いたコマンドでは動かないと思うので新しい記事で紹介した.gitpod.ymlファイルで動かすか以下Diffを参照してください。

https://zenn.dev/tkithrta/articles/2fc618991ee338

--- .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"

連休中にGitpod Mastodonを作りました。

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

常時稼働させることができず、またメールの送受信もできないためあくまで開発用として作ったものですが、完成するまで結構なエラーを踏んだのでまとめておきます。

多分Mastodon 3.4なら動きます。

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 LD_LIBRARY_PATH="$(brew --prefix protobuf)/lib:$LD_LIBRARY_PATH"
      export PKG_CONFIG_PATH="$(brew --prefix protobuf)/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
      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"
      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

以降すべて.gitpod.ymlのtasks:に関する解説です。

まずbundle installでcld3-rubyとidn-rubyにてエラーが発生しました。
cld3-rubyにはprotobufが必要で、今回Ubuntuのaptとは別にHomebrew(Linuxbrew)を使用しているため環境変数LD_LIBRARY_PATHとPKG_CONFIG_PATHにHomebrewのパスを通す必要があります。
またidn-rubyにはlibidnが必要で、同様に--with-idn-dirオプションでHomebrewのパスを通す必要があります。--localもあわせてつけると再起動した後再度bundle installした時にエラーが発生しなくなります。
またSidekiqにredisが必須なので同様にHomebrewで引っ張ってきて起動しておきます。

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"

redis-server --daemonize yes

bundle config --local build.idn-ruby --with-idn-dir="$(brew --prefix libidn)"

https://gist.github.com/nzws/3d877078b39db21e1c557b5776974c32
https://github.com/akihikodaki/cld3-ruby/issues/18
https://zenn.dev/noraworld/articles/installation-of-idn-ruby-on-macos
https://noknow.info/it/os/install_pkg_config_from_source

無事インストールできましたがsetupする前に.env.productionを作成しておく必要があるため、mastodon:setupで作成できるものを参考にして自動生成できるようにしました。

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

https://docs.joinmastodon.org/admin/setup/
https://docs.joinmastodon.org/admin/config/

mastodon:setupは入力箇所が多く自動化もできないため、db:setupとassets:precompileなど実際に行っているコマンドはそのまま行うことで自動化できるようにします。
ただこれだとmastodon:setupでできる@adminユーザーネームのアカウントを作成できないみたいなので、bin/tootctl accounts createでは別の名前にする必要があります。

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

https://qiita.com/suwa3/items/eb4fe8303b1b720737fa
https://github.com/mastodon/mastodon/issues/1355

最後にmastodon/.ruby-versionのバージョンをGitpodのRubyバージョンにあわせる必要があります。
このタイミングが結構難しくて、rvmは.ruby-versionのあるカレントディレクトリに移動した際自動的に処理を行ってしまうので、cd mastodonを行う前にやっておく必要があります。
またrvmのgemsetを行うディレクトリが存在しない場合正常に動かないケースもあったため早めにgemsetを行うディレクトリをmkdirしておきましょう。
/home/ディレクトリでbundle installを行ってしまうと最初は問題なく起動しますがGitpodを再起動した際gemが消えてしまうので、上記内容に気をつけてGitpodの仕様通り/workspaces/ディレクトリにbundle installされていることを確認できればOKです。

mkdir -p /workspace/.rvm

if [ -z "$GITTAG" ]; then export GITTAG=main; fi

git clone -b "$GITTAG" https://github.com/mastodon/mastodon.git
echo "$RUBY_VERSION" | cut -d- -f2 > mastodon/.ruby-version
cd mastodon

https://qiita.com/mitsuru793/items/3b0ce42e8130922c143d
https://rvm.io/workflow/projects

インストールコマンド、スタートコマンドはRubyやNode.js、RailsのチュートリアルとMastodonのsystemdテンプレートを参考にして書いています。

bundle install
yarn install

NODE_ENV=production BIND=0.0.0.0 PORT=8008 STREAMING_CLUSTER_NUM=1 node ./streaming

RAILS_ENV=production DB_POOL=5 bundle exec sidekiq -c 5

RAILS_ENV=production BIND=0.0.0.0 PORT=8080 RAILS_SERVE_STATIC_FILES=true bundle exec puma -C config/puma.rb

https://github.com/mastodon/mastodon/tree/main/dist
https://docs.joinmastodon.org/admin/install/

覚書程度の文章となってしまいましたがこれにて。

Discussion