前提
この記事で紹介するやり方はあくまで仮の環境であり、実際に稼働させるには問題が多いので本番として運用したい方には役に立たない。
「Mastodonサーバを立ててみたい」という好奇心を満たすためだけに推奨される方法である。
環境
OS: Windows 10 Home 64bit バージョン 20H2
Docker: Docker desktop for Windows バージョン v20.10.5
WSL2用ディストリビューション: Ubuntu 18.04 LTS
ngrok: バージョン 2.3.38
Mastodon: バージョン v3.2.2
docker-compose.yml の編集
-
Mastodonのリポジトリから
docker-compose.yml
、.env.production.sample
をコピーしてくる。 -
環境変数設定ファイルである
.env.production.sample
を.env.production
にリネームする。 -
ローカルビルドはしないので、web、streaming、sidekiqから
build: .
の行をコメントアウトする。 また、image: tootsuite/mastodon:v3.2.2
のようにバージョンを固定しておく(実運用する場合は定期的に書き換えてバージョンアップ)。 -
DB、Redis、Mastodon各サービスのDockerイメージを取得する。
docker-compose pull
-
db
セクションのvolumes
以下に次の行を追加する。既存のhealthcheck
項目はコメントアウトする。YOUR_PASSWD
は任意のパスワードに変更すること。また、インデントをvolumes
とhealthcheck
をそろえるようにすること。docker-compose.ymlhealthcheck: test: ["CMD", "pg_isready", "-U", "mastodon", "-D", "mastodon_production"] environment: POSTGRES_USER: mastodon POSTGRES_DB: mastodon_production POSTGRES_PASSWORD: YOUR_PASSWORD
.env.production の編集
-
LOCAL_DOMAIN=mstdn.example.com
などの適当な値に変更する。 -
REDIS_HOST=redis
に変更する。 -
DB_HOST
とDB_PASS
の値をdocker-compose.yml
に合わせる。.env.productionDB_HOST=db DB_PASS=YOUR_PASSWORD
-
全文検索エンジンをOFFにする。
ES_ENABLED=false
-
セッション用と二要素認証用の2つのシークレット(文字列)を生成する。 標準出力にランダム文字列が吐き出されるのでコピーして各変数の値として張り付ける。
2つのコマンドは同じもので、出力だけが毎回異なる。シークレットの生成# SECRET_KEY_BASE 用 docker run --rm tootsuite/mastodon:v3.2.2 bundle exec rake secret # OTP_SECRET 用 docker run --rm tootsuite/mastodon:v3.2.2 bundle exec rake secret
-
Web Pushの公開鍵・秘密鍵を生成する。標準出力に.envの形式で吐き出されるのでコピーする。
公開鍵・秘密鍵の生成docker run --rm --env-file ./.env.production tootsuite/mastodon:v3.2.2 bundle exec rake mastodon:webpush:generate_vapid_key # 出力例 VAPID_PRIVATE_KEY=MxV1BSLJIAI2d4rJDGAOev-f18VpUrneQn0zCT_AEAI= VAPID_PUBLIC_KEY=BEbArD8WnodlZRpq0jCW_FWuz8gPXMnSmK2U5FjBEuLU4pLMcm-BBM-L8W0qGQIcvIU9ZsNrHOVSkPbAmVHqRCk=
-
メールアドレス検証・通知などに使うメールサーバ(SMTPサーバ)を設定する。
今回は自分のGoogleアカウントを使用する。 Googleアカウントの二段階認証が有効になっていることを確認し、 Googleアカウント設定からメールに使用するアプリパスワードを生成しておく。.env.productionSMTP_SERVER=smtp.gmail.com SMTP_PORT=587 SMTP_LOGIN=YOUR_NAME@gmail.com SMTP_PASSWORD=YOUR_APP_PASSWORD SMTP_FROM_ADDRESS=YOUR_NAME@gmail.com
-
オブジェクトストレージ接続機能はひとまず無効化しておく。
S3_ENABLED=false
コマンド実行
DBの初期化と静的ファイル生成
docker-compose run --rm web rails db:migrate
docker-compose run --rm web rails assets:precompile
# いったん終了
docker-compose down
# 永続化指定して起動
docker-compose up -d
db:migrate
でエラーが出て失敗するときは、一度docker-compose pull
コマンドを実行してからdb:migrate
しなおすとうまくいくことがある。
アカウントの作成
以下のコマンドで管理者アカウントを登録する。
この例ではhoge
ユーザを管理者として作成し、ログインメールアドレスはhoge@example.com
、パスワードはこのコマンドの出力結果となる。
docker-compose run --rm web bundle exec bin/tootctl accounts create hoge --email hoge@example.com --confirmed --role admin
ローカルのインスタンス(Mastodonサーバ)にアクセスできるようにする
このままではhttpsの暗号化設定ができておらず、しかもデフォルトでhttp
でのアクセスはhttps
にリダイレクトされてしまい、アクセスしてもエラー画面が表示されログインできない。
そこでngrok
コマンドを使う。Windows10の場合はここからダウンロードする。
以下のコマンドを実行し、起動しているローカルのMastodonへのURLを表示させる。このURLはngrokを停止するまで有効で、ngrokを起動しなおしたらURLが変わるようだ。
# 今dockerで起動しているMastodonの待ち受けポートが3000なので「http 3000」とする
ngrok http 3000
ngrokが表示しているhttps://
で始まるURLにアクセスするとローカルのDockerで立てたMastodonにログインできる。ただし、ログイン後数分はサーバとの通信が多すぎて429エラーが出てしまい、投稿に失敗する。(ngrokによる制限?)
初投稿はログイン後数分経ってからでないとできなかった。