MastodonをGitpodで動かすためにやったこと
2022/11/05追記:新しく記事を書きました。Mastodon 3.4をGitpodで動かす際、この記事で書いたコマンドでは動かないと思うので新しい記事で紹介した.gitpod.ymlファイルで動かすか以下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"
連休中に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)"
無事インストールできましたが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
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
最後に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
インストールコマンド、スタートコマンドは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
覚書程度の文章となってしまいましたがこれにて。
Discussion