さくらVPS + Cloudflare で misskey のインスタンスを立てる
はじめに
さくらVPS上に misskey インスタンスを立てる という記事を以前書いたのですが、あれから二カ月。事件は起こりました。
雑訳:一般ユーザーは1日600ツイートしか見れないようにするぞ!!お前ら外出ろ
これを受けて、急遽 misskey.io に大量の難民が押し寄せ、登録者が5万人も急増。アクティブユーザー数もなんと4倍になるというとんでもない民族移動が発生しました。
※その後、TwitterはXに改名、海外からもアクセスが殺到しなんとユーザー数は更に倍に。こんなの絶対おかしいよ!!
misskey.io だけでなく、様々な公開インスタンスもユーザーが爆増。急遽、新規ユーザーの登録を制限するなど、インターネット中に激震が走りました。
そして、私が作った、個人用インスタンスも
ふ、増えてるぅぅぅ!! (歓喜
という事で、これを気に 「もうちょっと人が集まっても良いようにインスタンスを整備しよう」 というモチベーションが爆増したので、前回のインスタンスよりは将来性とか色々を考慮した作りにしようと思い、インスタンスを新しく作りました。
大雑把な負荷試験しかしてませんが、(普通の使い方をすれば)計算上は同接100人くらいは耐えれるはずです。この記事はその構築の備忘録となります。
注意事項
- あくまで個人運営のインスタンスです。
- misskey.io のような大規模インスタンスを運営するのにはまだ適していません。
- ちゃんとするなら、DBのリードレプリカを設定したり、webコンテナと分離したりと、やるべきことはたくさんありますが、それらは本当に人が増えてどうしようもなくなったら対応するものとしますので、本記事では扱いません。
- さくらVPSを選んだ理由としては、使い慣れてて、どれだけ酷使しても固定費で済む程度の物です。
- 本当は自宅鯖にしたいのですが、自宅のインターネット環境の都合不可能なので、さくらを借りています。それ以外に深い理由はありません。
構成の概要
あらゆる通信は全てCloudFlareを経由させます。これは、misskeyの公式ドキュメントにあるCDNの設定 | Misskey Hub に書いてある通りの事をやっているだけなのですが、ドキュメントに書いてない利点としては、その後ろのoriginを変更すればユーザーのエントリーポイントは変わらないので、メンテナンスやスケーリングしやくなる。というのもあります。
(もう一つ強いて言うなら)個人的にこれまでCloudFlareを使ったことが無かったので、経験値稼ぎに使う事にしました。
オブジェクトストレージにCloudFlareR2を、メールサービスにAmazonSESを利用しますなんとAWSからサンドボックス解除の許可が一生降りなかったので、諦めてgmailを直接使う事にしました。 オブジェクトストレージは、Amazon S3 + CloudFront にするつもりでしたが、R2は下り転送料が無料という事で、こちらを採用しました。
さくらVPS上にmisskey インスタンスを立てる。
前回 とほぼ一緒ですが、違うところもあります。
今回は 「さくらVPSの8Gプラン Docker 実行環境」を選択します。ちょっと費用がかかりますが、これをダウンさせるくらいに人が集まったら負荷分散とかチューニングとかを考えようと思います。
パケットフィルターを確認する
さくらVPSにはパケットフィルターという機能があり、デフォルトではSSH以外のポートは全てふさがれています。(AWSでいうセキュリティグループのような物)
インスタンス側で、 iptables や ufw をいくら設定しても上手く通信できないときは、さくらVPSのコントロールパネルから、パケットフィルターを確認すると良いでしょう。
※: 画像では80/443も封鎖しているけど、外部公開時には80/443 は公開してください。
今回は、操作用のSSH用22ポートと、misskey 用の 443ポート、ドメイン認証用の80ポートを開いておきます。(SSHは自分の家からのみアクセスしたいため、IPアドレスを指定してそれ以外からの通信を遮断しています。
パッケージのアップデートと、ufw の設定
お約束の手順です。
# デフォルトパッケージの最新化
sudo apt-get upgrade -y
sudo apt-get autoremove -y
# nginx のインストール
sudo apt-get install nginx
# ufw で ssh と nginx を許可する
sudo ufw allow 'OpenSSH'
sudo ufw allow 'Nginx Full'
# ufwを有効に
sudo ufw enable
# Nginx と SSH だけが許可されているかを確認する事
sudo ufw status
他には、OpenSSHでログインするときに公開鍵でのみアクセスできるようにする などを設定しておくと良いかもしれません。
misskeyをビルドし起動する。
公式の手順通りです。dockerによる構築を選択していますので、 https://misskey-hub.net/docs/install/docker.html を確認します。特に留意点はないですが、素直に master ブランチでビルドすることをお勧めします。developブランチは7割くらいの確率で壊れています。
CloudFlareからさくらVPSをオリジンに指定する。
ここからが前回と違うところです。世界最強のCDN、Cloudflareを利用します。Cloudflareを介する理由は大きく三つあり
- 静的コンテンツなどをキャッシュする事でAppサーバーの負荷・通信料を下げる
- DNS管理やWAF等、自前で用意するには超面倒くさいセキュリティ周りをある程度肩代わりしてくれる
- スケーラビリティが上がる。
他にも、Turnstileを利用してCAPTCHAを別途登録しなくて良かったり、R2が使えたり、静的ページのホスティングが無料だったりと至れり尽くせりです。
まずは、ホームからサイトを追加します。
(サイト名は、開設したいドメイン名と一致させる事)
プランは、個人で遊ぶ分にはFreeで十分です。(商業でやるなら絶対PROは欲しい所ですが)
DNSを追加します。AレコードにさくらVPSのIPアドレスを指定し、プロキシするにチェックを入れます。
次に、SSL/TLSを設定します。
私の環境ではフル(厳密)を利用しています。エンドユーザーからCloudFlareへのアクセスがTLSで暗号化されるのは勿論ですが、CloudFlareとオリジンサーバーの間で変な通信が入るのを防ぎます。
この時発行されるSSL_CRTとSSL_KEYを、さくらVPSのnginxに指定してあげる必要があります。
最後に、キャッシュ
/api/
以下へのアクセスはAPI等でキャッシュしないようにする必要があります。
(※ misskeyは全体的に動作が重いので、キャッシュさせたほうが良いAPIは多分沢山あるけど、その辺は長期運営しているプロの皆様の知見をお待ちしております。
ここまで設定できると、misskey インスタンスにアクセスすることが出来ます。
CloudFlare R2をオブジェクトストレージに設定する
オブジェクトストレージもCloudFlare R2を使います。10GBまでなら無料です。そしてS3と違って下りの転送料無料です。最高。
オブジェクトストレージは個人的に3つに分けていて、一つがUGC、もう一つがアセット、最後はシステムです。それぞれ、ユーザーがアップロードする画像等を格納するバケット、アイコンやバナー等の静的ファイルを保管するバケット、log等、システムから吐き出したものをため込むバケット、にしています。ここでは最低限misskeyを立てる上で必要なUGCバケットだけ説明します。
と言っても特に解説する事は無く、バケットを作成し、APIキーを発行、misskeyのコントロールパネルにそれを設定するだけです。
利用規約をしっかり書く
インターネットは怖いところです。もちろん、技術的な防御もたくさん仕込むべきですが、利用規約で防御する事も大事です。一番怖いのは法律の恣意的な運用です。ある日突然、著作権保護法や刑法168条(いわゆるウィルス作成罪)や174条(いわゆる公然わいせつ罪)を理由に警察が壁ドンしに来るかもしれません。自分が「こういう投稿があると万が一に対処しきれないな…」と思った物は規約で禁止にすることをお勧めします。後から規約を緩めるのは簡単ですが後から厳しくするのはけっこう難しいです。
トラブルに対応できるマンパワーがあれば自由にやればいいと思うのですが、私はとても対処しきれる自信が無かったので、「何か起こった時に対処できないもの」は全部規約で禁止にしました。
他には……?
WAFを強固な設定にしたり、DDoS対策を仕込んだり、ログ監視ツールを仕込んだりなど、他にも可能な限り技術的なセキュリティを仕込んだりしています。仕込めば仕込むほど安心して寝れますね。
自鯖は立てるまではそんなに難しくなく、むしろ立ててから運用が大変なので、その辺のノウハウや知見が溜まったらまたこんな感じのゆるふわな記事を書こうと思います。
主に参考にした記事など
他、先人のmisskey鯖缶様たちから様々なアドバイスをいただきました!!ありがとうございます!!
Discussion