nob@lit-forge

Zenn のコメントで Vercel 無料枠の商用利用 NG を知り、Cloudflare でハマって Netlify に移行した話

自分が書いた Zenn 記事のコメント欄で「Vercel Hobby は商用利用禁止」と指摘され、AdSense と A8.net を貼っている lit-forge.com が明確に規約違反状態だと発覚。Cloudflare Workers 無料枠に逃げようとしたが Worker サイズ 3 MiB 上限で詰まり、最終的に Netlify Starter にゼロ設定で移行してダウンタイム無しで規約違反状態を解消した実録。

#Vercel#Netlify#Cloudflare#個人開発#AdSense

きっかけは Zenn のコメント 1 件

自分が書いたZenn の記事のコメント欄に「Vercel の Hobby プランは商用利用できないので規約違反ですよ」と指摘が入りました。 lit-forge.com は Vercel Hobby 無料枠で運営していて、AdSense と A8.net アフィリエイトを貼っていた ので、もし本当なら明確にアウトです。

コメントを鵜呑みにせず、Vercel 公式の Fair Use Guidelines を一次情報で確認しました。

Hobby teams are restricted to non-commercial personal use only. All commercial usage of the platform requires either a Pro or Enterprise plan.

さらに商用利用の具体例として、以下が名指しで列挙されていました。

  • 訪問者から支払いを受ける仕組み全般
  • 製品・サービスの販売告知
  • アフィリエイトが主目的のサイト
  • 広告掲載(Google AdSense を含むオンライン広告プラットフォーム)
  • 寄付の受付

「AdSense を貼っているだけで即アウト」と明記されている以上、言い逃れは無理。 **コメント主の指摘は正しかった**。

選択肢は 4 つ

月額結論
A. Vercel Pro に有料化約 ¥3,000最速だが広告収益が追いついてない時期は赤字
B. Cloudflare Pages / Workers に移行¥0無料で商用 OK、Next.js 対応
C. 広告を全部外す¥0収益ゼロ、本末転倒
D. 黙認¥0突然 BAN リスク、非推奨

「コストゼロ維持」を第一条件にしていたのでB を選択。 Cloudflare Pages は公式に「Free for commercial use」と明記されており、帯域も無制限。 コミュニティでも AdSense を貼った個人サイトが普通に運用されている前例あり。

Cloudflare でハマった: Worker size 3 MiB 上限

Next.js 16 を Cloudflare Workers で動かすには @opennextjs/cloudflare アダプターを使います。設定自体は難しくなく、wrangler.jsoncopen-next.config.ts を置いて Cloudflare Pages のダッシュボードから GitHub 連携でビルド…と進めたのですが、初回デプロイでエラー

✘ [ERROR] Your Worker failed validation because it exceeded size limits.

  A request to the Cloudflare API failed.
   - Your Worker exceeded the size limit of 3 MiB.
     Please upgrade to a paid plan to deploy Workers up to 10 MiB.

  Here are the 5 largest dependencies:
  - .open-next/server-functions/default/handler.mjs - 12563.76 KiB
  - .../@vercel/og/resvg.wasm - 1346.05 KiB
  - .open-next/middleware/handler.mjs - 423.14 KiB
  - .../@vercel/og/Geist-Regular.ttf.bin - 123.00 KiB
  - .../@vercel/og/yoga.wasm - 70.05 KiB

Cloudflare Workers Free プランのバンドル 3 MiB 上限に、 OpenNext が生成した handler.mjs(12.5 MiB)が収まりませんでした。 Paid プラン($5/月)に上げれば 10 MiB まで使えますが、それも gzip 後の比較で ギリギリ。そして $5/月は「コストゼロ維持」の方針に反する

バンドル削減の道もあります:

  • @vercel/og を除去して OGP 画像を静的 PNG にプリレンダリング (約 1.5 MB 削減)
  • Next.js を output: "export" で完全静的化し、API Routes を別 Worker に切り出す(handler.mjs そのものが不要になる)

ただし見積もり 5〜7 時間の作業で、しかも 3 MiB に収まる確証はなし。 5 時間かけて "微妙に超過" だと割に合わない。

Netlify ならゼロ設定で動いた

代替候補を調べ直したところ、Netlify の Acceptable Use Policy には 商用利用禁止の記載が存在しないと判明。金融詐欺・違法行為・スパムなどは 禁止だが、AdSense やアフィリエイトへの言及はゼロ。Vercel のような Hobby 限定 条項はありません。

