surga Lab

営業部でも開発したい!!

Raspberry Pi 3とDockerでMastodonのインスタンスを立ててみました

最近話題のマストドン。楽しそうですね。

github.com

Mastodon is…

TwitterはTwitter社が管理していますが、
Mastodonは分散型で稼働しています。

TwitterはTwitter社が大きなサーバを用意していますが、
Mastodonはオープンソースで誰でもサーバ(インスタンス)を立てることができます。

そうすると複数のサーバが立てられることになりますが、異なるサーバのユーザとコミュニケーションをとることも可能で、この繋がりを連邦と表現します。
サーバ内限定で発言したり、連邦全てに発言したりと自由度が高いです。

日本ではmstdn.jpが有名で、急激に人口を増やしています。

メリット/デメリット

メリット

  • 企業に縛られない

Twitterがサービス終了と言ったら有無を言わさず終わりです。何も残りません。
また、その他言論制限がありません。あるとすれば他のサーバから国交断絶されるくらいです。

togetter.com

  • 広告がない

有料プランも広告プランもありません。
ちなみにマストドンの初期資金はクラウドファンディングからなります。

  • 効率的な情報交換

目的が設定されているインスタンスであれば、集まる人も同じ目的を持っているため効率的です。
(例:pixivのインスタンスは絵を自由に公開したい人が集まっています)

デメリット

  • サーバ管理者に権利が委ねられている

アカウントを作る際にサーバを選ぶわけですが、管理者が飽きたり管理費不足でサーバを停止した場合アカウントが消えてしまいます。

なぜラズパイでサーバを立てたいのか

そもそもmstdn.jpのように1つのサーバへ多くの人が集まるのって分散型のメリットを消してしまっているような気がします。
Twitter社の役がmstdn.jpの管理者に移っただけですよね

自分専用のサーバを立てることで、管理は自己責任になり、他者とのコミュニケーションも連邦で可能です。
やめたいときはサーバを消せばいいだけです。
つまり、分散型のメリットを大きく生かせるのではないかと。
先述した効率的な情報交換はできませんが。

そう考えると自分1人+α程度であればラズパイぐらいのサイズがコスト面から考えて最適ではないかと。(処理的にいけるかは別として)

ということで、やってみましょう。

必要なものの準備

マストドンはDockerで入れられます。
正直Dockerは触ったことがないのでひたすらGoogle先生とお話していました。

以下まとめを参考にさせていただきました。

aoi-f.hatenablog.com

前提

raspbian入りで外部に接続できるラズパイ3があること。

ここを参考にしてください。

blog.hisurga.com

kamuycikap.hatenablog.com

myDNSのサブドメインを独自ドメインにしたいのであれば、独自ドメインのDNSレコード設定で

ホスト:独自ドメイン
タイプ:cname
コンテンツ:myDNSのサブドメイン

にすればいけると思います。

gitのインストール

sudo apt-get install git

Dockerとdocker-composeのインストール

blog.hisurga.com

letsencryptのインストール

無料でCA証明書を発行してくれます。

git clone https://github.com/letsencrypt/letsencrypt.git
cd letsencrypt
./letsencrypt-auto --help

nginxのインストール

sudo apt-get install nginx

mastodonの導入

ここでめっちゃハマってました。

公式のmastodonではarmに対応していないため、自分でhypriotのalpineからビルドに挑戦し、イメージのビルドまではいったんですが、docker-compose build/ runの段階でどうにもならず死んでいました。

するとどうでしょう。

もうあるじゃないですか。

github.com

uehatsu.info

ということで上記事を参考に進めていきます。

まずはrpi-mastodonをcloneします。

git clone https://github.com/gilir/rpi-mastodon.git

続いて以下コマンドを打ちます。

docker-compose up -d

エラーが出まくりますが、「これを実行してもう1回チャレンジしてくれ」的なことを言われるので、ひたすら従います。(6回くらい)

完全に服従したら以下のコマンドを3回繰り返し、キーを3つゲットします。

docker-compose run --rm web rake secret

.env.productionの設定

.env.production.sampleから.env.productionを作成し、編集します。

cp .env.production.sample .env.production
emacs .env.production

変更点は以下のように

とりあえず動作を見たかったので、HTTPS対応をfalseにしました。

# REDIS_DB=0
DB_HOST=db
DB_USER=好きなユーザ名
DB_NAME=好きなDB名
DB_PASS=好きなパス
DB_PORT=5432
# Federation
LOCAL_DOMAIN=<span style="color: #ff0000">あるなら独自ドメイン</span>
LOCAL_HTTPS=false

# Application secrets
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
PAPERCLIP_SECRET=先ほどのキー1
SECRET_KEY_BASE=先ほどのキー2
OTP_SECRET=先ほどのキー3

MTP_SERVER=sparkpostで入手
SMTP_PORT=587
SMTP_LOGIN=sparkpostで入手
SMTP_PASSWORD=sparkpostで入手
SMTP_FROM_ADDRESS=hoge@ドメイン (送信元用)
SMTP_AUTH_METHOD=plain
SMTP_ENABLE_STARTTLS_AUTO=true

SPARKPOSTの情報はこのページです。
APIキーはセキュリティ上1回しか表示されないので注意。見落としたら再発行しましょう。

f:id:hisurga:20170426004813p:plain

データベースの設定

web rake secret後はデータベースの設定を行います。

docker exec -it データベースのコンテナ名 /bin/bash
bash-4.3# su - postgres
$ createuser -P 先ほどのユーザ名
Enter password for new role: 
Enter it again: 
$ createdb 先ほどのデータベース名 -O 先ほどのユーザ名
Ctrl + pqでコンテナから脱出

マイグレーションしてからアセットのコンパイルをします。

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

ここまできたらとりあえずテストです。
以下コマンドで何かのhtmlが返ってこなかったら間違っているかもです。

curl localhost:3000

nginxの設定

nginxの設定を行います。設定内容は公式を流用し、example.comを自分のドメインに変えてください。

本来ならばここで証明書の取得をするべきですが、私はとりあえずHTTPS非対応でいきました。

documentation/Production-guide.md at master · tootsuite/documentation · GitHub

sudo emacs /etc/nginx/conf.d/ドメイン.conf

起動

sudo systemctl restart nginx

起動したら他の回線から覗いてください。もしくはローカルのipに:3000をつけて見てください。

どうでしょう、動きましたか?

動いていないなら何かがおかしいです。
もう一度順番通りにできているか確認しましょう。

f:id:hisurga:20170426004825p:plain:w300

ここまで書いて何ですが、私はうまく動かないです。

リバースプロシキがうまく作動していないのか、"ローカルIP:3000"でしか見れないです。
外の世界から訪問するとnginxのウェルカムページが表示されます。
メールも届かない、、、

また加筆する予定ですが、取り急ぎここまで。

追記
メールに関しては単純な設定ミスでした。
また、Dockerを使うより専用機にした方が動作も軽く、いい感じに動きました。
以下記事を参考にしてください。

blog.hisurga.com