mastodon サーバー立ち上げ手順
Twitterが当初の輝きを失い続けていると嘆かれて久しい。
いつか来るであろう †ZERO DAY† に備え、いい加減駆け込み寺としてのMastodon インスタンスを建立する練習をしておこうと思った。
概要
- Docker に Mastodon 動作環境を展開する
- 実用に耐える環境とするため、独自ドメイン取得と外部公開可能なSSL化も行う
前提
- 応用情報程度の知識と基本的なUNIX系OSのCLIが扱えること
- インターネットに接続可能なマシンが用意されていること
- そのマシンがパブリックIPを持つ、またはルーターによるアドレス変換等でインターネットへ公開できること
- AWSのアカウントを持っていること
DNSレコードの管理を Route 53 で行うことを想定しています。
すでに何らかのレジストラーにアカウントを持っている人は、そちらで同等の機能があると思います。
流れ
- OSのインストール
- ドメイン取得
- SSL/TLS証明書の取得
- Nginx リバースプロキシの設定
- Docker環境の構築
- Mastodon のソースコード取得と初期設定
- 起動!
OSのインストール
- 省略します
「最近はいろんなクラウドサービスあるし…」「1からOSインストールなんてするのお年寄りくらいだよね〜」って女子高生がマックで言ってました - CentOS 7 を前提とします
- Fedora 28 - 30 あたりでも多分いけると思います
その場合はパッケージマネージャーのコマンドを dnf に置き換えてください- Fedora 31 は cgroup のメジャーアップデートにより2020年2月時点でも docker を動かすのがかなり困難なようです。
- まっさらのOSが用意できたら、まずはパッケージの更新をしておきます
sudo yum update -y
ドメインの取得と設定
- Route 53 でお好きなドメインを取得します。
- 他のレジストラーで登録したドメインを使う場合、ネームサーバーはAWSのものを指すように設定してください。
ここでは osu.si というドメインを使い、ホスト名を don にすることで
Mastodon サーバーのFQDNを don.osu.si とする前提で進めます。
- don.osu.si のAレコードを設定します。
この後の証明書発行までにdon.osu.siが固定ipに紐づけられている必要があります。
設定したAレコードが実際にインターネット上から正引き可能かどうかは このサイト を使うといい感じに確認できます。
SSL/TLS 証明書の取得(前準備)
みんな大好きLet’s Encryptを使います。
注) ここからの手順は Nginx を稼働するマシン上で行います。docker ホストサーバーと Nginx マシンを分ける場合は注意してください。
もちろん固定IPの80番ポートも直接又はアドレス変換で Nginx マシンに割り当てられている必要があります。
- yum でいっぱい色々収録されてるEPELリポジトリの追加
sudo yum install -y --enablerepo=epel
- Nginx と certbot をインストールする
sudo yum install -y certbot nginx
- ポートを解放する
sudo firewall-cmd --add-port=80/tcp --zone=public --permanent sudo firewall-cmd --add-port=443/tcp --zone=public --permanent sudo firewall-cmd --reload
SSL/TLS 証明書の取得
- Nginx マシン上でコマンドを実行する
sudo certbot certonly --standalone -d don.osu.si -m admin@hoge.com --agree-tos -n
しばらく経つと Congraturations! と出て、発行された証明書のパスが出力されます。
Nginx への証明書の設定
- /etc/nginx/conf.d/don.conf ファイルを作り、とりあえず下記のように書きます。
ssl_certificate 及び ssl_certificate_key に certbot で表示されたパスを指定します。map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; listen [::]:80; server_name don.osu.si; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name don.osu.si; ssl_protocols TLSv1.2; ssl_ciphers EECDH+AESGCM:EECDH+AES; ssl_ecdh_curve prime256v1; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_certificate /etc/letsencrypt/live/don.osu.si/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/don.osu.si/privkey.pem; root /usr/share/nginx/html; }
Webからの接続テスト
- Nginx を起動します。(boot後自動起動設定もしときます)
sudo systemctl start nginx sudo systemctl enable nginx
- https://don.osu.si へアクセスできるか確認します。
CentOS のWelcomeページが表示されるはずです。 http:// へアクセスしても、https:// へリダイレクトされます。
Nginx の設定は一通り終わりました。
あとで Mastodon サーバーが整ってきたら少しnginxの .conf ファイルを設定しますが、ここれ移行は基本的に docker ホストサーバーでの作業が続きます。
Docker 環境の構築
- docker ホストマシン上で行います。
- yum ではインストールしません。 Docker 公式の手順に従います。
- 公式リポジトリを yum へ追加
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- docker のインストールと有効化
sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker sudo systemctl enable docker sudo docker version
- docker-compose のインストール(バイナリのDL)
URL注のバージョン部分 x.xx.x は github記載のリリース を参考に書き換える。
sudo curl -L https://github.com/docker/compose/releases/download/x.xx.x/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-comose docker-compose --version
Mastodon のソースコード取得
/var/mstdn というディレクトリを作り、そこに諸々を配置することにします。
また、一連の作業は mastodon 専用ユーザーで行います。
- ユーザーの作成とグループ設定
sudo groupadd -g 991 mastodon sudo useradd -g mastodon -u 991 mastodon sudo usermod -aG docker mastodon sudo mkdir /var/mstdn sudo chown mastodon:mastodon /var/mstdn
- git のインストール
sudo yum install -y git
- ソースコードから docker-compose.yml を取得
cd /var/mstdn wget https://github.com/tootsuite/mastodon/blob/main/docker-compose.yml
docker-compose の設定変更
docker-compose.yml を編集します。
- db: のセクションに次の環境変数を追加します。
environment: - POSTGRES_HOST_AUTH_METHOD=trust // docker内部ネットワークのためtrust
- web: 及び streamingのセクションのportsの値を編集します。
nginxをdocker ホストマシンに同居させる場合、この編集は不要です。
ports: - "127.0.0.1:3000:3000" // 127.0.0.1: を取り除く ↓ ports: - 3000:3000 //streaming の 4000 の部分も同様にする
SparkPost の設定
ビルド完了を待っている間に SparkPost の登録と設定をします。
Mastodon ではアカウント作成にメール送信による認証をするため、メッセージ送信用メールサーバーが必要です。自分のメールサーバーがあればいいですが、SparkPostにあやかるとメールサーバーがなくても大丈夫です。
- 登録 します。
- Configuration -> Sending Domains でドメイン(don.osu.si)を追加します。
- ドメインの認証をします。
Sending Domains -> Set Up For Sending に表示されているTXTレコードを Route 53で登録し、DNS伝播の確認が取れたら Verify TXT Record をクリックします。 - Set Up For Sending の DNS Settings に緑のチェックが入り Status が Pending になればOKです。mastodon を起動する頃には Status が Verified になります。
- Configuration -> API Keys でAPIキーを取得します。後ほど .env.production の中に記入します。
nginx の追加設定
マシンの性能によっては SparkPost の作業が完了してもビルドが終わっていないかもしれません。この間に nginx の設定も終わらせてしまいます。
今すぐできない場合、mastodonサーバーの起動直前でも大丈夫です。
- nginx のマシンに戻り、/etc/nginx/conf.d/don.conf を編集します。
下記の3項目を除き、基本的に全て ここのサンプル と同じにします。 個別で調整するのは root と2箇所の proxy_pass の合計3項目です。- root は今回の場合 /var/mstdn/don.osu.si/public です。
- proxy_pass はそれぞれのサーバーのパスです。
mastodon 環境設定
mastodon インスタンス起動前の設定を行います。
- 下記のコマンドを実行すると対話形式でセットアップが進行します。
docker-compose run --rm web bundle exec rake mastodon:setup
一番最初にドメイン名を聞かれるので、取得した自分のドメイン(ここではdon.osu.si)を入力します。あとは全部デフォルト(入力なしでエンター)で問題ありません。
- 全設定内容のテキストが下記のようにコンソールに出力されます。
LOCAL_DOMAIN から SMTP_FROM_ADDRESS の行を .env.production ファイルに書き込み、保存します。This configuration will be written to .env.production Save configuration? Yes Below is your configuration, save it to an .env.production file outside Docker: # Generated with mastodon:setup on 2021-01-23 13:27:28 UTC LOCAL_DOMAIN=tt.osu.si SINGLE_USER_MODE=false SECRET_KEY_BASE=xxx OTP_SECRET=xxx VAPID_PRIVATE_KEY=xxx VAPID_PUBLIC_KEY=xxx DB_HOST=db DB_PORT=5432 DB_NAME=postgres DB_USER=postgres DB_PASS= REDIS_HOST=redis REDIS_PORT=6379 REDIS_PASSWORD= SMTP_SERVER=smtp.hogehoge.com SMTP_PORT=587 SMTP_LOGIN= SMTP_PASSWORD=xxx SMTP_AUTH_METHOD=plain SMTP_OPENSSL_VERIFY_MODE=none SMTP_FROM_ADDRESS='Mastodon <notifications@don.osu.si>' It is also saved within this container so you can proceed with this wizard.
- 最後にDBマイグレーションが完了した後、adminユーザーの初期パスワード等が出力されます。忘れずに記録しましょう。
Eメール 送信設定
前の手順で保存した .env.production を一部編集し、SparkPost経由で通知メール等を送信できるようにします。
…
SMTP_SERVER=smtp.sparkpostmail.com
SMTP_PORT=587
SMTP_LOGIN=SMTP_Injection
SMTP_PASSWORD=xxxxxxxx ← SparkPost で取得したAPIキー
SMTP_FROM_ADDRESS=notifications@don.osu.si
…
起動!
- 起動じゃァーーーードコドコドコドコ
docker-compose up -d
お疲れ様でした。https://don.osu.si/ にアクセスし、動作を確認します。