🐘

Mastodonのサーバをdockerで建てる

2023/03/10に公開

まえがき

2024/10/9 v4.3.0で改稿

環境

OS: Ubuntu 22.04.2 LTS x86_64

前提条件

docker composeが入っている。

下準備

バージョンはその都度確認してください

git clone https://github.com/mastodon/mastodon.git
cd mastodon
git fetch && git checkout v4.3.0
cp .env.production.sample .env.production
docker compose pull

docker-compose.yml

  db:
    restart: always
    image: postgres:14-alpine
    shm_size: 256mb
    networks:
      - internal_network
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'postgres']
    volumes:
      - ./postgres14:/var/lib/postgresql/data
    environment:
      - 'POSTGRES_HOST_AUTH_METHOD=trust'

となっているので、envrionmentの部分全てを消し、env_fileを.env.dbにして、
.env.dbを新規作成し、以下の内容を書きます

POSTGRES_USER=mastodon
POSTGRES_PASSWORD=passwd
POSTGRES_DB=mastodon_production

あと、portが他のものにかぶるようだったら変更します。
'POSTGRES_HOST_AUTH_METHOD=trust'をそのままにした場合、.env.dbでの設定は不要で、.env.productionのみ設定してください。

.env.production

続いて、.env.productionを変更していきます。以下をまず変更します。
DB_USER、DB_PASSともに.env.dbでpostgresの設定した場合はそちらと同じものを用いてください。

LOCAL_DOMAIN=mstdn.example.com
REDIS_HOST=redis
DB_HOST=db
DB_USER=mastodon
DB_PASS=passwd

また、ElasticSearchはいったんES_ENABLED=falseで無効化します。
そしたら、
docker run --rm tootsuite/mastodon bundle exec rake secretを2回行い、それぞれSECRET_KEY_BASEOTP_SECRETに入れます。
そして、docker run --rm --env-file ./.env.production tootsuite/mastodon bundle exec rake mastodon:webpush:generate_vapid_keyを行い、出力されたものに置き換えます。
あと、SMTPの設定をそれぞれ変えていきます(以下はsendgridの例)

SMTP_SERVER=smtp.sendgrid.net
SMTP_PORT=587
SMTP_LOGIN=apikey
SMTP_PASSWORD=generated_apikey
SMTP_FROM_ADDRESS=notifications@example.com
SMTP_AUTH_METHOD=plain
SMTP_ENABLE_STARTTLS_AUTO=true

今回はオブジェクトストレージは使いませんので、S3_ENABLED=falseにします。
R2を使う場合は、以下のサイトに例が載っています
https://developers.cloudflare.com/r2/examples/mastodon/

nginx

https://gist.github.com/TrillCyborg/84939cd4013ace9960031b803a0590c4#nginx-configuration
これを参考にして設定します

ElasticSearch

docker-compose.ymlのesに関する行をコメントアウトして、"network.host=0.0.0.0"environmentに追加します。
そして、env.prodctionのES_HOSTをesにしておきます。また、vm.max_map_count=262144/etc/sysctl.confに書き込みます。(これをしないと起動できません)
そしたら、docker compose run --rm web rails chewy:deployを行います

初期設定

docker-compose run --rm web bin/rails db:encryption:initで出てきたものを.env.productionにコピペしてください。

docker compose run --rm web bin/rails db:migrate 
docker compose run --rm web bin/rails assets:precompile 

これで、LOCAL_DOMAINにアクセスできれば終わりです!
メール認証が終わった後に、

sudo docker compose exec web bin/tootctl accounts modify user_id --role Admin

user_idをadminにすることができます。

あとがき

今回は、dockerを用いてmastodonを構築しました。個人的には、公式のdocker構築ドキュメントがないので少し戸惑いました。
誤った点があればご指摘ください。

Discussion