西川和久の不定期コラム

Windows 10 ProのPowerShellで「Mastodon」インスタンスを動かす!

~Hyper-VでDockerを使い簡単インストール

 巷ではTwitterに似た「Mastodon」(マストドン)が話題だ。Twitterと違い、分散アーキテクチャでかつオープンソースソフトウェアで、GitHubからコードを取得可能。あっという間に広がっている。

 すでにネットでは数々のインスタンスが上がっているものの、ローカルで少し試してみたい方も多いと思う。そこでWindows 10 Proを使いサクッとインストール方法をご紹介する。

Hyper-VでDocker for Windowsを使う

 Mastodonを動かすには何パターンかあるのだが、基本Linux(主にRuby on RailsやPostgreSQL)で動くとはいえ、Bashで作動させるのは少し骨が折れそうだ。そこで機能制限はあるものの、「Docker」を使いサクッとインストールしてみたい。

 Dockerを大雑把に説明すると、VM(仮想マシン)の軽量版のイメージとなるだろうか。一般的に言われるVMだと、ホストOSの上に仮想マシンが乗り、その上でゲストOS、さらにプロセスが作動するイメージとなる。対してDockerは、コンテナと呼ばれる階層のみでプロセスを作動させることができる(ただしOSはLinux限定)。

 MastodonはDockerのコンテナにもなるので、コンテナに乗せさえすれば、インストールはほとんど完了となる簡単さだ。

 ただDockerを効率よく作動させるためにWindowsのHyper-Vを使用している関係から、Windows 10 Homeでは動かず、10 Pro(以上)の環境が必要。この点だけは注意しなければならない。

 インストールの手順は以下の通り。

1. Windowsの設定>アプリ>アプリと機能>プログラムと機能>Windowsの機能の有効化または無効化でHyper-Vにチェックを入れ再起動する。

2. Docker for Windowsをここからダウンロードして、セットアップ。この時、Stable channel版を使う。

Windowsの機能の有効化または無効化でHyper-Vにチェック
Docker for WindowsのStable channel版をダウンロード

3. ダウンロードしたInstallDocker.msiをクリックしてインストール開始。

Docker Setup(1/4)
Docker Setup(2/4)
Docker Setup(3/4)
Docker Setup(4/4)

4. タスクバーに常駐するので、Settings>Share DrivesでCドライブのみチェックを入れる

Settings>Share DrivesでCドライブのみチェック

 これでDocker for Windows側の設定は完了。あとはPowerShellを使って必要な設定を行なう。

 以降、最大の注意ポイントは、Windowsのログイン名が日本語になっていないこと。筆者はこの部分で引っかかり数時間余計にかかってしまった(PATHに日本語/UTF8が混じっていると後述する「docker-compose build」でエラーとなる)。いずれ修正されると思うが、現状は要注意だ。

 チェックは簡単。PowerShellを起動すると、プロンプトが「PS C:Users[UserName]>」になっていると思うが、このUserNameが半角英数であれば問題ない。もし、ここが日本語だった場合は、別途ユーザー名(「mastodon」など)を新たに作り、ログインしなおしてから以降の設定を行なって欲しい。

Mastodonのダウンロードと設定

 いよいよ次はMastodon本体をダウンロード。本家の説明によると、gitでcurrentのコードをcloneするように書いてある。

git clone https://github.com/tootsuite/mastodon.git

 しかしWindows自体にはgitはなく、別途Windows版のgitをインストールするか、Bashを起動して、Windowsが認識できるフォルダで上記のコマンドを実行する(もしくはサイトからzipでのダウンロードも可能)。

 ただ、この記事の検証中に多発したのは、currentコードの整合性が取れておらず、Mastodonが正常起動しないことが多かったことだ(commitの量が凄まじい)。

 従ってreleases buildのコードを取得するのが安全だ。執筆時点ではv1.2。下記URL最後にダウンロードリンク(zipかtar.gz)があるので、ダウンロードして作業用フォルダに展開するか、v1.2のtagを指定してgit cloneする。

