Raspberry PiでMastodonインスタンスを立てる方法(1.3.3対応版)

2017年5月24日


うちで動いているRaspberry PiをMastodonインスタンスにしようと試行錯誤しているのは先日書いたとおりなのですが、最終的にうまくいったので手順を公開します。
手順は入れたばかりのまっさらなRaspbian Liteを想定しています。

Raspberry Piインスタンス公開のお知らせ
この手順を使ってRaspberry Pi 3上で起動したインスタンスを期間限定で一般に公開しています。
(11/30まで。終了後は一切のデータは消去します)
とっても重いので、無理のある使い方をしていることを理解した上で使ってください。
Raspberrydon
https://m.yagi.tc/

手順の概要

用意するもの

  • Raspberry Pi 2 Model B
    (検証にはPi2B・Pi3Bを併用しました)

動作確認環境

  • Raspbian GNU/Linux 8.0 Lite (Jessie)
  • Docker 17.05.0-ce ※今回導入します
  • docker-compose 1.13.0 ※今回導入します
  • Mastodon 1.3.3 ※今回導入します

他の人のやり方との相違点

  • Dockerを使用します
  • docker-composeをビルドします(イメージ取ってくる方法だとダメだった)
  • forkされたrpi-mastodonを使います(公式の方法だとダメだった)
  • rpi-mastodonは5/1に大幅な変更があったのでそれに合わせて変えています
  • Let’s Encryptを使用します(オレオレ証明書じゃないよ)
  • 最小構成を目指しました(スケールさせるための追加要素などは除いています)

手順

インストールを始める前に、スワップ領域を拡大しておきます。スワップ領域を使うとSDカードの寿命を縮めますので、やりたくない方は飛ばしてください。

swapon -s

おそらく初期状態ではこのように表示されます。(Raspberru Pi 2の場合)

$ swapon -s
Filename                                Type            Size    Used    Priority
/var/swap                               file            102396  0       -1

設定ファイルを編集します。

sudo systemctl stop dphys-swapfile
sudo vi /etc/dphys-swapfile

このように変更します。

CONF_SWAPSIZE=2048

変更されたことを確認します。

sudo systemctl start dphys-swapfile
swapon -s

サイズが増えていればOKです。

$ swapon -s
Filename                                Type            Size    Used    Priority
/var/swap                               file            2097148 0       -1

Dockerをインストールします。こちらを参考にしました。

curl -sSL https://get.docker.com/ | sh

これで処理が15分ほど走ります。
バージョンは5/24現在、このように表示されました。

$ docker version
Client:
 Version:      17.05.0-ce
 API version:  1.29
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:30:54 2017
 OS/Arch:      linux/arm
Server:
 Version:      17.05.0-ce
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:30:54 2017
 OS/Arch:      linux/arm
 Experimental: false

続いて、自分がroot権限がなくてもdockerコマンドを使えるようにしておきます。
(ユーザ名は仮にpiとしています)

sudo gpasswd -a pi docker

一度ログアウトし再度ログインします。
docker-composeをインストールします。Raspbianなのでそのままではインストールできません。なのでこちらを参考にしました。

git clone https://github.com/docker/compose.git
cd compose
git checkout release
docker build -t docker-compose:armhf -f Dockerfile.armhf .
docker run --rm --entrypoint="script/build/linux-entrypoint" -v $(pwd)/dist:/code/dist -v $(pwd)/.git:/code/.git "docker-compose:armhf"

docker buildの部分はRaspberry Pi 2(swapなし)だと処理するのに1時間、Pi 3(swapあり)だと40分ほどかかりました。
docker-composeファイルができたことを確認します。

ls -l dist/

このように表示されます。

$ ls -l dist/
total 6844
-rwxr-xr-x 1 pi pi 7004328 May 23 22:31 docker-compose-Linux-armv7l

docker-composeファイルを/usr/local/bin/に配置します。

sudo cp dist/docker-compose-Linux-armv7l /usr/local/bin/docker-compose
sudo chown root:root /usr/local/bin/docker-compose
sudo chmod 0755 /usr/local/bin/docker-compose
docker-compose version

バージョンは5/24現在、このように表示されました。

$ docker-compose version
docker-compose version 1.13.0, build 10267a8
docker-py version: 2.2.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016

Mastodonをインストールします。こちらを参考にしましたが、公式の方法だとうまくいかないのでforkされたラズパイ用のリソースを持ってきます。

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

次に公式のMastodonを持ってきます。git checkoutの部分は今回1.3.3にしていますが、”git checkout $(git tag | tail -n 1)”で常に最新のものにもできます。

git clone https://github.com/tootsuite/mastodon
cd mastodon
git checkout v1.3.3

一部のファイルだけをrpi-mastodonのものに差し替えます。

cp ../rpi-mastodon/docker-compose.yml .
cp ../rpi-mastodon/Dockerfile .

この差し替えたdocker-compose.ymlは永続化設定がされているので設定不要です。
続いて、.env.productionを編集します。

