先行例を探すと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と必要なサブディレクトリの作成
まとめておきたいのでここではプロジェクト内にサブディレクトリを作成する。
最低限起動に必要なディレクトリは
PostgreSQL
とRedis
用のデータディレクトリだが、サーバー証明書の設定などのためにここでは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.yml
のservices
の最後へ追記する。
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
として作成を行う。
> 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のログイン画面に入力し、ログインができることを確認する。
アカウントが認識されていないようならコンテナを再起動してみるとよい。
ログインができたら、存分にトゥートを堪能しよう。