https://github.com/tootsuite/mastodon/releases/tag/v1.2
※zipかtar.gzをダウンロードする場合

$ git clone --depth=1 -b v1.2 https://github.com/tootsuite/mastodon.git
※v1.2のtag指定でclone

 一例として作業用フォルダは「/mnt/c/Users/mastodon/Documents/work/」として、gitまたはzipを展開すると、mastodonもしくはmastodon-1.2フォルダができるので、以降の作業をここで行なう(例はmastodonフォルダ)。

 ファイルを展開またはcloneし終えたら、環境設定ファイルをテンプレート(.env.production.sample)からコピー(.env.productionというファイル名)して、テキストエディタなどで編集する。LOCAL_DOMAINを「localhost:3000」、LOCAL_HTTPSを「false」とする。このとき、LAN上のほかのPCからもアクセスしたい場合は、LOCAL_DOMAINを「[PCのIPアドレス]:3000」とする(例えば192.168.1.12:3000など)。

Bashを使用した例

$ cp .env.production.sample .env.production
$ vi .env.production
# Federation
LOCAL_DOMAIN=localhost:3000
LOCAL_HTTPS=false

 これでBashを抜けてPowerShellに戻り、「C:\Users\mastodon\Documents\work\mastodon」へ移動し、以下を実行。コンテナを展開する。眺めているとrubyやrails、postgresqlなど、いろいろ構成するものが表示され、時間はかかるが、これはこれで面白い。

PS C:\Users\mastodon> docker-compose build

プロンプトに戻ったら、以下のコマンドを3回実行。都度キーが表示されるので、どこかにコピー&ペーストしておく。

PS C:\Users\mastodon> docker-compose run --rm web rake secret

 キーは「.env.production」の下記の部分へ、そのままペーストする(3カ所あるので3回実行)。

# Application secrets
PAPERCLIP_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SECRET_KEY_BASE=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
OTP_SECRET=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

 これでコンテナの準備は完了。以下のコマンドで、コンテナ内のデータベースなどを初期化して起動に備える(運用中、何かの拍子でCSSがおかしくなったら「assets:precompile」の方を実行すれば直る)。

PS C:\Users\mastodon> docker-compose run --rm web rails db:migrate
PS C:\Users\mastodon> docker-compose run --rm web rails assets:precompile

 DockerへMastodonのコンテナをセット/起動は以下の通り。前者はCtrl+Cで停止。後者はデーモンでの起動となる。起動と停止は、それぞれdocker-compose startとdocker-compose stopだ。

PS C:\Users\mastodon> docker-compose up
※Ctrl+Cで停止

 または、

PS C:\Users\mastodon> docker-compose up -d
※デーモンでの起動

PS C:\Users\mastodon> docker-compose stop
PS C:\Users\mastodon> docker-compose start
※停止と再起動

 しばらくして「http://localhost:3000」(もしくは指定したIPアドレス:ポート)でWebブラウザからアクセスすると、Mastodonのトップページが表示されるので、ユーザー名、メールアドレス、パスワード(2回)を入力して登録する(ただし、IE系は現状ログイン後が何も表示されないので、ChromeやEdge、Safariなどを使う)。

 また、PCのIPアドレスをセットした時は、同一LAN上のほかのPCやスマートフォンからでもアクセスできるが、Windows Defenderがポートを塞いでいるので、そのままではアクセスできない。プライベートネットワーク側の設定を変更し、該当するポートを開ける必要がある。

 さて、通常であれば、入力したメールアドレスへ、アカウント登録確認のメールが送信されるが、何も送信されず、confirm(登録確認)できないため結果ログインできない。先の.env.productionでサーバーなどを指定する部分があるものの、外部のSMTPサーバーを使う場合、最近ではほとんどのケースでサイトの認証が必要=ドメイン名が必要となるため、LAN上のIPアドレスでは無理だ。

 これを解決するには、PowerShellから以下のコマンドを入力する。これでconfirmしたのと同じことになる。

PS C:\Users\mastodon> docker-compose run --rm web rails mastodon:confirm_email USER_EMAIL=xxxx@xxxx
※xxxx@xxxxは登録したメールアドレス

 また、管理者の場合は加えて以下も実行し、管理者権限を与える(通常ユーザーは不要)。

