「個人プロジェクト、本番に出したいけど...サーバー代がなぁ」
AWSのEC2?月額けっこうかかる。Heroku?無料枠なくなったし。Vercel?バックエンドはちょっと...
そんな悩み、ありませんか?
私たちもありました。yaoyorozチームで開発中のRustアプリ「カゾエルくん」を「ちゃんと動く状態」で公開したい。でも、チームプロジェクトに月数千円は...(財布が泣いている)
playpark LLCもチームの一員として参加していて、インフラ周りを担当しています。(こういう泥臭い作業、嫌いじゃない)
そこで見つけた組み合わせがCloudflare Pages + Fly.io + Neon + Upstash。結論から言うと、月0〜5ドルで本番運用できています。
この記事で学べること
- Cloudflare Pages、Fly.io、Neon、Upstashそれぞれの無料枠と制限
- Rustアプリを4つのサービスに接続するアーキテクチャ設計
- 実際のデプロイ手順とハマりポイント
- 本番運用で気をつけること(とくにコスト管理)
前提条件
- Rustの基本的な読み書きができる(cargo build が怖くないレベル)
- Dockerの基本操作ができる(Dockerfile書いたことある程度)
- 各サービスのアカウント作成済み(無料で作れます)
- CLIツール:
fly、wranglerをインストール済み
アーキテクチャ
フロントエンド(Yew/WASM)はCloudflare Pages、バックエンド(Rocket)はFly.io、データベースはNeon、キャッシュはUpstash。それぞれ無料枠があるので、組み合わせるとコストゼロでフルスタック環境が手に入ります。
(「無料」という言葉に弱い開発者の図)
無料枠の確認
まず現実を見ましょう。各サービスの無料枠は:
| サービス | 無料枠 | 制限事項 |
|---|---|---|
| Cloudflare Pages | 無制限サイト / 500ビルド/月(毎日16回!) | ビルド時間20分まで |
| Fly.io | 小型VM 2-3台分(個人開発には十分) | メモリ256MB、共有CPU |
| Neon | 0.5GB / 190時間/月(サーバーレスで節約) | ブランチ10個まで |
| Upstash | 256MB / 50万コマンド/月(結構多い) | 使い方次第では足りなくなるので注意 |
正直、小規模な個人プロジェクトなら十分すぎるスペック。むしろ「使い切れない」ことのほうが多いです。(贅沢な悩み)
実装手順
Step 1: Neonの準備
まずはデータベース。Neonでプロジェクトを作成します。
# Neonの接続情報を取得したら、マイグレーション実行
cd app/backend/migration
DATABASE_URL="postgresql://[USER]:[PASSWORD]@[PROJECT_ID].neon.tech/neondb?sslmode=require" \
sea-orm-cli migrate up
ハマりポイント①: Neonはsslmode=requireが必須です。接続文字列に忘れずに追加しましょう。
Neonの良いところはサーバーレスなので、アクセスがないときは自動でスリープ。無料枠の190時間/月を効率的に使えます。(使わないときは課金されない、最高)
Step 2: Upstash Redisの準備
次はキャッシュ用のRedis。Upstashでデータベースを作成します。
# 接続確認
redis-cli -u "redis://default:xxxx@xxxxx.upstash.io:6379" ping
# → PONG
リージョンはTokyo (ap-northeast-1) を選択。Fly.ioのリージョンと合わせることでレイテンシを最小化できます。
Step 3: Fly.ioへのデプロイ
いよいよ本番。まずはアプリの初期化から。
cd app/backend
fly launch --name kazoeru-kun --region nrt --no-deploy
環境変数はシークレットとして登録します。
fly secrets set \
DATABASE_URL="postgresql://..." \
REDIS_URL="redis://default:..." \
ALLOWED_ORIGINS="https://kazoeru-kun.fly.dev" \
TARGET_VALUE="100000" \
SYNC_JOB_INTERVAL_SECS="60" \
STATUS_HISTORY_JOB_INTERVAL_SECS="86400" \
ROCKET_SECRET_KEY="$(openssl rand -base64 32)"
ハマりポイント②: ROCKET_SECRET_KEYを忘れるとセッション管理が壊れます。必ず設定しましょう。
そしてデプロイ。
fly deploy
ビルドに5〜10分かかります。Rustですからね...(コンパイル時間、知ってた)
Step 4: Cloudflare Pagesへのフロントエンドデプロイ
フロントエンド(Yew/WASM)はCloudflare Pagesでホスティングします。
cd app/frontend/yew-app
# 本番ビルド(TailwindCSS + trunk)
npm run prod
# Cloudflare Pagesへデプロイ
npx wrangler pages deploy dist --project-name=kazoeru-kun
wrangler.tomlで設定済みなら、GitHub Actionsで自動デプロイも可能です。mainブランチへのマージで自動的に本番環境へ反映されます。
ハマりポイント③: フロントエンドからバックエンドAPIを呼ぶとき、APP_API_ROOT環境変数でFly.ioのURLを指定します。CORS設定も忘れずに。
Step 5: 動作確認
fly status # 稼働状況確認
fly logs # ログ確認
fly open # ブラウザで開く
https://kazoeru-kun.fly.devにアクセスして動作確認。問題なければ完了です。
注意点・Tips
コスト管理のコツ
- Cloudflare Pagesのビルド数: 月500ビルドは十分ですが、PRごとにプレビューデプロイが走るので注意。必要なPRだけにしましょう
- Upstashのコマンド数: 月50万コマンドは多いようで、使い方次第では足りなくなります。TTLを適切に設定してread回数を減らしましょう
- Neonのコンピュート時間: 190時間/月なので、常時稼働だと足りません。サーバーレスの自動スリープを活用しましょう
- Fly.ioのスケール: 無料枠内で収めるなら、1台構成で十分
監視方法
fly logs # リアルタイムログ
fly dashboard # メトリクス(ブラウザ)
Cloudflare Pages、Neon、Upstashともにダッシュボードで使用量を確認できます。無料枠の80%くらいで通知が来るように設定しておくと安心。
トラブルシューティング
| 症状 | 原因(たぶん) | 対処法 |
|---|---|---|
| DB接続エラー | sslmode未設定 | 接続文字列に?sslmode=requireを追加 |
| Redis接続エラー | URLの形式ミス | redis://default:...の形式を確認 |
| デプロイ失敗 | メモリ不足 | fly.tomlでmemory設定を確認 |
まとめ
Cloudflare Pages + Fly.io + Neon + Upstashの組み合わせで、月0〜5ドルでRustフルスタックアプリのデプロイ環境を構築できました。フロントエンド、バックエンド、データベース、キャッシュすべてが無料枠で動いています。
yaoyorozチームではこの構成で開発を進めていますが、まだ課金されたことがありません。(使用量が少ないだけですが)
「本番環境にお金をかけたくないけど、ちゃんと動くものを公開したい」
そんな方には、この構成おすすめです。無料枠、使い倒しましょう。
あわせて読みたい
- Rocket FrameworkでRust APIサーバーを構築する — 本番運用を見据えたRust APIサーバーの設計パターン
- 【Rust】「非生産的」なWebアプリを作ってみた — Yew + Rocketフルスタック開発 — Rust統一フルスタック開発の実践記
→ 気軽に相談する



