Mastodonサーバをたてた
Mastodonブームをながめつつ、自分でOStatus実装を書いてみようかと思っていたが、思ったよりずっと大変そうであることを知る。いずれにしてもMastodon管理者もやりたいし、現物で動作確認もしたいので、自分専用インスタンスとしてhttps://sandbox.skoji.jp/を立てた。
設置時の基本的な情報ソースは公式のDocker guide、Production guide。これを含めた各種公式ドキュメントはtootsuite/documentationからたどることができる。
前提
このブログを運用しているサーバを使う。さくらのVPS、CentOS7、nginx、すでにLet’sEnceryptによるSSL導入済み。
サーバ設定
Dockerのインストール
まずここの手順通りDockerをインストールする。
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce
docker-composeをインストールする。
curl -L https://github.com/docker/compose/releases/download/1.13.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
dockerを起動する。
systemctl enable docker
systemctl start docker
Let’s Encryptの設定
今回mastodonを設置したsandbox.skoji.jp
を追加する。
cd /opt/letsencrypt/
sudo ./certbot-auto certonly --standalone
あとは指示に従う。
ただし、すでにskoji.jp
の証明書を作ったあとだと/etc/letsencrypt/live
などにskoji.jp-0001
というのができてしまう。今回は手動で書き換えたが、もっと良い手があるだろう。
SELinux対応
semanage port -a -t http_port_t -p tcp 3000
mastodon用ユーザ作成
sudo adduser -s /sbin/nologin mastodon
sudo gpasswd -a mastodon wheel
sudo gpasswd -a mastodon docker
このあとsudo su mastodon -s /bin/bash
でユーザmastodonになっておく。
Mastodonの設置
Mastodon取得
cd /opt/
sudo git clone https://github.com/tootsuite/mastodon.git
sudo chown -R mastodon mastodon
cd mastodon
git checkout v1.3.3
Mastodon設定
docker-compose.yml
を変更する。以下のようにVolumes
の部分をコメントアウトして、DBとredisのデータを/opt/mastodon
以下に永続化する。
db:
restart: always
image: postgres:alpine
### Uncomment to enable DB persistance
volumes:
- ./postgres:/var/lib/postgresql/data
redis:
restart: always
image: redis:alpine
### Uncomment to enable REDIS persistance
volumes:
- ./redis:/data
.env.production.sample
を.env.production
にコピーして編集する。DB関連は適切な値を設定しておく。
LOCAL_DOMAIN=sandbox.skoji.jp
LOCAL_HTTPS=true
DB_USER=xxxx
DB_NAME=xxxx
DB_PASS=xxxx
つぎに、PAPERCLIP_SECRET
, SECRET_KEY_BASE
, OTP_SECRET
をうめていく。
次のコマンドを3回実行し、それぞれの結果を各SECRETに設定する。(初回のdocker-composeは時間がかかる)。
/usr/local/bin/docker-compose run --rm web rake secret
メール対応
SparkPostを使う。 SparkPostに登録、ドメインを設定、DKIM RecordをDNSサーバーに設定する。
その上で、.env.production
のemail設定を書く。
nginx設定
/etc/nginx/conf.d/mastodon.conf
に、Mastodonの公式設定例をまずコピーする。
example.com
を、今回使うsandbox.skoji.jp
に書き換える。
rootを書き換える。
root /opt/mastodon/public;
その他、以下の設定を追加する。
access_log
, error_log
の場所を書く。
sandbox.skoji.jp
のserver
セクション直下。
access_log /var/log/nginx/mastodon-access.log;
error_log /var/log/nginx/mastodon-error.log;
assetなどのセクションに追記をする(私の環境ではこれがないと、cssやイメージが404になってしまった)
location ~ ^/(assets|system/media_attachments/files|system/accounts/avatars) {
add_header Cache-Control "public, max-age=31536000, immutable";
try_files $uri @proxy; # この行を追加
}
cron追加
日時実行のcronをmastodonユーザで追加する。
0 2 * * * cd /opt/mastodon && /usr/local/bin/docker-compose run --rm web rake mastodon:daily
この例は、毎晩午前2時にdailyのタスクを実行する。
起動
まずnginxのリロードを行う(すでに起動しているので)。
systemctl reload nginx
dockerを起動する。
docker-compose build
docker-compose up -d
db:migrate
、assets:precompile
実行
docker-compose run --rm web rails db:migrate
docker-compose run --rm web rails assets:precompile
このあたりで、https://sandbox.skoji.jp
にアクセスできた(はず)。
ユーザ登録後、Mastodonの管理者権限を渡す。
docker exec -it mastodon_web_1 /bin/sh
RAILS_ENV=production bundle exec rails mastodon:make_admin USERNAME=<登録したユーザ>
これで完了。
その他
- IPv6設定を追加(AAAAレコードなど)したが、nginxの設定が中途半端だと、いろんなことが起きる。もともとのブログやトップページ設定で、IPv6アドレスでのlistenを書いていないと、全部mastodon側にいってしまう、など。
- 外からIPv6では見えるようになったけれども、DockerコンテナがIPv6を話せない状態。なので、IPv6オンリーなインスタンスとは通信ができないと思われる。
- Daily cronのログを書きたい。