【Misskey】GCE×Cloudflareで構築してみた

7月に入ってtwitterがAPIに一部制限をかけたことを発端にそれまでの新興SNSの熱がまた一段階盛り上がったような感じがしますね。しかしながらその移住先はこれといってスタンダードなものはまだ定まっておらず、群雄割拠の様相を呈しています。私の周りの人類の皆さんも移住先に悩んでいるようです。

（⏬私のインターン先の社員さんとのTwitter）
![スクリーンショット 2023-07-06 23.37.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/94148d33-bd26-66e9-0f87-2f4ae641ebd9.png)
![スクリーンショット 2023-07-06 23.37.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/00d00967-8f72-65b2-14f6-8fa1b9c3612d.png)

今回はそんな新興SNSの中で注目を集めているMisskeyをGCE（Google Compute Engine）×Cloudflareで構築してみたのでその様子を書いてみたいと思います。なお、MisskeyがTwitterとどう違うのか、特にFediverseの考え方については書かないので良い感じにググってください。

# 何でMisskeyにしたのか

Misskey作者のしゅいろさんの開発に対する姿勢が個人的に凄く好きで応援したいからです。
しゅいろさんは[Misskey開発ブログ](https://gihyo.jp/article/2023/02/misskey-01)の中で「最新のWeb技術を貪欲に取り入れる」というのがMisskeyの開発の特徴の1つになっていると触れています。もちろん賛否あると思いますが、私は技術を愛する人間として開発者はかくあるべきだと思いますし、OSSであるMisskeyにおいてはそれは尚のことです。

例えば特にKoaはまだまだモダンな技術だと思いますが、それを既にFastifyにリプレース済みという徹底ぶりは凄いなと思いました。

> 「⁠貪欲に」というのは、たとえその時点で対応しているブラウザが少なくても採用するということです。

> 最新の技術なので、もちろんブラウザのバージョンが少し古いだけでも動作しません。しかし最新の技術を取り入れることによるメリット（他にはない機能を提供できたり、パフォーマンスを向上できたり）のほうを重視しています。


また国産SNSというのもポイント高かったですね。

# Cloudflareのセットアップ

Cloudflareにはドメインの管理とオブジェクトストレージの機能を担当してもらいます。

ドメインを取得できたら、DNSの設定に後述するGCEの外部IPをAレコードとして追加しておきます。

![スクリーンショット 2023-07-07 0.37.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/980b22ed-9b4a-7603-7179-0a8de46bfc42.png)

暗号化モードを「フル」にしておきましょう。これでエンドツーエンドの暗号化通信が行われます。

![スクリーンショット 2023-07-07 0.41.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/788a93b5-fc8d-61d8-0303-8d261ab24154.png)

それからCloudflareはデフォルトでレスポンスをキャッシュしてくれちゃうので/apiルートだけはその対象から外しておきましょう。

![スクリーンショット 2023-07-07 0.44.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/4b9df7ce-a7fc-a94b-5bca-cde93e3f8749.png)


# GCEのセットアップ

GCEにはwebサーバ(nginx)とappサーバ(nodejs)とKVS(Redis)とRDB(postgres)を担当してもらいます。モリモリですね。

とりあえず請求先の設定やプロジェクトの作成は良い感じにやっておきましょう。画面をぽちぽちしてインスタンスを立てます。気をつけるのは以下のポイントです。

- e2.smallインスタンスを選択すること。他のMisskeyサーバ構築記事ではe2.microで構築しているものもありましたが私は `pnpm install` が数十分経っても終わらなくて最初からやり直すことになったのでe2.smallを選択することをおすすめします。ただしこの場合無料枠は使えません。
- Ubuntu 20.04 LTSを選択すること。後で使うMisskeyの構築用シェルスクリプトがUbuntuを前提としているためです。
- HTTP,HTTPSアクセスを許可すること。チェックを入れるボックスがあります。
- ディスクサイズは20GBにしておくこと。セットアップが全部終わると使用量は7GBくらいになります。下限の10GBでも動くとは思いますが念の為20GBで取っておくと安心です。

写真は結局やり直すことになった１周目の設定です。気にするところはこの辺なのでポイントをよく確認しておきましょう。

![スクリーンショット 2023-07-06 15.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/2d990684-41ac-836a-baa9-66b983347588.png)

![スクリーンショット 2023-07-06 15.20.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/f83151cc-d119-6585-41b2-57817e2d9b3d.png)

インスタンスが起動したらCloudflareのさっきのDNSに外部IPを登録しておきましょう。

その後詳細画面からSSHでインスタンスに入ります。そうしたら後は[公式のシェルスクリプト](https://misskey-hub.net/docs/install/bash.html)に従って進んでいくだけです。そしてしばらく待つとMisskeyのロゴ文字が出てきて程なくサーバが立ち上がりました。

途中nginxやDockerを使うかどうかを聞かれます。サーバが１台だけなのであればnginxは使っておいた方が良いですし、DockerもDocker Hubにあるイメージを使うとビルドが不要になるので私はどちらもYesで進めました。

![スクリーンショット 2023-07-06 20.26.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/e7cac9bf-496a-4a12-385c-3d530992e424.png)

yeaaaaaah✨

# 立ち上がったら

早速サーバに入って投稿したいところですが、その前にGCEのストレージを食わないようにオブジェクトストレージの設定をしておきます。Cloudflareのストレージは無料枠がけっこうあるので初期にはうってつけです。

Cloudflareには[R2](https://www.cloudflare.com/ja-jp/products/r2/)というストレージが用意されていて、月10GBまでは無料です。

こちらの記事をまんま行っただけですが以下のポイントに気をつけます。

https://qiita.com/hihumikan/items/1f692f3bd5516820e0ec

- 記事の途中、Misskey側でRegionはus-east-1を選択して, proxyのチェックを外しておかないと動きません。
- R2のAPIトークンにはクライアントIPフィルタリングをかけられます。GCEの外部IPのみをIncludeに設定しておきましょう。
![スクリーンショット 2023-07-07 0.57.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/2b96430a-f24f-dac0-1748-5aa172716a6e.png)

試しに画像をアップロードしてみてぼやけずに表示されていればちゃんと設定できています。

# ebi-aquarium

こちらが今回立てた私のmisskeyインスタンスです。登録も開放しているのでぜひdiveしてもらえると嬉しいです。

https://toshiaki-ebisawa.uk

Have a nice dev day!!