PS C:\Users\mastodon> docker-compose run --rm web rails mastodon:make_admin USERNAME=xxxx
※xxxxは登録したユーザー名

 これでログイン画面にメールアドレスとパスワードを入力すれば、無事ログイン可能だ。

Mastodonトップページ
Mastodonログイン画面
Mastodonのタイムライン
Mastodonの設定/プロフィールを編集
Mastodonの管理画面/アカウント
Mastodonの管理画面/Sidekiq

 この状態でお一人様Mastodonを楽しむも良し、PCのIPアドレスをセットして同一LAN上のPCからアクセスして遊ぶのも良し。Mastodonの操作自体はそれこそ山のようにネットに上がっているので省略する。確認しながら操作して欲しい。とはいえ、Mastodonの最大の特徴である、リモートフォローや連合タイムラインを使えず寂しいが……

 またSSLがないので(最近無料のSSLもあるが、これもサイト認証が必要なのでLAN上のIPアドレスではどうにもならない)、ネット上に出すのは危険だ(メールアドレスやパスワードが含まれるため)。ユーザー登録確認用のメールも送信できず、不特定多数を対象にするのは難しい。

 よって、同一屋内での同一LAN上の少人数グループや、社内運用なら何とかなる範囲だろうか。confirmも少人数で顔見知りなら、聞いて回るなりして別途メールで確認も可能だ。メッセージ系とは一味違う使い勝手なので、試しながらその可能性を模索するのも面白いだろう。

手順のまとめ

 ある程度システムを分かる人向けにインストール手順を一式まとめると以下の通り。

1. Hyper-V ON
2. Docker for Windowsをここから https://docs.docker.com/docker-for-windows/install/ ダウンロードして、セットアップ
3. Shared DrivesでC:ドライブにチェック
4. git clone --depth=1 -b v1.2 https://github.com/tootsuite/mastodon.git
5. cp .env.production.sample .env.production
6. .env.productionのLOCAL_DOMAIN=とLOCAL_HTTPS=を編集
7. docker-compose build
8. docker-compose run --rm web rake secretを三回実行。結果を何処かにコピペ
9. .env.productionのPAPERCLIP_SECRET=、SECRET_KEY_BASE=、OTP_SECRET=へ値をセット
A. docker-compose run --rm web rails db:migrate
B. docker-compose run --rm web rails assets:precompile
C. docker-compose up -d
D. docker-compose run --rm web rails mastodon:confirm_email USER_EMAIL=
E. docker-compose run --rm web rails mastodon:make_admin USERNAME=
F. docker-compose start | stop | ps | down
G. 必要に応じてWindows Defenderのポートを開ける

 原稿の内容を確認しつつ、いろいろなマシンに何度もインストールしたので最後は10分もかからずできるようになってしまった(笑)

 またmacOS上でもDocker for Mac https://docs.docker.com/docker-for-mac/install/ を使い、同じ手順でMastodonが起動できることを確認している(3とGは不要)。

Docker for Macを使ってMastodonを起動

 余談になるが、この原稿をほぼ書き終えたタイミングで、インスタンスをネット上に公開した。身内で遊んでいるのでURLは公開しないが(といっても直に連合タイムラインに載ってわかってしまうが)、OSはCentOS 7 (Minimal ISO)を使用(1GB/2core)。network-scripts/firewall/ssl/nginx、docker/docker-composeをインストールした以降の手順は今回とほぼ同じ。Windows上で何回もやった後だけに比較的簡単にインスタンスを上げることができた。

 これからMastodonはどのような進化/浸透を遂げるのか。久々に登場した“超新星”にワクワク感でいっぱいだ。

【編集部注】編集部で動作確認を行なったところ、Dockerのドライブ共有操作でファイヤーウォールにブロックされているというエラーメッセージが出るなど、正常動作しませんでした。お使いの環境によるものもあるため、編集部では一切のお問合わせに対しお答えできません。あらかじめご了承ください。