Docker Desktop使ってWindowsでマストドンだドン!

Dockerは便利だし、サクッといろいろな試験環境を用意し、すぐ破棄できるというのは非常に便利ですね。さて、Dockerの勉強編最終回は今度はオレオレ版Twitterのマストドンも簡単にインストールできるやろ!と試してみたのですがこれが思ったより難しかったのでまとめてみます。はじめに書いておきますが、これはマストドンをインストールしてインスタンスを構築するための方法ではなく、Dockerの勉強用にマストドンを利用しました!という話でこれをそのままサーバーで動かすとめっちゃひどい目に合うので注意!

さて前回はdocker-compose.yml一つだけでWordPressが起動しましたので今回もビルドはせずにdocker-composeだけでマストドンを起動してみます。なお公式ドキュメントにも書いてありますが、マストドンは本番用はDockerでもいいが、開発用に使うならいちいちビルドの必要なDockerはおすすめしないそうです。それでもDocker!しかもあえてWindowsで動かしたいという修羅の道を選ぶのか!?

(今回テストした環境はMastodon3.3+nginx1.9+Docker Desktop(Windows))

最初に必要なファイルは2つだけ

まずmastodonの公式のDockerHubはこちら
https://hub.docker.com/r/tootsuite/mastodon
そしてgithubはこちら
https://github.com/tootsuite/mastodon

まずはc:\docker\mstdnフォルダを作成し、githubに上がっているdocker-compose.ymlをコピーして設置し、.env.production.sampleを.env.productionに名前変更して設置しています。(Windowsだと最初の.が消えていたりするので注意)

さて環境構築をしていくドン!

