Vercel/Supabase無料枠で月数百円に抑える構成と落とし穴
結論
個人開発の本番環境は、Vercel Hobby + Supabase Free をベースに、超過しやすい一部だけを従量課金へ逃がすことで、月額をドメイン代込みの数百円(実質コンピュート ¥0〜200程度)に収められる。ただし「無料」を維持できるかは、Supabaseの7日間アイドル停止とVercelの商用利用禁止条項という2つの地雷を踏まないかどうかで決まる。
根拠:無料枠の実数値
両者の無料枠は2026年時点で概ね以下。ここを超えた瞬間に課金 or 停止が走る。
| 項目 | Vercel Hobby | Supabase Free |
|---|---|---|
| 帯域 | 100 GB/月 | 5 GB/月 |
| DB容量 | — | 500 MB |
| 関数実行 | 100 GB-Hrs | Edge Function 50万回 |
| 停止条件 | 商用利用で要Pro | 7日間無アクセスでDB一時停止 |
落とし穴は容量超過よりも運用条件側にある。Hobbyは規約上「非商用」限定で、アフィリエイトや広告収益が乗ると規約違反になり得る。収益化するなら最初からVercel Pro($20)か、Cloudflare Pages等への退避を検討する。
手順
1. Supabaseのアイドル停止を防ぐ
無料DBは7日間アクセスがないと止まる。GitHub Actionsで定期的に軽いクエリを打って延命する。
# .github/workflows/keepalive.yml
name: supabase-keepalive
on:
schedule:
- cron: "0 3 * * *" # 毎日UTC3時
jobs:
ping:
runs-on: ubuntu-latest
steps:
- run: |
curl -s "$SUPABASE_URL/rest/v1/health?select=id&limit=1" \
-H "apikey: $SUPABASE_ANON_KEY"
env:
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }}
health は1行だけのダミーテーブルを用意しておくと帯域消費がほぼゼロで済む。
2. 帯域を食う画像をSupabaseから逃がす
Supabase Storageは無料枠5GB帯域が薄く、画像配信ですぐ枯れる。画像はVercelのCDN(100GB枠)側に寄せるのが定石。Next.jsなら最適化を効かせる。
// next.config.js
module.exports = {
images: {
remotePatterns: [{ protocol: "https", hostname: "*.supabase.co" }],
minimumCacheTTL: 86400, // 1日キャッシュで再取得を抑制
},
};
3. DB容量500MBの実測監視
500MBは意外と早く埋まる。とくにログ系テーブルとインデックス肥大に注意。
-- 容量を食っているテーブル上位5件
select relname,
pg_size_pretty(pg_total_relation_size(relid)) as size
from pg_catalog.pg_statio_user_tables
order by pg_total_relation_size(relid) desc
limit 5;
ログは created_at で定期DELETEし、VACUUM で物理回収する。放置すると枠は空かない。
4. コスト上限を明示的に固定する
Supabaseは Settings → Billing で Spend Cap を有効にしておく。これを切ると超過分が青天井で請求される最大の事故ポイント。VercelもPro移行時は Usage アラートを設定する。
まとめ
- Vercel:帯域100GB・商用は規約違反リスク → 収益化前にPro/退避を判断
- Supabase:7日停止と500MB・5GB帯域 → keepalive+画像はVercel側+Spend Cap必須
- 監視せず「無料だから」と放置するのが唯一にして最大の落とし穴。ドメイン代を除けば月数百円以内に十分収まる。
関連リンク
※自社商品(プロモーションを含みます)。
Top comments (0)