jtwp470’s blog

日記とかプヨグヤミングとか

今何かと話題のマストドン(mastodon)鯖を自分用に無料で立てる方法

こんにちは。社会人2週間が経過して日々辛い思いを背負っているたんごです。

www.itmedia.co.jp

水曜日頃TLで賑わっていたポストTwitterとか色々呼ばれているマストドン(mastodon)が流行っていますね。ただ日本鯖であるmstdn.jpが1人の大学院生の自宅鯖で動いていてめっちゃアクセスが有ってしんどいみたいな感じだったようですね。そんな中私は仕事を終え帰宅後に1時間程度でAWSにこれをデプロイして自分用として遊んでいます。 基本的には公式ドキュメントをそのまま読めば大抵何とか成るのですが、自分用に鯖を立てて良い感じに公開する方法を記述しておきます。

必要なものと前提知識など

  • LinuxサーバーにSSHしたことがある
  • AWSのアカウント または適当なクラウド事業者を使うことのできるアカウント
    • クレジットカード (無料枠だけなら必要ないかも?)
  • 独自ドメイン
    • エンジニアなら自分の独自ドメインくらい持ってるよなぁ?
    • 1年目ならかなり格安で取れるので興味があればとってしまうのはありだと思います

インスタンスを建てよう

今回のお話ではAWSインスタンスを建てました。AWSはアカウント作成から1年の間であれば t2.micro というインスタンスに限り無料で利用することができます。仮に全額支払っても月$20行かない程度なので他の用途で遊ぶのもありですね。AWSへのインスタンスの建て方に関しては割愛します。

もちろんさくらのクラウドVPS, GCP, Azureなど自分が好きな場所に好きなように建ててもらってかまいません。

ちなみに今回のOSはUbuntu 16.04 LTSを利用しています。

必要なものをインストールする

次にインスタンスSSHで接続します。接続したら今後必要になるであろうものをインストールしておきましょう。

$ sudo apt-get update
$ sudo apt-get install -y git

マストドンは公式ドキュメントではDockerコンテナを利用して構成されています。実は普通にインストールする方法もあるのですが面倒なのでDockerコンテナをそのまま利用してしまいましょう。

はじめにDockerと docker-compose をインストールします。次のドキュメントを参照すればOKです。

docs.docker.com

つまり、まず、

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

をして次にDockerのGPG鍵を追加します。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

最後に公式のリポジトリを追加します。

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

現在DockerにはCEとEEがありますがエンタープライズ向け(EE)を入れても仕方がないのでCEを入れましょう。

$ sudo apt-get update
$ sudo apt-get install docker-ce

これでインストールは終了です。一応自分自身が root 権限がなくても docker コマンドを使えるようにしておきましょう。

$ sudo usermod -aG docker $USER

一度ログアウトし再度ログインします。

次に docker-compose をインストールします。できるだけ最新版のリリースを入れましょう。

github.com

$ sudo su
# curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

マストドンを立てる

GitHubのマストドンのREADMEにあるとおりに進めていきます。 ちなみに平易な英文ですので基本的にはREADMEを読んでくださいね。

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

追記 (4/16分)

non_117 さんがはてぶでコメントしてくださっていますが、たしかに永続化設定していることを書くの忘れていました。コメントありがとうございます。

今何かと話題のマストドン(mastodon)鯖を自分用に無料で立てる方法 - jtwp470’s blog

docker-compose.ymlでpostgresqlの永続化設定コメントアウトするの忘れてませんか? 忘れてたら絶対にdocker-compose downせずにpsqlでDBをdumpしましょう。 / この記事鵜呑みにして永続化忘れる人がでると悲劇なので書いておいてほしい

2017/04/16 13:22
b.hatena.ne.jp

Dockerではコンテナ内の変更は永続化されないため、別途ディスクにボリュームとしてマウントしてあげないと、インスタンスの再起動やコンテナの再生成時にDBやRedisが全て吹き飛びます。💣 やばいので、永続化されるよう、docker-compose.yml の中身のコメントアウトを消してあげます。

  db:
    restart: always
    image: postgres:alpine
    volumes:
      - ./postgres:/var/lib/postgresql/data

  redis:
    restart: always
    image: redis:alpine
    volumes:
      - ./redis:/data

こうすると、カレントディレクトリの ./postgres と, ./redis にコンテナ内のデータが置かれ、失われずにすみます。

(追記終わり)

さてはじめに、環境変数を準備します。

cp .env.production.sample .env.production

ドキュメントに書いてあるとおり最低限以下の環境変数をセットする必要があります。

  • LOCAL_DOMAIN
  • LOCAL_HTTPS
  • PAPERCLIP_SECRET
  • SECRET_KEY_BASE
  • OTP_SECRET
  • SMTP_*

LOCAL_DOMAINは自分でもっているドメイン、(もしサブドメインで運用するならその値を)、LOCAL_HTTPStrueにしておきましょう。

また、

  • PAPERCLIP_SECRET
  • SECRET_KEY_BASE
  • OTP_SECRET

は、次にコマンドで出力される値を書いておけば良いみたいです。

$ docker-compose build
$ docker-compose run --rm web rake secret

私の鯖では最終的に .env.production を次のような感じにしました。(一部検閲済み)

# Service dependencies
REDIS_HOST=redis
REDIS_PORT=6379
DB_HOST=db
DB_USER=postgres
DB_NAME=postgres
DB_PASS=
DB_PORT=5432

# Federation
LOCAL_DOMAIN=mastodon.jtwp470.net
LOCAL_HTTPS=true

# Application secrets
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
PAPERCLIP_SECRET=xxx
SECRET_KEY_BASE=xxx
OTP_SECRET=xxx

