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