Docker Desktop for WindowsでMastodonを動かす

先行例を探すと2017年頃に流行った当時の古いバージョンの情報しか見つからなかったので、現行バージョンで試した記録を残しておく。

確認環境

  • Windows10 22H2 19045.2251
  • Docker Desktop for Windows v4.14.1
  • Git for Windows version 2.38.1.windows.1

手順

アクセス用ドメインの設定

HTTPSでのアクセスが必要なので、サーバー証明書用にドメイン名を決める必要がある。ここではmastodon.localhostとする。

LOCAL_HTTPSなどの環境変数が用意されていて元々はhttpでのアクセスも可能だったようだが、現状この環境変数にfalseを指定してもhttpではアクセスできない模様。恐らくActivityPubを利用するようになってからhttps専用になったのではないかと思われる。ただし更新履歴などを辿って確認したわけではないので何か方法はあるかもしれないが、現状見つけてはいないのでここではhttpsを使うようにする。

決めたらその名前でIPアドレスを得られるようにhostsファイルに記述する。これの書き換えには管理者権限が必要なので管理者権限で起動したコマンドラインからメモ帳を起動するなどして書き換える。

hostsファイルの場所は%Windir%\System32\drivers\etc\hosts

127.0.0.1       mastodon.localhost
::1             mastodon.localhost

リポジトリのcloneと必要なサブディレクトリの作成

まとめておきたいのでここではプロジェクト内にサブディレクトリを作成する。

最低限起動に必要なディレクトリはPostgreSQLRedis用のデータディレクトリだが、サーバー証明書の設定などのためにここではNginxをリバースプロキシとして利用するための設定も行う。

> git clone https://github.com/mastodon/mastodon.git
> cd mastodon
> mkdir postgres14
> mkdir redis
> mkdir nginx
> mkdir nginx/sites-enabled
> mkdir nginx/ssl

環境変数の定義

これは既に用意されているファイルを元に一部の記述を変更する。

> cp .env.production.sample .env.production

変更箇所と内容は以下の通り。

--- ./.env.production.sample
+++ ./.env.production
@@ -17 +17 @@
-LOCAL_DOMAIN=example.com
+LOCAL_DOMAIN=mastodon.localhost
@@ -21 +21 @@
-REDIS_HOST=localhost
+REDIS_HOST=redis
@@ -26,3 +26,3 @@
-DB_HOST=/var/run/postgresql
-DB_USER=mastodon
-DB_NAME=mastodon_production
+DB_HOST=db
+DB_USER=postgres
+DB_NAME=postgres

リバースプロキシの準備

用意されているdocker-compose.ymlservicesの最後へ追記する。

  reverse-proxy:
    image: nginx:latest
    volumes:
     - ./nginx/:/etc/nginx
     - ./nginx/sites-enabled:/etc/nginx/sites-enabled
     - ./nginx/ssl:/etc/letsencrypt/live/mastodon.localhost
    ports:
     - "80:80"
     - "443:443"

httpsアクセス用の秘密鍵と自己署名証明書を生成する。

この文章ではGit for Windowsがインストールされていることが前提なので、Git Bash内でOpenSSLを使う方法が手軽である。

./nginx/nginx/sslディレクトリでGit Bashを開き、以下のパラメータを指定して秘密鍵とサーバー証明書を生成する。

$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -subj "//CN=mastodon.localhost" -keyout privkey.pem -out fullchain.pem

Nginxの設定ファイルを準備する。これはMastodonで用意されているものを./nginx/sites-enabledディレクトリへコピーし、必要な個所を編集する。

> cp dist/nginx.conf nginx/sites-enabled/mastodon.localhost.conf

編集箇所と内容は以下の通り。

