アルアカ - Arcadia Academia

Arcadia Academiaは「エンジニアリングを楽しむ」を合言葉に日本のデジタル競争力を高めることをミッションとするテックコミュニティです。

Cloudflare Pagesとは?静的サイトを無料で公開する方法を初心者向けに解説【ハンズオン】

Featured image of the post

「作ったポートフォリオやブログを、お金をかけずに公開したい」「サーバー管理は面倒だけど、高速で安全に出したい」——そんなときに最適なのが Cloudflare Pages です。

GitHubにコードを置いて連携するだけで、ビルドから世界中への高速配信までを自動でやってくれて、しかも無料枠が非常に手厚いのが特徴です。

この記事は、Cloudflareとは?初心者向けに使い方・設定・料金をわかりやすく解説 の関連記事です。Pagesの仕組みから、GitHub連携での公開手順、フレームワーク別のビルド設定、独自ドメイン、つまずき対策までをハンズオン形式で解説します。


[目次を開く]

Cloudflare Pagesとは?

Cloudflare Pagesは、静的サイトやフロントエンドアプリを無料で公開できるホスティングサービスです。Cloudflareの世界中のネットワーク(エッジ)から配信されるため、どこからアクセスしても高速です。

特徴を一言でまとめると「GitHubにpushするだけで、自動ビルド→世界配信されるホスティング」です。

  • Git連携でCI/CD: リポジトリにpushすると自動でビルド・デプロイ
  • 無料・高速: グローバルCDN配信、無料SSL、帯域・リクエスト無制限
  • プレビューデプロイ: ブランチ/PRごとに固有URLが発行され、本番前に確認できる
  • 独自ドメイン対応: 無料SSL付きで独自ドメインを割り当て可能
近年はWorkersへの統合(Static Assets)も進んでいますが、Git連携で静的サイトを最短公開するなら、現在もPagesが最も手軽な入り口です。

どんなサイトに向いている?

HTML/CSS/JSで構成される静的サイトや、ビルドで静的ファイルを生成するフレームワークと相性が抜群です。

  • ポートフォリオ・LP・ドキュメント・ブログ
  • Astro / Next.js / React(Vite) / Vue / SvelteKit などで作ったサイト
  • APIなどのサーバー処理は、後述の Pages Functions(エッジ実行)で補える

料金(無料枠が手厚い)

個人利用なら、まず無料プランで十分です。

項目 無料プラン
サイト数 無制限
帯域・リクエスト 無制限
ビルド回数 月500回まで
独自ドメイン プロジェクトごとに複数可(無料SSL付き)
プレビューデプロイ 利用可
帯域・リクエストが無制限なのが大きな利点です。アクセスが増えても転送量課金を気にせず運用できます(最新の上限は公式で確認してください)。

事前に準備するもの

  • Cloudflareアカウント(無料。作り方は入門記事を参照)
  • GitHubアカウントとリポジトリ(公開したいサイトのコード)

今回は最も一般的でおすすめの GitHub連携によるデプロイ を解説します。

ハンズオン:GitHub連携で公開する

1. リポジトリを用意する

公開したいサイトのコードをGitHubリポジトリにpushしておきます。ビルドが必要なフレームワーク(Astro等)の場合は、ローカルで npm run build が通る状態にしておきましょう。

2. Pagesプロジェクトを作成する

Cloudflareダッシュボードで「Workers & Pages」→「Pages」→「Gitに接続」を選び、GitHubアカウントを認可して対象リポジトリを選択します。

3. ビルド設定を行う

ここが最重要です。使っているフレームワークに合わせて「ビルドコマンド」と「ビルド出力ディレクトリ」を指定します。多くのフレームワークはプリセットから自動入力されます。

フレームワーク ビルドコマンド 出力ディレクトリ
Astro npm run build dist
Vite (React/Vue等) npm run build dist
Next.js(静的書き出し) npm run build out
Create React App npm run build build
素のHTML (空欄でOK) /(ルート)
出力ディレクトリを間違えると「ビルドは成功したのに真っ白/404」になります。フレームワークのビルド先を必ず確認しましょう。

4. デプロイする

保存してデプロイ」を押すと、Cloudflareがリポジトリをクローンしてビルドし、https://プロジェクト名.pages.dev のURLで公開されます。以後は mainブランチにpushするたびに自動で再デプロイ されます。

5. 動作を確認する

発行された *.pages.dev のURLにアクセスし、サイトが正しく表示されるか確認します。表示が崩れる場合は、出力ディレクトリやビルドログを見直します。

デプロイ後の確認は、URLを叩いて数字で見る

ダッシュボードの成功表示が保証しているのは「ビルドが終わったこと」だけです。実際に配信されているかは、発行されたURLをコマンドで叩いて確かめます。

SITE="https://<プロジェクト名>.pages.dev"   # カスタムドメインならそのURLを入れる

# トップのステータス行を見る
curl -sI "$SITE/" | head -n 1
curl -sI "$SITE/" | grep -i -e '^content-type' -e '^cf-cache-status'

# トップが200でも真っ白なら、読み込んでいるファイルを直接叩く
curl -s "$SITE/" | grep -o -e 'src="[^"]*"' -e 'href="[^"]*"'
curl -sI "$SITE/assets/index.js" | head -n 1