まずマストドンの調合のレシピですが、・・・えー、imagemagickやffmpegなどこれだけのなんやかんやが必要です!!!!!ブフォwwww(;´∀`)

ライザのアトリエで言うと錬金術の最終到達点の賢者の石くらいの面倒臭さ。なんやこのレシピ・・・。

VPSにこれだけのパッケージをインストールするのも大変そう・・・。しかもこのバージョンだと動きません!!!おま環!!とか普通にありそう。これくらい複雑だとモジュール類のバージョンが固定できるDockerは本番環境でも便利そうですね。

docker-composeを書くぞ!

さて、まずはdocker-compose.ymlを見ていきます。

今回はビルドはせずに公式イメージを起動するので、何箇所かあるbuildを全部コメントアウトします。
build: .
→#build: .

とりあえずdocker up -dして127.0.0.1:3000にアクセスしますが、このままだと何も表示されません。が、とりあえず同じフォルダ内にいくつか必要なフォルダが作成されます。作成されるのはDockerのバインドマウントと言って、Docker内のコンテナで使うフォルダと、Windowsのフォルダをコネクトしたものになります。WindowsとLinux間を繋ぐ異世界の扉みたいな?このフォルダに入れたファイルも永続化され、かつホストのフォルダにマウントされています。なおセキュリティ的にはサンドボックスでなくなりフォルダを共有してしまう上、速度もおっそいのであんまりよろしくないのだとか。Dockerからもお叱りを受けますが無視。

このままでは起動しないのでマストドンに必要なデータを作っていくドン!まずはシークレットを設定します。

シークレットの作成

docker-compose run --rm web rake secret

これを実行するとランダムなシークレットが表示されるので2回実行し、それぞれを.env.productionに記入します。こんな感じ。

# Secrets
# ——-
# Make sure to use `rake secret` to generate secrets
# ——-
SECRET_KEY_BASE=06c3dbaf04ffa71013d191a33d32701e598994aca27d8323bd1c97dbf162ee9c0dcffb7c64fc437c3a7d116dd69b4de228e315560c923f2ff079c60043aa05e8
OTP_SECRET=7c32ed3f919d08de49535a28e38dbc988419134068db0972b883f56deb2e21bb9a08d1ec77348abbe228adc798a6df8789c214f1f802f418dd2829313ea18da1

赤字の部分は表示された文字列を入力してください。ファイルを保存したらGenerate with `rake mastodon:webpush:generate_vapid_key`を実行してください!って書いてあるので

docker-compose run –rm web rake mastodon:webpush:generate_vapid_key

とします。ちなみにdocker-compose runというコマンドは
docker-compose(このフォルダのdocker-compose.ymlを) run(実行せよ) –rm(remove即ち終わったらコンテナ削除で) web(docker-composeに定義されしwebサービスを起動し) rake mastodon:webpush:generate_vapid_key(rakeコマンドを実行せよ)という意味のコマンドです。rakeってのがlinuxにrubyがインストールされていると使えるコマンドですね。今回はrubyがインストール済みのdockerのイメージを使ってるのでdocker-composeでrakeコマンドを渡せば仮想コンテナが起動してrubyを実行してそして破棄されます。

VAPID_PRIVATE_KEY=Z93C_PthR7tOMjQWNYKVT5wGs7KlcvWc6gpFzTZUJ4k=
VAPID_PUBLIC_KEY=BFc3k1nSwzFCyWivWSO0a4tukuTm0wphOCuHdV6M02Nk9l9DBjOQrbtNZ9QwCYBsAv5NvfYJ9CUOnwvhZtEyXNs=

なんかキーが表示されるので.env.productionファイルの当該箇所に貼り付けておきます。

データベースの設定とか

次はマストドンに必要なデータベースの初期化を行います。同じようにrailsコマンドをdocker-composeから呼び出せばいいのですがそのままだとデータベースのエラーが出まくります。ハマリポイント1はデータベースの接続先ホストはIPアドレスやlocalhostではなく、DockerComposeのサービス名を書かないといけないことです。

×REDIS_HOST=localhost
×DB_HOST=/var/run/postgresql
○REDIS_HOST=redis
○DB_HOST=db
(redisやdbはデフォルトのdocker-composeで定義されているサービス名)

ハマリポイント2はpostgreSQLがデフォルトでは空のパスワードを許可しなくなっているのでパスワードを設定しないといけないことです。今回は面倒なので環境変数に空のパスワードを許可するように書きます。

ってことで.env.productionはこんな感じ

# Redis
# —–
REDIS_HOST=redis
REDIS_PORT=6379# PostgreSQL
# ———-
DB_HOST=db
DB_USER=postgres
DB_NAME=mastodon_production
DB_PASS=
DB_PORT=5432
POSTGRES_HOST_AUTH_METHOD=trust

postgreSQLのルートユーザーはpostgres、デフォルトパスワードは空です。今回は試験環境なのでこの設定で行きましょう。

docker-compose run –rm web rails db:create

エラーが出なければデータベースの作成は成功です。データベースの初期化とアセットのコンパイルを行いましょう。

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

最後の難関ですが、mastodonはローカルで動かす場合はLOCAL_HTTPS=falseにすればいいよ!と書いてありますがこれは確認したv3.3では無くなってます(しかもかなり前に)。なので、ローカル環境であってもSSL通信でないと何も表示されません!!!オワッタ

ちなみに、127.0.0.1:3000にアクセスするとhttpsにリダイレクトされるようになっていたらここまでは成功しています。

nginxをリバースプロキシとして動作させる

通信をSSL化するにはnginxでリバースプロキシを作成し、nginxにオレオレ証明書を利用させるようにすればいいようです。Docker+オレオレ証明書nginxについての解説は長いので別の記事にしました。先に読んでね(https://ingaouhou.com/archives/7642)

docker-composeに以下のサービスを追加

proxy:
image: nginx:latest
container_name: proxy
env_file: .env.production

volumes:
- ./nginx/html:/usr/share/nginx/html
- ./nginx/templates:/etc/nginx/templates
- ./nginx/ssl:/etc/nginx/ssl

ports:
- "80:80"
- "443:443"
restart: always

networks:
- external_network
- internal_network

docker-compose up/downしてバインドマウントのフォルダを作成します。sslフォルダには別の記事で作成方法を解説したオレオレ証明書の3点セットを入れる。templatesフォルダにdefault.conf.templateを作成、そしてnginxをリバースプロキシとして動作させるためのコンフィグはこちらのサイトのをコピペしましょう。

githubのissue
https://github.com/tootsuite/mastodon/issues/8723
コピペしてきたconfig
https://gist.githubusercontent.com/audiodude/926abe2997f210ad55e6a674109008a2/raw/9037a39423253f439117ff1822776441e22ed506/example.com.conf

前出の通りdockerではIPアドレスではなくサービス名を指定するのでコンフィグ内でも

    ×proxy_pass http://localhost:3000;
  ○proxy_pass http://web:3000;

としておきましょう。(ファイルは長いので別途テキストファイルを添付してます)
最後にdocker-compose downやdocker-compose up -dを忘れずに。

最後に初期設定をしておしまい!

最後にマストドンの初期ユーザーを作成します。マストドンにはコマンドベースのtootctlというコマンドがあります。Dockerからはこんな感じで呼び出します(参考サイト)

docker-compose run --rm web bundle exec bin/tootctl SUBCOMMAND [OPTIONS]

というわけで初期ユーザー作成のコマンドはこうです

docker-compose run --rm web bundle exec bin/tootctl accounts create ingaouhou --email="test@ingaouhou.com"

今回は他のユーザーを作る予定もないのでSINGLE_USER_MODE=trueを.envに追加。いつものアップ!ダウン!を行ってこれで無事マストドンが起動したドン!めでたしめでたし。

今回は一切Dockerでビルドしない縛りプレイをしていたので大変でしたが、逆に一切ビルドしていないのでdocker-compose.ymlと.envファイルだけコピーして他の端末のDockerでもdocker-compose up -dすれば同じ状態になるはず!というのがとてもクールですね。これこそがDockerの醍醐味かと。もちろんDockerFileでビルドすれば更にカスタマイズしてゴリゴリ開発してくこともできるでしょう。

Dockerで雑にMastodonを起動する方法
https://qiita.com/zembutsu/items/fd52a504321dd5d6f0b8
を参考にしながらやってみましたが情報が3年前のものだったのでちゃんと調べるのが大変でした。ぴえん。しかもwordpressとかを使っているとまず使わないpostgreSQLとRuby on Rails、nginxの三連コンボの勉強にもなったのでいい修行だっと思います。ぶっちゃけMastodonはちょこちょこ仕様が変わるのでgithubのissueを見ながらでないと訳わからんからな!!!修行したい人以外はやめておけ。

最後に今回作成したmastodonのdocker-composeとnginxのリバースプロキシのコンフィグです。参考にどうぞ

mstdn.zip

タイトルとURLをコピーしました