--- ./dist/nginx.conf
+++ ./nginx/sites-enabled/mastodon.localhost.conf
@@ -7 +7 @@
-    server 127.0.0.1:3000 fail_timeout=0;
+    server host.docker.internal:3000 fail_timeout=0;
@@ -11 +11 @@
-    server 127.0.0.1:4000 fail_timeout=0;
+    server host.docker.internal:4000 fail_timeout=0;
@@ -19 +19 @@
-  server_name example.com;
+  server_name mastodon.localhost;
@@ -28 +28 @@
-  server_name example.com;
+  server_name mastodon.localhost;
@@ -37,2 +37,2 @@
-  # ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
-  # ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
+  ssl_certificate     /etc/letsencrypt/live/mastodon.localhost/fullchain.pem;
+  ssl_certificate_key /etc/letsencrypt/live/mastodon.localhost/privkey.pem;

最後に、上記ファイルを取り込むために./nginxディレクトリにnginx.confを作成し、以下の通り記述する。

events {
  worker_connections 768;
}

http {
  include /etc/nginx/sites-enabled/*;
}

リバースプロキシ関連は以上。

docker imageの作成

いよいよdocker imageを作成する。これには数分かかる。

> docker compose build

buildが終わったら以下のコマンドでRails内での暗号化や証明のキーの元となる値を生成する。

2つ必要なので2回コマンドの実行が必要。

> docker compose run --rm web rails secret

コマンドを実行すると最後に128文字のキーが表示されるので、これを上記.env.productionの以下の場所にコピペする。

SECRET_KEY_BASE=********************************************************************************************************************************
OTP_SECRET=********************************************************************************************************************************

次にデータベースのセットアップを行うがこれには2段階の操作が必要になる。まずdbコンテナを起動しDBサーバを初期化する。

> docker compose up db -d

コンテナが起動しPostgreSQLのセットアップが完了したら。ログはこのような以下のような状態で停止している。

> docker compose logs
mastodon-db-1  | PostgreSQL init process complete; ready for start up.
mastodon-db-1  |
mastodon-db-1  | 2022-11-25 12:12:14.971 UTC [1] LOG:  starting PostgreSQL 14.6 on x86_64-pc-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit
mastodon-db-1  | 2022-11-25 12:12:14.971 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
mastodon-db-1  | 2022-11-25 12:12:14.971 UTC [1] LOG:  listening on IPv6 address "::", port 5432
mastodon-db-1  | 2022-11-25 12:12:15.059 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
mastodon-db-1  | 2022-11-25 12:12:15.240 UTC [49] LOG:  database system was shut down at 2022-11-25 12:12:14 UTC
mastodon-db-1  | 2022-11-25 12:12:15.311 UTC [1] LOG:  database system is ready to accept connections

この段階ではデータベースの作成やテーブルのマイグレーションなどが行われていないのでそれを行う。

> docker compose run --rm web rails db:setup

マイグレーションが終わるとプロンプトに戻る。生成されるテーブルは以下の様になる。

> docker compose exec db psql -U postgres postgres -c "\d"
                                 List of relations
 Schema |                   Name                    |       Type        |  Owner
--------+-------------------------------------------+-------------------+----------
 public | account_aliases                           | table             | postgres
 public | account_aliases_id_seq                    | sequence          | postgres
 public | account_conversations                     | table             | postgres
 public | account_conversations_id_seq              | sequence          | postgres
  :
  :
  :

以上で準備は完了なので、全てのコンテナを起動する。

> docker compose up -d

WEBブラウザでhttps://mastodon.localhost/へアクセスし、UIが表示されるか確認する。

起動

ユーザーの作成

メールサーバは用意していないため、ブラウザからはユーザー登録を行うことができない。

そのためコマンドラインから直接ユーザーの作成と確認処理を行う。ここではユーザー名をalice、メールアドレスはalice@mastodon.localhostとして作成を行う。

参考:Using the admin CLI

> docker compose exec -e RAILS_ENV=production web bundle exec bin/tootctl accounts create alice --email alice@mastodon.localhost --confirmed
OK
New password: ebfb4367b4990c5e8e0e925546dbd690

コマンドを実行すると自動でパスワードが生成される。

これをMastodonのログイン画面に入力し、ログインができることを確認する。

アカウントが認識されていないようならコンテナを再起動してみるとよい。

ログインができたら、存分にトゥートを堪能しよう。

ホーム画面