Mastodonブームをながめつつ、自分でOStatus実装を書いてみようかと思っていたが、思ったよりずっと大変そうであることを知る。いずれにしてもMastodon管理者もやりたいし、現物で動作確認もしたいので、自分専用インスタンスとしてhttps://sandbox.skoji.jp/を立てた。

設置時の基本的な情報ソースは公式のDocker guideProduction 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.jpserverセクション直下。

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