Cloudflare Pages で静的サイトを無料ホスティング — GitHub 連携から独自ドメインまで
3つのホスティングサービスを試して、最終的にCloudflare Pagesに落ち着いた。理由は単純で、無料枠の太さが段違いだったからだ。
先月、個人で開発者向けのWebツール集を公開した。JSON整形、Base64エンコーダー、QRコード生成——フレームワークは使わず素のHTML/CSS/JSで組んだ全10ページほどのサイトだ。こういう静的サイトをどこに置くかは毎回悩む。Vercel、Netlify、GitHub Pages、Cloudflare Pages。候補はだいたいこの4つに絞られる。
1ヶ月ほど Cloudflare Pages で運用してみた結果と、セットアップ手順、ハマりポイントを書いていく。
Cloudflare Pages の無料枠が強すぎる
まず数字を並べる。
| サービス | 帯域(無料枠) | ビルド上限 | 備考 |
|---|---|---|---|
| Cloudflare Pages | 無制限 | 500回/月 | 同時プロジェクト100個 |
| Vercel | 100GB/月 | 6,000分/月 | 商用利用は有料プラン |
| Netlify | 100GB/月 | 300分/月 | フォーム機能が強い |
| GitHub Pages | 100GB/月 | 10回/時 | 公開リポジトリ推奨 |
帯域無制限。ここが決め手だった。
趣味サイトがたまたまバズったときに帯域超過で課金される心配がないのは、精神衛生上かなり楽だ。Vercel や Netlify の100GBも普通は十分だが、画像の多いページだと意外と消費する。OGP画像をページごとに置いているサイトなんかは特に。
CDNもCloudflareの本業だけあって速い。日本にエッジサーバーがあるから、国内ユーザーへのレスポンスは体感でまったく問題ない。
GitHub 連携で自動デプロイする手順
セットアップは拍子抜けするほど簡単だった。
ダッシュボードから設定する場合
- Cloudflare ダッシュボードにログイン
- 左メニューの「Workers & Pages」→「Create」をクリック
- 「Pages」タブで「Connect to Git」を選択
- GitHubアカウントを連携し、対象リポジトリを選ぶ
ビルド設定は、静的サイトならほぼデフォルトでいける。
フレームワークプリセット: None
ビルドコマンド: (空欄)
ビルド出力ディレクトリ: public
自分のサイトはビルドステップが不要な純粋なHTMLだったので、ビルドコマンドは空欄にして出力ディレクトリだけ指定した。8秒でデプロイが完了。速い。
CLI(Wrangler)でデプロイする場合
GUIが苦手な人、あるいはCI/CDに組み込みたい場合はCLIの方がいい。
# Wrangler のインストール
npm install -g wrangler
# ログイン(ブラウザが開く)
wrangler login
# デプロイ
wrangler pages deploy ./public --project-name my-site
自分は以前書いたClaude Code の cron 自動実行の仕組みと組み合わせて、シェルスクリプトからデプロイしている。コンテンツ更新のたびに手動でダッシュボードを触る必要がないので楽だ。
#!/bin/bash
# deploy.sh — 静的サイトをCloudflare Pagesにデプロイ
cd ~/my-project
npx wrangler pages deploy public \
--project-name my-site \
--branch main \
--commit-dirty=true
echo "デプロイ完了: $(date)"
GitHub連携を有効にしていると、pushのたびにCloudflare側でも自動ビルドが走る。CLIデプロイと二重になるが、ビルド不要の静的サイトならCLIの方が挙動をコントロールしやすいのでこっちをメインにしている。
独自ドメインの設定
デフォルトでは プロジェクト名.pages.dev というURLが割り当てられる。検証用にはこれで十分だが、SEOや見栄えを考えると独自ドメインを当てたい。
手順
- Cloudflareにドメインを追加し、ネームサーバーをCloudflareに向ける
- Pagesプロジェクトの「カスタムドメイン」タブでドメインを追加
- DNSレコードが自動設定される
SSL証明書も自動で発行・更新される。手動でLet's Encryptを設定する手間がないのは地味にありがたい。
ちなみに自分はドメインの取得にお名前.com
を使っている。取得後にCloudflareへネームサーバーを変更するだけで、あとはCloudflare側が全部やってくれる。
一つ注意点。外部DNSのままCNAMEだけ向ける方法もあるが、Cloudflareのプロキシ(CDN最適化やWAF)をフルに使いたいならDNS管理ごと移すのが手っ取り早い。
1ヶ月運用して気づいたこと
良かった点
- デプロイが速い——静的サイトなら5〜10秒で完了する。プレビューの確認まで含めても1分かからない
- ブランチプレビューが自動——mainブランチ以外にpushすると、ブランチごとのプレビューURLが勝手に発行される。レビューや動作確認に使える
- Web Analyticsが無料——PVとリファラーが見られる簡易アクセス解析。Google Analyticsほどの機能はないが、個人サイトには十分すぎる
ハマった点
- _redirects の改行コード問題——リダイレクトルールを定義する
_redirectsファイル、改行コードがCRLF(Windows形式)だとサイレントに無視される。Windowsで編集した人は要注意 - キャッシュが強すぎる——CSSを更新してもブラウザに反映されないことがあった。ファイル名にハッシュを入れるか、ダッシュボードからキャッシュをパージする必要がある
- Functionsの罠——Cloudflare Pages FunctionsというサーバーレスAPI機能があるが、
functions/ディレクトリに適当なJSファイルを置くと意図せずルーティングされることがある。静的サイトなら触らないのが正解
キャッシュの問題は、uv の記事で触れたようなビルドツールを使えばファイル名にハッシュを含められるので回避できる。素のHTMLサイトだとその仕組みがないので、クエリパラメータ(style.css?v=2)で対処した。ここは正直まだ試行錯誤中。
Vercel・Netlify との使い分け
3つとも実際に使ってみた上での整理。
| ユースケース | 推奨サービス |
|---|---|
| Next.js / Nuxt のSSRアプリ | Vercel(フレームワーク統合が強い) |
| フォーム・認証付きの静的サイト | Netlify(Identity, Formsが便利) |
| 純粋な静的サイトのホスティング | Cloudflare Pages |
| 将来的にAPIも追加したい | Cloudflare Pages + Workers |
個人プロジェクト規模なら正直どれでも困らない。ただ、「CDNとデプロイだけ確実にやってくれればいい」という用途なら、Cloudflare Pagesの割り切りが心地いい。余計な機能がない分、迷わない。
あ、もう一つ。Cloudflare Pages は KV(キーバリューストア)や R2(オブジェクトストレージ)と同じエコシステム上にあるので、あとからバックエンド機能を足しやすい。静的サイトで始めて、必要に応じて拡張する——という進め方ができるのは設計として良い。
セットアップ所要時間の目安
- Cloudflareアカウント作成: 2分
- GitHub連携 + 初回デプロイ: 5分
- 独自ドメイン設定: 10分(DNS浸透待ち含む)
- Web Analytics有効化: 1分
トータル20分もあれば、独自ドメイン付きの静的サイトが公開できる。開発者ツールやポートフォリオ、技術ブログなど、手軽にサイトを立ち上げたいなら十分選択肢に入る。自分の開発者向けツールサイトもこの構成で1ヶ月問題なく動いている。