Cloudflare Pagesで静的サイトを0円で公開する(wranglerで直接アップロード)
HTMLを数ページ作ったあと、「これをどこに置けば、お金をかけずに公開できるのか」で手が止まることがあります。私は、家の用事の自動化をまとめたこのサイトを、Cloudflare Pagesの無料プランで公開しました。GitHubは使わず、手元のフォルダをwranglerというコマンドでそのままアップロードしています。
この記事では、その流れと、Claude Codeに作業を頼んだときに私がはまった点をまとめます。
Direct Uploadで公開するまで
- HTMLを出力する公開したいファイルを1つのフォルダにまとめる
- wranglerでログインブラウザでCloudflareのアカウントを許可する
- プロジェクトを作るpages project create(最初の1回だけ)
- アップロードするpages deploy(更新のたびにこれだけ)
無料プランでできること
Cloudflareの公式ドキュメントでは、Pagesの静的ファイルへのリクエストは「無料プランでも有料プランでも、無料で無制限」と説明されています。つまり、アクセスが増えても、静的なHTMLを配るだけなら料金は増えません。無料プランの主な制限は次のとおりです(公式の制限のページより)。
| 項目 | 無料プランの上限 |
|---|---|
| 1サイトのファイル数 | 20,000 |
| 1ファイルの大きさ | 25 MiB |
| 1アカウントのプロジェクト数 | 100 |
| 1プロジェクトのカスタムドメイン | 100 |
数ページのHTMLと画像のサイトなら、どれも十分に余裕があります。なお、料金や規約の細かい条件(たとえば広告を載せてよいか)は、この記事では確かめていません。気になる場合は、Cloudflareの規約を自分で読んでください。
Direct Uploadとは
Pagesの公開方法には、GitHubなどと連携して自動で公開する方法のほかに、作り終わったファイルをそのままアップロードする「Direct Upload」があります。公式ドキュメントでは、wranglerのコマンドで行う方法のほかに、ダッシュボードでファイルをドラッグ&ドロップする方法も紹介されています。私は、HTMLを自分のスクリプトで生成していて、Gitのリポジトリを公開用に作っていなかったので、wranglerを使いました。
wranglerの準備とログイン
wranglerはCloudflareのコマンドラインツールで、Node.jsが必要です。公式ドキュメントでは、プロジェクトごとに入れる方法が勧められています。
npm i -D wrangler@latest
私は使うときに呼び出す形(npx wrangler)で使っています。初回はログインが必要です。
npx wrangler login
ブラウザが開くので、Cloudflareのアカウントで許可します。私の環境では、この1回でログイン情報がPCに保存され、以後は聞かれませんでした。
プロジェクトを作って公開する
公式ドキュメントのコマンドは次の2つです。
# 最初の1回だけ
npx wrangler pages project create my-site --production-branch main
# 公開する(出力フォルダを指定)
npx wrangler pages deploy C:\path\to\dist --project-name my-site --branch main --commit-dirty=true
ここで使っているオプションは、公式のコマンド一覧では次のように説明されています。
--production-branch… プロジェクトの本番ブランチの名前--project-name… 公開先のプロジェクト名--branch… 公開先のブランチ名--commit-dirty… 作業フォルダを「未コミットの変更あり」として扱うかどうか
本番ブランチと同じ名前のブランチ(ここでは main)に公開すると、プロジェクト名.pages.dev のアドレスが更新されます。別の名前のブランチに公開すると、ランダムな文字列が前に付いた別のアドレスで確認できます。--commit-dirty=true は、Gitのフォルダから実行したときに未コミットの警告が出ないよう、私は付けています。
プロジェクト名は、〇〇.pages.dev の〇〇になります。公開が終わるとwranglerが公開先のアドレスを表示するので、そのアドレスで実際に開けるかを確かめておくと安心です。
Claude Codeから実行すると「Workersに委譲」される
ここが、私がはまった所です。新しいサイトのプロジェクト作成をClaude Codeに頼んで pages project create を実行させたところ、wranglerが次のように表示して「Workersに委譲」し、そのまま失敗しました。
Delegating to the latest version of Cloudflare Pages, now part of Cloudflare Workers
wranglerの更新履歴(4.108.0)には、次の趣旨の説明がありました。AIコーディングエージェントが、まったく新しい、静的なだけのプロジェクトに対して wrangler pages deploy か wrangler pages project create を実行すると、Cloudflare PagesではなくWorkersの静的アセットに委譲する。--force を付けると、この委譲をやめてPagesに直接公開できる。
そこで私は、プロジェクトを作る最初の1回だけ --force を付けました。
npx wrangler pages project create my-site --production-branch main --force
プロジェクトができたあとの pages deploy には、--force を付けていません。更新履歴によると、その後の更新で、委譲するかどうかの判定はプロジェクトごとになりました。すでにあるプロジェクトへのコマンドはPagesのまま動き、新しいプロジェクトは、同じアカウントにほかのPagesのプロジェクトがあっても委譲されます。私のアカウントにも別のPagesのプロジェクトがありましたが、新しいプロジェクトは委譲されました。--force は最初の1回だけでよく、wranglerも成功したときにそう案内します。なお、4.108.0の説明では、AIではなく人が実行した場合は委譲の対象外です。
なお、Workersのほうでも静的なサイトは公開できます。公式ドキュメントにも「新しいプロジェクトはWorkersで始めるように」という案内があります。ただ、公式ドキュメントによると、Workersのアドレスは <Workerの名前>.<アカウントのサブドメイン>.workers.dev の形になり、アカウントごとのサブドメインが入ります。私はアドレスにアカウントの情報を出したくなかったので、〇〇.pages.dev の形になるPagesのほうを選びました。どちらが良いというより、アドレスをどうしたいかで決める話です。
あとからGit連携に切り替えられない
もう1つ、決める前に知っておきたい点があります。公式ドキュメントには、次のように書かれています。
If you choose Direct Upload, you cannot switch to Git integration later. You will have to create a new project with Git integration to use automatic deployments.
つまり、Direct Uploadで作ったプロジェクトは、あとからGit連携の自動公開に変えられません。変えたくなったら、新しいプロジェクトを作り直す必要があります。将来GitHubにソースを置いて、プッシュするたびに自動で公開したいなら、最初からGit連携で作るほうがよいでしょう。私は手元でHTMLを生成して出力フォルダをそのまま送るだけでよかったので、Direct Uploadで運用しています。
出力先はOneDriveの外に置く
HTMLの出力先は、OneDriveの同期対象の外にしています。ビルドのたびに多数のファイルが書き換わるフォルダを同期に巻き込みたくなかったためです。OneDriveの中に置いたPythonの仮想環境が自動実行で壊れた経験があり、その話はOneDriveの中にPythonの仮想環境(venv)を置くと、自動実行で壊れることがあるにまとめました。
更新のたびにやること
サイトを直したら、出力フォルダを作り直して、pages deploy を実行するだけです。プロジェクトの作成や --force は要りません。この作業を毎日動かしたいときは、WindowsのタスクスケジューラでClaude Codeを毎日自動で動かすの形が使えます。
まとめ
- Cloudflare Pagesは、静的ファイルへのリクエストが無料で無制限。無料プランの上限は、1サイト20,000ファイル・1ファイル25 MiBなど
- Gitなしで公開するには、wranglerの
pages project create(初回のみ)とpages deploy(更新のたび)を使う - AIエージェントから新規の静的プロジェクトを作ると、wranglerがWorkersに委譲する。Pagesにしたいなら、作成時に
--forceを付ける - Direct Uploadのプロジェクトは、あとからGit連携に切り替えられない
- 出力先はOneDriveの外にしておくと安心