cp .env.production.sample .env.production
vi .env.production

LOCAL_DOMAINの部分を自分のドメインに変えます。私は「m.yagi.tc」にしました。
メールアドレスは設定しなくても済む方法がありますが、私は個人用にGoogle Apps(GSuite)を使っているのでアカウントを払い出して設定しました。

# Federation
LOCAL_DOMAIN=m.yagi.tc
LOCAL_HTTPS=true
...省略...
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_LOGIN=mastodon@yagi.tc
SMTP_PASSWORD=********************************
SMTP_FROM_ADDRESS=mastodon@yagi.tc

ビルドします。1時間ほどかかります。

docker-compose build

ネットワークとボリュームを作成します。

docker network create proxy-network
docker volume create --name=mastodon_public_assets
docker volume create --name=mastodon_public_system
docker volume create --name=mastodon_postgres
docker volume create --name=mastodon_redis
docker-compose run --rm mastodon-web rake secret
docker-compose run --rm mastodon-web rake secret
docker-compose run --rm mastodon-web rake secret

数分かかります。
3回繰り返した”docker-compose run –rm mastodon-web rake secret”の結果得られたキーを.env.productionに追記します。

vi .env.production

以下のように編集します。

PAPERCLIP_SECRET= 取得できたキー1
SECRET_KEY_BASE= 取得できたキー2
OTP_SECRET= 取得できたキー3

データベースのマイグレーションとフロントエンドのプリコンパイルを行います。10分ぐらいかかります。

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

立ち上げます。

docker-compose up -d

続いて、Let’s Encryptをインストールします。”./letsencrypt-auto –help”は10分ほどかかります。

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

nginxをインストールします。

sudo apt-get install nginx

証明書を取得します。

./letsencrypt-auto certonly --webroot -d m.yagi.tc --webroot-path /var/www/html

メールアドレスを入力し、利用規約を読んだ上で同意します。

$ ./letsencrypt-auto certonly --webroot -d m.yagi.tc --webroot-path /var/www/html
Requesting root privileges to run certbot...
  /home/pi/.local/share/letsencrypt/bin/letsencrypt certonly --webroot -d m.yagi.tc --webroot-path /var/www/html
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for m.yagi.tc
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/m.yagi.tc/fullchain.pem. Your cert will
   expire on 2017-07-30. To obtain a new or tweaked version of this
   certificate in the future, simply run letsencrypt-auto again. To
   non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"
 - If you like Certbot, please consider supporting our work by:
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

このような結果になります。
もし「Failed authorization procedure. m.yagi.tc (http-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Could not connect to m.yagi.tc」などと出ている場合は指定のドメインに到達できず鍵が作れていませんので、アクセスできることを確認してから再実行してください。
nginxの設定を編集します。

sudo vi /etc/nginx/sites-available/m.yagi.tc

MastodonのGitHubドキュメントを丸コピーして必要なところだけ編集します。
編集箇所は矢印で示した7箇所です。http2を除外するのはRaspbian用のnginx最新版(1.6.2)ではまだHTTP/2に対応していないためです。

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}
server {
  listen 80;
  listen [::]:80;
  server_name m.yagi.tc; ←ホスト名
  # Useful for Let's Encrypt
  location /.well-known/acme-challenge/ { allow all; }
  location / { return 301 https://$host$request_uri; }
}
server {
  listen 443 ssl; ←http2を除外
  listen [::]:443 ssl; ←http2を除外
  server_name m.yagi.tc; ←ホスト名
  ssl_protocols TLSv1.2;
  ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_certificate     /etc/letsencrypt/live/m.yagi.tc/fullchain.pem; ←鍵の場所
  ssl_certificate_key /etc/letsencrypt/live/m.yagi.tc/privkey.pem; ←鍵の場所
  ssl_dhparam         /etc/ssl/certs/dhparam.pem;
  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 0;
  root /home/pi/mastodon/public; ←ドキュメントルート
...省略...

DH鍵を作成し、設定を有効化する準備をします。15分ほどかかります。

sudo openssl dhparam 2048 -out /etc/ssl/certs/dhparam.pem
sudo ln -s /etc/nginx/sites-available/m.yagi.tc /etc/nginx/sites-enabled/m.yagi.tc

準備ができたら事前テストをかけます。

sudo nginx -t

このような結果が出たら大丈夫です。

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

nginxを再起動し、設定を有効化します。

sudo service nginx restart

これでローカルIPアドレスを指定してHTTPSで接続すればこのようなページが表示されます。(ローカルIPアドレスだと証明書とURLが異なるのでブラウザの警告が出ます)

これで終わりです。お疲れ様でした。

Raspberry Piインスタンス公開のお知らせ

私のRaspberry Pi 3を使って立ち上げたインスタンスを期間限定で一般に公開しています。
(11/30まで。終了後は一切のデータは消去します)
とっても重いので、無理のある使い方をしていることを理解した上で使ってください。
https://m.yagi.tc/

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です