お知らせ

現在サイトのリニューアル作業中のため、表示が崩れているページが存在することがあります。

Dockerを使ってMastodonの開発環境を作る

なんか昔はもっと楽だった気がするのだが、ドキュメントが更新されておらず、いつの間にか一筋縄でいかなくなっていたので頑張って調べた。

確認環境

VSCodeでDockerの中に入れる環境が一式あるものとする。

Env Ver
OS Ubuntu 24.04.3 LTS
VSCode 1.104.0
Docker version 28.1.1, build 4eba377
Docker Compose v2.35.1
Mastodonのバージョン v4.5.0-alpha.2
Mastodonのコミットハッシュ 06803422da3794538cd9cd5c7ccd61a0694ef921

手順

Mastodon本体の初期構築

  1. Mastodonのソースコードを取ってくる
    git clone https://github.com/mastodon/mastodon.git
    
  2. .devcontainer/compose.yamlを右クリックしてCompose Up
  3. devcontainer-appにAttach Shell
  4. 以下のコマンドを流し依存関係のインストールなどを行う
    bundle install
    IGNORE_ALREADY_SET_SECRETS=true
    

Node.js系の構築

デフォルトのYarnが古いので更新する

  1. Yarnが古いため、新方式を有効化する
    corepack enable
    
  2. package.jsonを開きpackageManagerの行を消す
  3. 最新版のyarnを入れる
    yarn set version stable
    
  4. package.jsonから消したpackageManagerの行を戻す

DB系の構築

  1. DBを作る
    rails db:setup
    
  2. 次のコマンドでユーザーを作る
    ./bin/tootctl accounts create hoge --email hoge@example.com --confirmed
    
  3. ユーザーの承認を行い、必要に応じてパスワードを使いやすいものに変更する
    rails console
    user = Account.find_by(username: 'hoge').user
    user.approve!
    # PW変更ここから
    user.password = 'password'
    user.skip_confirmation!
    # PW変更ここまで
    user.save!
    quit
    

フロントエンドのビルドとサーバー起動

bin/rails assets:precompile
bin/dev

トラブルシューティング

VSCodeがない場合、どうしたらdevcontainer-appにAttach Shellできるか?

execコマンドを使って入れる。以下の例ではzshを指定しているがbashでも行ける。

# 方法1
docker compose -f .devcontainer/compose.yaml exec app zsh

# 方法2
cd .devcontainer
docker compose exec app zsh

localhostではアクセスできるが、マシンのホスト名やhoge.testのようなローカルドメインでアクセスできない

.env.developmentALTERNATE_DOMAINS=hoge.testの行を追加することで他のドメインでもアクセスできる。

この設定があるとMastodonを別環境で動かしててリモートからドメインアクセスする場合に便利。

ActiveRecord::PendingMigrationErrorなど、ActiveRecord関係のエラーが出る

手順を見直し、コンテナの中でrails db:setupを叩くことで解決する。

Unable to load application: NameError: uninitialized constant LetterOpenerWebというエラーが出る

リポジトリルートにあるdocker-compose.ymlを使うと発生するので、.devcontainer/compose.yamlを使う事で解決する。

こっちのほうが楽かも(未検証)

DEVELOPMENT.md#dockerの手順が使えそうなので、これでもいいかも?面倒なので試してはいない。

docker compose -f .devcontainer/compose.yaml up -d
docker compose -f .devcontainer/compose.yaml exec app bin/setup
docker compose -f .devcontainer/compose.yaml exec app bin/dev

あとがき

検証用にバニラなMastodon環境が欲しくて作ってみたがえらい苦労した。取り敢えず本番環境を汚染せずDocker内に封じ込めた状態で作れたので満足している。

.devcontainer/welcome-message.txtに書いてある内容とだいぶ手順が違うのだが、恐らくドキュメントが更新されていない気がしているので、PRでも出してみようかな?

公式のドキュメントが極めて親切で手探りになったが、.devcontainer/welcome-message.txtの通りにやればエラーメッセージが全部教えてくれたため、最初からここを見ればよかった。