🐘

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

2021/08/10に公開約5,700字

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

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

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

image: gitpod/workspace-postgres
tasks:
  - name: web
    before: |
      mkdir -p /workspace/.rvm
      brew install libidn protobuf redis
      export LD_LIBRARY_PATH="$(brew --prefix protobuf)/lib:$LD_LIBRARY_PATH"
      export PKG_CONFIG_PATH="$(brew --prefix protobuf)/lib/pkgconfig:$PKG_CONFIG_PATH"
      gp sync-done before
    init: |
      git clone -b fedibird https://github.com/fedibird/mastodon.git
      echo $RUBY_VERSION | cut -d- -f2 > mastodon/.ruby-version
      cd mastodon
      git checkout fedibird
      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 "SMTP_FROM_ADDRESS='Mastodon <notifications@$(gp url 8080 | cut -d/ -f3)>" >> .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
      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
  - 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: streaming
    before: gp sync-await before
    init: gp sync-await init
    command: |
      cd mastodon
      BIND=0.0.0.0 PORT=8008 node ./streaming
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とidn-rubyにてエラーが発生しました。
cld3には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 libidn protobuf 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 "SMTP_FROM_ADDRESS='Mastodon <notifications@$(gp url 8080 | cut -d/ -f3)>" >> .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

git clone -b main 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

BIND=0.0.0.0 PORT=8008 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

ログインするとコメントできます