1行目が HTTP/2 200 なら配信できています。404 が返るなら、ビルド出力ディレクトリの指定か、アセットのベースURLの設定を疑います。ブラウザで見ると「なんとなく出ない」で終わりますが、ステータス番号まで見ればどちらが欠けているかが1回で決まります。

症状別の切り分け

症状 確認すること ありがちな原因
トップが404 curl -sI "$SITE/" の1行目 出力ディレクトリの指定違い。その直下に index.html が無い
トップは200だが真っ白 HTMLは返るがアセットが404 ビルド時のベースURL設定。サブパス前提でビルドしている
画面は出るがCSSだけ効かない .css のステータスだけ404 同じくベースURL。ファイル名の大文字小文字違いも疑う
直リンクだけ404 トップは200、/about が404 クライアント側ルーティング。_redirects を置く
内容が古いまま 見ているURLとデプロイ一覧のブランチ プレビューURLを見ている、またはpush先が本番ブランチでない
手元では通るのにビルドが落ちる ビルドログの最初のエラー行 Node のバージョン差。NODE_VERSION を合わせる

出力ディレクトリは推測せず、実物を見て決める

「ビルドは成功したのに真っ白」の大半は出力先の指定違いです。プリセットの自動入力に任せず、手元で1回ビルドして、生成されたディレクトリを確かめてから設定します。

npm run build
ls -d dist out build .output/public 2>/dev/null      # 生成されたのはどれか
find . -maxdepth 3 -name index.html -not -path './node_modules/*'

index.html が入っていたディレクトリ名を、そのまま「ビルド出力ディレクトリ」に書きます。素のHTMLをリポジトリ直下に置いている場合だけ、ビルドコマンドを空にして出力先をルートにします。

独自ドメインを割り当てる

*.pages.dev のままでも使えますが、独自ドメインを設定すると本格的です。

  1. Pagesプロジェクトの「カスタムドメイン」タブを開く
  2. 使いたいドメイン(例 example.com)を追加
  3. そのドメインをCloudflareで管理していれば、CNAMEが自動で設定され、無料SSLも自動で有効化されます

ドメインをCloudflareに移していない場合は、入門記事の「ネームサーバー変更」を先に済ませるとスムーズです。

プレビューデプロイ(本番前の確認)

Pagesは、mainブランチ=本番、それ以外のブランチやPull Request=プレビューとして、それぞれ固有URLを自動発行します。

  • 本番に影響を与えずに変更を確認できる
  • レビュー時に「この見た目で合っていますか?」とURLを共有できる

チーム開発でもひとり開発でも、安心して変更を試せる仕組みです。

Pages Functions(サーバー処理を足す)

「静的サイトだけど、問い合わせフォームや簡単なAPIも欲しい」という場合は、Pages Functions を使います。プロジェクト直下に functions/ ディレクトリを作ると、その中のファイルがエッジで動くサーバー関数になります(中身はCloudflare Workersの仕組みです)。

// functions/api/hello.js  →  /api/hello でアクセスできる
export function onRequest() {
  return new Response(JSON.stringify({ message: 'Hello from the edge!' }), {
    headers: { 'content-type': 'application/json' },
  })
}

より本格的にサーバーレスを使いたい場合は、次回の Cloudflare Workers の記事で詳しく解説します。

よくあるつまずき(FAQ)

Q. ビルドは成功したのにページが真っ白/404になる

ビルド出力ディレクトリの指定ミスが大半です。Astroなら dist、CRAなら build など、フレームワークの出力先と一致しているか確認してください。

Q. ビルドが失敗する

ビルドログを確認します。よくある原因は、ローカルでしか入っていない依存(package.json に入れ忘れ)、Node.jsバージョンの差異です。環境変数 NODE_VERSION を設定してローカルと揃えると解決することがあります。

Q. SPA(React Routerなど)で、リロードすると404になる

クライアントside routingのため、サーバーが該当パスを知らないのが原因です。出力ディレクトリに _redirects ファイルを置き、次の1行を書くと解決します。

/*    /index.html   200

Q. 環境変数(APIキーなど)はどう設定する?

Pagesプロジェクトの「設定」→「環境変数」から、本番用・プレビュー用それぞれに設定できます。フロントに露出してよい値か(ビルド時に埋め込まれるか)には注意しましょう。

まとめ

Cloudflare Pagesは、GitHub連携だけで静的サイトを無料・高速に公開できる、個人にもチームにも嬉しいホスティングです。要点は次のとおりです。

  • Gitにpush → 自動ビルド&世界配信、無料SSL・独自ドメイン対応
  • 肝は ビルドコマンドと出力ディレクトリの正しい指定
  • ブランチ/PRごとの プレビューデプロイ で安全に確認
  • サーバー処理は Pages Functions で補える

まずは手元のポートフォリオやブログのリポジトリを1つ連携して、*.pages.dev で公開する体験をしてみてください。

あわせて読みたい:

プログラミング学習でお悩みですか?

現役エンジニアがあなたの学習をマンツーマンでサポートします。

  • 学習の進め方がわからない
  • ポートフォリオの作り方を知りたい
  • 現場で使える技術を学びたい
まずは30分の無料相談

相談は完全無料・オンラインで気軽に

あなたを爆速で成長させるメンタリングプログラムはこちら

メンタープログラムバナー

学習・開発のお悩みは現役エンジニアに相談

メンタープログラムの詳細を見る

エンジニアの基礎学習ゲーム

プログラミング学習支援

無料相談はこちら