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のログを書きたい。