このブログはCMSとしてHerokuにデプロイされたStrapiを利用している。そしてそのHerokuだが無料で使うことができたのはもはや過去の話。現在はお金を払わないとどんなに小さいアプリでも動かすことができない。自分も一番安いEco dynoプラン月5ドルとデータベースとしてHeroku Postgresアドオン月5ドル、合計10ドルを毎月払いながらこのブログを運用している。誰も見てないのに。
もちろんこれは一時的な措置のつもりでいずれは移行するつもりであったが、なんやかんや1年以上この構成で放置していた。このままずるずるHerokuに無駄金を払い続けるわけにはいかんと、重い腰を上げてStrapiを自宅サーバに移行することにする。
移行計画
自宅サーバといってもデプロイ先はRaspberry Piだ。まず移行前後の構成図を載せよう。
フロントエンドにはAstroを採用し、Cloudflareで動かしている。だから自宅にStrapiを移行した後も、インターネットからは疎通するようにしなくてはならない。(加えてCloudflare以外からは接続されないようにしたい。)
移行後の構成図はこちら。Strapi on Raspberry PiはDockerで動かすことにする。StrapiコンテナとPostgresコンテナだ。そして、インターネットからの疎通確保についてだが、Cloudflare Tunnelを使うことにした。
Cloudflare Tunnel
Cloudflare Tunnel provides you with a secure way to connect your resources to Cloudflare without a publicly routable IP address. With Tunnel, you do not send traffic to an external IP — instead, a lightweight daemon in your infrastructure (cloudflared) creates outbound-only connections to Cloudflare's global network. Cloudflare Tunnel can connect HTTP web servers, SSH servers, remote desktops, and other protocols safely to Cloudflare. This way, your origins can serve traffic through Cloudflare without being vulnerable to attacks that bypass Cloudflare.
Cloudflare Tunnelはすごい。正直これがなかったら移行はやめてたかもしれない。自宅サーバ側で固定のグローバルIPアドレスを用意しなくても、インターネットから安全に疎通できる接続を提供してくれる。一体どういう仕組みなのかと思ったら、まず「内→外」つまり「自宅→Cloudflare」の通信を行い、トンネルを確立する。トンネルを確立した後、外部からの接続は新しい接続ではなく「すでに張られているトンネルの中を逆方向に流れるデータ」として扱われる。まあ詳しくは公式ドキュメントを読むなり、AIに聞くなりしたほうがいいだろう。
逆にいうとトンネルを確立するためにはまずRaspberry Pi側からCloudflareへ通信を行う必要がある。そのためのコンポーネントがcloudflaredコンテナである。
Strapiにはデフォルトのパスワードによる認証機能が備わっている(もちろん有効にしている)。せっかくなので追加でCloudflare Accessによる認証もつけることにした。この認証は管理者である自分がAdminダッシュボードにアクセスする際にかかるものである。CloudflareからStrapiにアクセスする際は今まで通りRead OnlyのAPI Tokenで認証される。
そして、これらのCloudflare TunnelとCloudflare Access───
なんと無料!!!!!!
というわけで、移行を進めて行こうと思う。まずはRaspberry Piを買うところから───