# Optionally change default language
DEFAULT_LOCALE=ja

# E-mail configuration
# Note: Mailgun and SparkPost (https://sparkpo.st/smtp) each have good free tiers
SMTP_SERVER=email-smtp.us-west-2.amazonaws.com
SMTP_PORT=587
SMTP_LOGIN=<censored>
SMTP_PASSWORD=<censored>
SMTP_FROM_ADDRESS=noreply@mastodon.jtwp470.net

これらが終わったらデータベースのマイグレーションとフロントエンドのプリコンパイルを行います。

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

これらが終わったら立ち上げてみましょう。

$ docker-compose up -d

これで立ち上がりました。次にNginxをインストールし、証明書をLet’s Encryptで生成します。

SSLを有効化する

certbot.eff.org

↑を参考に続けていきます。

$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot  nginx

あとは証明書を取得します。

$ certbot certonly --webroot -w /var/www/example -d example.com

さてNginxの設定はドキュメントをそのままパクります。

注意点としては、

  • SSL鍵のフォルダの名前をきちんと変える
  • rootディレクトリも変える

こんな感じです。ここまで来てDNSをきちんと設定しておけば、https://example.com などに自分だけのマストドンインスタンスが生み出されます。

初期登録と管理画面をだす方法

はじめに自分のインスタンスにサインアップしようとしてもメールが送られてこないと思います。というのも、メールサーバーの設定をしていないためです。 ただ、仮に自分だけ、または知り合いからのみしか登録を受け付けないという設定の場合はメールを送る必要はないと思いますのでその設定をしたくないと思います。こんなときは手動で登録ユーザーの承認を行いましょう。

$ docker-compose exec web bundle exec rails mastodon:confirm_email USER_EMAIL=alice@alice.com

これで上の例では alice@alice.com で登録したユーザーが承認されログインできるようになります。

管理画面の出し方

管理画面を出すにはどうするねんという話ですが公式ドキュメントのAdministration Guideにその答えはありました。

次のコマンドを打ちます。

$ docker-compose exec web bundle exec rails mastodon:make_admin USERNAME=alice

これでユーザー alice が管理者としていろんなことができるようになりました。

メールを送って不特定多数のユーザーを招待したい

さて、もしメールを不特定多数のユーザーに送れるようにして自分のインスタンスにメールを送りたいという場合どうしましょうか。わざわざEC2インスタンスの中にメールサーバーを自前で構えてメール送受信申請を出すのも面倒ですし…という方の解決策としてAWS SESを使うという方法がありました。

AWS SESはAmazon Simple Email Service のことで簡単にEメールを送受信できるサービスです。無料利用枠として月1000件のメッセージの受信と62000件のメッセージの送信が無料だそうです。仮に有料でも1000つうあたり0.10 USDなのでそこまで高いというわけでもないと思います。

ちなみにSESは東京リージョンでは利用できません。そこで私は米国西部(オレゴン, us-west2)を利用しています。

まずDomainsへ行き自分のドメインを証明してもらいます。DKIMも生成しておきましょう。

f:id:jtwp470:20170415172020p:plain

こんな画面が出てくるのでDNSサーバー側でよしなに設定をします。設定終了後少し待っているとStatusがVerifiedになると思います。 次にEmail Addressesの画面を開き自分の受信できるメールアドレスを入れておきます。初めての状態ではこのメールアドレスに対して1000件のみしかメールが送れないという状態になっています。次にSMTP Settingsを開き、Create My SMTP Credentialsで認証情報を作成します。

これらの情報を .env.production に追加します。

  • SMTP_SERVER: email-smtp.us-west-2.amazonaws.com
  • SMTP_PORT: 587
  • SMTP_LOGIN: 生成された値
  • SMTP_PASSWORD: 生成されたパスワード

再度ビルドし、起動すればメールの送受信が可能になっていると思います。

$ docker-compose build
$ docker-compose up -d

最後に

マストドン日本鯖が落ちたり、自宅鯖から移行してさくらのクラウドに移行したり、pixivがマストドンの運営を始めたりといろいろカオスな状況ですが、そこで大変な思いをするより自分で自分用に囲ってしまい遊んでいるほうがらくじゃないですか?

ものすごく isidaiさんの考え方に共感したのでその記事を貼っておきますね。

isid.ai

ドメインアイデンティティを確立する

ドメイン名前空間が完全に分離されたお一人様インスタンスですので、自分の好きなようにTOOT(投稿)していいし、自分でアップロードしたファイルを自分のAmazon S3バケットに保存しておけます。

ドメインアイデンティティを確立する という言葉ものすごくパワーワードを感じますね。

ちなみに1 core 1GBのインスタンスマストドンを運営するとメモリが6 - 7割食われてしまい、RedisのログではOOM Killerが多発しているようですがガン無視して運営しています。もし余裕がある方ならメモリ量を増やすことをおすすめします.

以下は金曜日の深夜から初めて2日間たったあとのDatadogのログ。

f:id:jtwp470:20170415173605p:plain

みて分かる通りCPUはほとんど使いませんがメモリが..

f:id:jtwp470:20170415173630p:plain

これは直近のメモリ使用量です。マストドンを落としたところが急激に落ち込んでいるのがわかりますw

マスト丼

本当に最後になりますが、細々と自分のドメインmastodonを運営しています。もし興味があって参加してみたければぜひ来てください。

mastodon.jtwp470.net

また、マストドンのアカウントも作っていますのでフォローしてくれれば喜びます。

mastodon.jtwp470.net

後日談

jtwp470.hatenablog.jp