しかも Netlify はNext.js 16 を OpenNext-Netlify アダプター経由で ゼロ設定サポート。関数サイズ上限も 250 MB と Cloudflare の 3 MiB とは比較にならない余裕。

Cloudflare の格闘を中止し、Netlify に方針転換しました。

移行で必要だった作業

所要時間はトータル 30 分ほど。コード変更は最小限。

1. Cloudflare 関連ファイルの除去

  • wrangler.jsonc / open-next.config.ts / public/_headers 削除
  • @opennextjs/cloudflarewrangler を dependencies から除去
  • next.config.ts から OpenNext の dev フックを除去

2. netlify.toml を追加

[build]
  command = "npm run build"
  publish = ".next"

[build.environment]
  NODE_VERSION = "22"

# 静的アセットのキャッシュヘッダ
[[headers]]
  for = "/_next/static/*"
  [headers.values]
    Cache-Control = "public, max-age=31536000, immutable"

これだけ。Next.js 16 は Netlify 側が自動検出してくれるので、ビルドコマンド や publish ディレクトリの設定は実質netlify.tomlがなくてもデフォルト で動きます。明示した方が将来の自分に優しいので書いています。

3. Netlify ダッシュボードの作業

  • GitHub 連携でリポジトリを選択
  • プロジェクト名: lit-forge-jplit-forgeは取られていた)
  • 環境変数 9 個を .env 形式で一括インポート(Upstash Redis 接続情報、Resend API Key、Discord Webhook、GA4 ID 等)
  • 「Deploy site」をクリック → 3 分でビルド成功

4. DNS 切替(お名前.com)

お名前.com の DNS レコード画面で、既存の Vercel 向けレコードを上書き:

ホストTYPE変更前 (Vercel)変更後 (Netlify)
@A216.198.79.175.2.60.5
wwwCNAME*.vercel-dns-017.comlit-forge-jp.netlify.app

DNS 伝搬は 5〜10 分で完了。Netlify が自動で DNS 検証し、 Let's Encrypt の TLS 証明書も自動プロビジョニング。

5. Vercel 側の後片付け

  • Vercel のプロジェクト設定 → Domains から lit-forge.com www.lit-forge.com を削除
  • プロジェクト本体は 1〜2 週間様子見してから削除予定(Upstash 連動削除の確認が先)

Upstash Redis はそのまま使えた

コメント機能と順位表で Upstash Redis を使っていたのですが、HTTP/REST API ベースなので接続元が Vercel でも Netlify でも まったく同じ。環境変数 KV_REST_API_URL KV_REST_API_TOKEN をコピペするだけで過去のコメント・順位表データがそのまま生き残りました

Vercel KV というブランドで提供されているのは実は Upstash の OEM なので、 「Vercel を抜けたらデータを失う」という心配は杞憂でした。Upstash 本体の アカウント(console.upstash.com)で直接所有権を管理できます。

学び

  1. コメント欄の指摘は一次情報で裏取りする価値がある。 Vercel の規約は自分では読んでいなかった。コメントがなければ 気付くのに数ヶ月かかっていたはず。
  2. 安易な「有料プラン回避」は罠。Cloudflare に 5 時間 かけて 3 MiB 圧縮を追求するより、Netlify に 30 分で移行した方が早かった。コスト判断は「時間コスト込み」でする
  3. HTTP ベースのデータストアはポータブル。Upstash Redis の ように REST API で完結するサービスは、ホスティングを乗り換えても そのまま使える。インフラ選定時に将来の乗り換え容易性を意識する価値あり。
  4. Netlify free tier の位置づけ: Vercel が「個人非商用のみ」 と明確に線引きしているのに対し、Netlify は商用利用を禁じていない。 個人開発の収益化サイトなら現時点では Netlify が第一候補。

結果

  • ✅ Vercel 規約違反状態を解消
  • ✅ コスト維持(月 ¥0)
  • ✅ 全機能動作継続(38 ツール・ブログ・順位表・コメント・admin・GA4)
  • ✅ ダウンタイムゼロ
  • ✅ 所要時間 30 分(DNS 伝搬時間含む)

同じ構成(Next.js + AdSense + Vercel Hobby)で運営している個人開発者は、 同じ罠にハマっている可能性があります。今すぐ Vercel Fair Use Guidelines を一次情報で確認し、必要なら早めに Netlify など商用 OK な無料サービスに移行することをおすすめします。

X

コメント(投稿は運営者の承認後に公開されます)

読み込み中...