
個人開発 | 環境構築の考察メモ
個人開発の環境構築について考察したメモです
随時更新していく予定です
やりたいこと
基本構成
まずは、基本的な構成を考えた

DNSサーバー
・名前解決
http サーバー
・URL おび HTTPを理解してもらう
アプリケーションサーバー
・実装するソースコードを置くところ
・httpサーバーと通信してDBにアクセスしたりできる
リアルタイム通信サーバー
・音声チャット専用のサーバー。レイテンシー低遅延を実現予定。
バッチサーバー
・仕様により、外部API叩いて、週次でDBのレコードを一括更新したい
DBサーバー
・永続化したいデータを保存する
技術選定
事例をいろいろ見てみると、以下の技術で実装すると、コスパがよさそう

Honoで完結できそう
当初は、Google Cloudの Cloud Run でアプリケーションサーバーを建てようと思ったけど、以下の記事で、CloudflareからDBにTCPで直接アクセスでそう
そうなると、アプリケーションサーバーを切り離す理由がなくなる。
Honoでどこまで実装できるかによるけど、不都合があれば、Google Cloudの Cloud Run でアプリケーションサーバーを建てようと思う
バッジサーバーは、Google Cloud Runを採用
AWS App Runner と悩んだけど、事例が多いCloud Runを採用した。
パフォーマンスが良さそうなGolang試してみる。
DBはNeon
Neon、PlanetScale、Supabase で迷ったけど、コストがよさそうなNeonを採用した
リアル通信サーバーはJanus Gateway
Agoraと迷ったけど、Janus Gatewayを採用する。
Agoraは、サーバー構築が不要で便利なんだけど、無料プランが月額10,000分間しかつかえない。
見積もり
各Passのフリープランで、どれぐらいのユーザ数のアクセスに耐えれるか計算してみる
Cloudflare Workers
Requests:
100,000 per day : 無料プランでは、1日あたり最大100,000回のリクエストを処理することができます。リクエストとは、Worker(あなたのコード)がクライアントや他のサーバーから受け取るHTTPリクエストのことです。
Duration:
No charge for duration : 使用時間(コードの実行時間)に対して追加料金は発生しません。要するに、コードがどれだけの時間を実行されても、その時間に対しては課金されないということです。
CPU time:
10 milliseconds of CPU time per invocation : 無料プランでは、コードが一度呼び出される(invocation)ごとに、最大で10ミリ秒間のCPU使用時間が許可されます。もしコードの実行が10ミリ秒を超えると、実行は中断される可能性があります。
1ユーザーがアプリを使用するたびに叩くリクエスト数は、仕様的におそらく50回もいかない気がする。
1日5回はアプリを使用と想定した場合、1ユーザーが叩くリクエスト数は多くても、250回になる
なので、Daily Active Usersが400ユーザー(100,000 ➗ 250)であれば無料プランでも耐えれそう
ここらへんは、実際にリリースしてみないとわからないけど、仮説として持っておく
Daily Active Usersの監視には、Firebase を使用する。
CPU timeに関しては、どうなるかわからないなー。
これはHoneで実装しながら、確認する必要がある
OSでCPU timeを取得できるぽいので、10ミリ秒間を超えたら、Error Reporting API エンドポイントでGCPになげれば検知できそう
Cloud Run
Google Cloud Platform 料金計算ツール で見積もりしたら、月額3.22円でいけそうだ。(ほんとうかな)
仕様的に、週次で、数万行のレコードを更新しそう
どれぐらいのスペックが必要なのか現時点ではイメージつかない

Neon
Pro プランを使用する
Janus Gateway
GCPのインスタンスにJanusいれて、インストールすれば良さそう最適化するには、インプットする必要がありそう
開発環境
Cloudflare Workersに関しては、wrangler を使ってにHonoを入れたらよさあそう
Goolge Cloud Run は Dockerで行う。そのままPushもできるみたい
Neonで開発環境、本番環境の両方が作れそう
(原文)
Neon fit well with Proposales’ workflow because they got the best of managed and local Postgres setup worlds. This shared cloud-based database can be branched into isolated environments for local development.
(日本語翻訳 - chatGPT)
Neonは、Proposalesのワークフローと非常に適しています。なぜなら、それは管理されたPostgresセットアップとローカルPostgresセットアップのベストな部分を組み合わせています。この共有クラウドベースのデータベースは、ローカル開発向けに分離された環境に分岐することができます。
まとめ
判断材料がある程度揃ってきたので、実際に開発してみる
参考資料
家族アルバム みてね のインフラをマルチリージョン化しました
初心者でも10分で分かるnginxの役割と使い方
GraphQL Server on Edge
エンジニア向け会社紹介資料 / company deck for engineers
Clubhouse リアルタイム配信の仕組みについて (妄想編)
一休.comのアーキテクチャ変遷から考えるサービス分割の勘所
コンテナ移行ってこんなに大変?
安く早く開発するための個人開発アーキテクチャ
Next.js × AWS App Runner × AWS AppSyncで進めるクライアントファーストのWEB開発
ZennにみるCloudRunとBigQueryによるアプリケーション構築 / zenn-cloudrun-bigquery-serverless
現状Cloudflare WorkersでGraphQLサーバを構築するならコレ
AWSサーバーレスバッチ処理アーキテクチャの構築
データベースの負荷分散を実現する「リードレプリカ」
Cloudflare Docs - Pricing
Database Integrationsを発表:数回クリックして、Workers上のNeon、PlanetScale、Supabaseに接続できます
バッチ処理 プラクティス
WebRTC Gateway JanusをGCPで動かす
WebRTC を今から学ぶ人に向けて
Cloudflare Workersフレームワーク「Hono」の紹介
Cloud Run サービスをローカルでテストする