自作の Web ページを家族だけに公開する:Cloudflare Pages + Access なら無料で、見る側はメールのコードだけ

自作の Web ページを家族だけに公開する:Cloudflare Pages + Access なら無料で、見る側はメールのコードだけ

実家の写真や動画を、間取り図から部屋を選んで見られる Web ページを作りました。遠くに住む家族に見せたいのですが、家の中の写真なので、URL を知っていれば誰でも見られる状態にはしたくありません。

いろいろ調べて、Cloudflare Pages で公開して、Cloudflare Access で「許可したメールアドレスの人だけ」に絞る形にしました。無料の範囲で収まり、見る側はアカウントもアプリも要らず、メールに届くコードを入れるだけです。とても快適だったので、画面の流れと、つまずいたところを書こうかと思います。

この記事でわかること – GitHub のリポジトリから、Cloudflare Pages でサイトを公開する手順 – Cloudflare Access で、許可したメールアドレスの人だけが見られるようにする手順 – 無料でどこまで使えるか(転送量・ビルド・ファイルの大きさ・人数)と、HTTPS の証明書の期限 – 手順の途中でつまずいたところ(Workers と Pages の入口、プレビューと本番の守り分け、Free プランの有効化)

目次

どういう仕組みか

役割 使ったもの 内容
サイトの公開 Cloudflare Pages GitHub のリポジトリと連携し、main に push するたびにビルドして公開する
見られる人を絞る Cloudflare Access(Zero Trust) サイトを開くとログイン画面が出て、許可したメールアドレスに届くコードを入れた人だけが見られる

GitHub Pages はリポジトリを非公開にしても、公開したサイトは誰でも見られます。見る人を絞りたいなら、公開する側に「入口で止める」仕組みが必要で、それを Cloudflare Access が受け持ちます。

見る側の流れは、こうなります。

  1. 送られた URL(https://〇〇.pages.dev/)を開く
  2. メールアドレスを入れる画面が出る
  3. そのアドレスに 6 桁のコードが届くので、入れる
  4. 許可リストにあるアドレスなら、サイトが開く
Cloudflare Access のログイン画面。メールアドレスを入れて Send login code を押す
Cloudflare Access のログイン画面。メールアドレスを入れて Send login code を押す
コードを入れる画面。迷惑メールのフォルダも確かめるよう書かれている
コードを入れる画面。迷惑メールのフォルダも確かめるよう書かれている
Cloudflare から届くメール。6 桁のコードが書かれていて、10 分で無効になる
Cloudflare から届くメール。6 桁のコードが書かれていて、10 分で無効になる

コードを入れる画面には、迷惑メールのフォルダも確かめるよう書かれています。コードは 10 分で無効になります。

手順1:Cloudflare Pages でサイトを公開する

Workers & Pages から作る

Cloudflare のダッシュボードの「Workers & Pages」を開き、右上の「Create application」を押します。

Workers & Pages の一覧画面。右上に Create application のボタン
Workers & Pages の一覧画面。右上に Create application のボタン

次の画面は Workers を作る画面です。ここで「Continue with GitHub」を押すと Workers として作る流れになり、Deploy command など見慣れない欄が出てきます。Pages で作るときは、画面の一番下にある「Continue to Pages」を押します。

Create an app の画面。一番下の Need to use the legacy Pages workflow? Continue to Pages を赤枠で囲んでいる
Create an app の画面。一番下の Need to use the legacy Pages workflow? Continue to Pages を赤枠で囲んでいる

私は最初、上の「Continue with GitHub」で進んでしまい、Build output directory を入れる欄が見つからずに迷いました。

リポジトリとビルドの設定

「Continue to Pages」の先で「Import an existing Git repository」を選びます。

Pages の Get started の画面。Import an existing Git repository を赤枠で囲んでいる
Pages の Get started の画面。Import an existing Git repository を赤枠で囲んでいる

GitHub と連携して、公開したいリポジトリを選び、「Begin setup」を押します。

Deploy a site from your account の画面。GitHub のアカウントとリポジトリを選ぶ
Deploy a site from your account の画面。GitHub のアカウントとリポジトリを選ぶ

ビルドの設定は、私の場合(Vite で作ったサイトが web/ にある)はこうでした。

項目 入れた値
Production branch main
Framework preset None
Build command npm run build
Build output directory dist
Root directory web
Environment variables NODE_VERSION = 24(手元と同じ Node のバージョンでビルドするため)
Set up builds and deployments の画面。Build command・Build output directory・Root directory・環境変数を入れたところ
Set up builds and deployments の画面。Build command・Build output directory・Root directory・環境変数を入れたところ

「Save and Deploy」を押すと、リポジトリの取得とビルドが始まり、1〜2 分で公開されます。その後は main に push するたびに本番が作り直され、ほかのブランチに push するとプレビュー用のデプロイができます。

Deployments の画面。main からの Production と、作業ブランチからの Preview のデプロイが並んでいる
Deployments の画面。main からの Production と、作業ブランチからの Preview のデプロイが並んでいる

最初の作成では、原因のわからないエラーが出て止まりました。少し待ってもう一度「Save and Deploy」を押したら通ったので、一時的な不調だったようです。

手順2:Cloudflare Access で見られる人を絞る

公開した直後は、URL を知っていれば誰でも見られる状態です。 この先の手順は、続けてすぐ終わらせるのがおすすめです。中身を入れる前に Access まで済ませておけば、より安心です。

プレビュー用の URL を守る

Pages のプロジェクトの Settings → General にある「Preview access」の「Restrict previews」を押します。

ここで一つ注意があります。説明文にあるとおり、ここで守られるのはプレビュー用の URL(〇〇.my-project.pages.dev のような、デプロイごとの URL)だけで、本番の URL(my-project.pages.dev)は守られません。

This protects preview deployment URLs only. Production pages.dev and custom domains are managed separately in Zero Trust.

押すと、表示が「Preview deployments are restricted by a Cloudflare Access policy.」に変わり、Zero Trust 側に Access のアプリができます。

Settings の Preview access。restricted by a Cloudflare Access policy の表示と、This protects preview deployment URLs only の説明を赤枠で囲んでいる
Settings の Preview access。restricted by a Cloudflare Access policy の表示と、This protects preview deployment URLs only の説明を赤枠で囲んでいる

Zero Trust の Free プランを有効にする

本番の URL を守るには、Zero Trust で、できた Access のアプリに本番の URL を足します。ところが、アプリの画面を開いても、URL を足すボタンが見当たりませんでした。

Zero Trust のプランをまだ有効にしていなかったのが原因で、アプリの追加画面を開こうとすると「Finish your account setup」と出ました。

「Choose a plan」から Free を選びます。Access の料金のページによると、Free プランで使えるのは 50 人までです。

私が登録したときは、Free プランでも支払い方法(カード)の登録を求められました。 チェックボックスは 2 つで、利用規約への同意と、無料枠を超えた分をこのカードに請求してよいかの許可です。今回は家族に見せるだけなので、無料の範囲で使うつもりです。どんなときに請求されるかは、登録の画面の説明で確かめてください。

本番の URL を足して、許可するメールアドレスを入れる

プランを有効にした後にアプリの画面を開き直すと、「+ Add public hostname」が出てきました。

押して 2 行目を足し、本番の URL を入れます。

Subdomain Domain
1 行目(最初からある。プレビュー用) * my-project.pages.dev
2 行目(足す。本番用) 空欄 my-project.pages.dev
Access のアプリの画面。Public hostnames に、Subdomain が * の行と空欄の行の 2 行が並び、下に Access policies がある
Access のアプリの画面。Public hostnames に、Subdomain が * の行と空欄の行の 2 行が並び、下に Access policies がある

同じ画面の下にある Access policies で、ポリシー(Allow Members - Cloudflare Pages)を編集し、Include に「Emails」を選んで、家族のメールアドレスを入れます。自分のアドレスも忘れずに入れます。

ポリシーの編集画面。Include の Selector を Emails にして、許可するメールアドレスを入れたところ
ポリシーの編集画面。Include の Selector を Emails にして、許可するメールアドレスを入れたところ

最後に画面右下の「Save」を押します。押さないと、足した URL もポリシーも保存されません。

確かめる

シークレットウィンドウで本番の URL を開き、メールアドレスを入れる画面が出れば完了です。プレビュー用の URL(Pages の Deployments に並んでいる、英数字付きの URL)も開いて、同じ画面が出るか確かめておきます。

ターミナルからなら、curl で、ログイン画面(〇〇.cloudflareaccess.com)に飛ばされることを確かめられます。

curl -sI https://my-project.pages.dev/ | grep -i location

家の中の写真を置いているので、トップページだけでなく、写真のファイルの URL も直接開いて確かめました。 ログインしていない状態で、本番・プレビュー用・ブランチ別の URL に、それぞれトップページと写真のファイルを curl で頼んだ結果です(URL は置き換えています)。

URL トップページ 写真のファイル
my-project.pages.dev(本番) 302(ログイン画面へ) 302(ログイン画面へ)
abc12345.my-project.pages.dev(プレビュー用) 302(ログイン画面へ) 302(ログイン画面へ)
main.my-project.pages.dev(ブランチ別) 302(ログイン画面へ) 302(ログイン画面へ)

どれも、ファイルの中身は返らず、ログイン画面(〇〇.cloudflareaccess.com)に飛ばされました。存在しないファイル(/no-such-file.mp4)を頼んでも同じ 302 だったので、Access はファイルがあるかどうかを見る前の入口で止めているようです。動画のファイルも、同じように止まると思います。

独自ドメインを付けている場合は、Preview access の説明にあるとおり、そのドメインも Zero Trust のアプリに足して、同じように確かめる必要があります。

無料でどこまで使えるか

ここが一番気になっていたところです。公式ドキュメントで確かめた範囲(2026 年 10 月時点)をまとめます。

項目 無料プランの制限
転送量・アクセス数 静的なファイルへのリクエストは無料・無制限。転送量の上限は書かれていない
ビルド 月 500 回、同時に 1 つ、1 回 20 分まで
ファイルの数 1 サイト 20,000 ファイルまで
ファイルの大きさ 1 ファイル 25 MiB まで
Access で許可できる人数 50 人まで(Zero Trust の Free プラン)

Pages の料金のページには、こう書かれています。

On both free and paid plans, requests to static assets are free and unlimited.

写真や動画を置いても、見られる回数で料金がかかる心配はなさそうです。 気をつけるのは「1 ファイル 25 MiB まで」のほうで、私は家の中を回る動画を、部屋ごとの章に分けて 1 本 20MB 以下にしました。ちなみに私のサイトは、写真・動画・3D のデータを合わせて約 1,060 ファイル・約 180MB で、どの制限にも余裕があります。

サーバー側で処理を動かす Pages Functions を使う場合は、そのリクエストが Workers の無料枠(1 日あたりの回数の上限)に数えられます。静的なファイルを置くだけなら関係ありません。

HTTPS の証明書の期限

公開した URL の証明書を見ると、Let’s Encrypt が発行したもので、有効期限は約 3 か月後(2027 年 1 月 23 日)でした。

subject=CN=my-project.pages.dev
issuer=C=US, O=Let's Encrypt, CN=YE1
notBefore=Oct 25 07:18:58 2026 GMT
notAfter=Jan 23 07:18:57 2027 GMT

Cloudflare が管理している証明書なので、ふつうは自動で更新されると思います。ただ、pages.dev の更新のしくみを書いたドキュメントは見つからず、この環境で更新されたところもまだ見ていません。期限が近づいたら、確かめてみようと思います。

あわせてやっておいたこと

  • 検索エンジンに載らないようにする:Access で止まるので中身は読まれませんが、念のため、ページに <meta name="robots" content="noindex, nofollow"> を入れ、robots.txt で全体をクロールの対象外にしました
  • GitHub Pages のワークフローを消す:前に GitHub Pages 用のワークフローを置いていたので、main に push したときに誤って誰でも見られるサイトとして公開されないよう、消しました

家族に共有するとき

共有のたびにやることは 2 つだけです。

  1. 相手のメールアドレスを、Access のポリシーの Emails に足して保存する
  2. 本番の URL を送る

相手には、次のことを一緒に伝えておくと迷いません。

  • 入力するメールアドレスは、許可リストに入れたものと同じにする
  • コードのメールは、迷惑メールフォルダに入ることがある
  • 一度ログインすれば、しばらくはコードなしで見られる(期間はアプリの Session duration で変えられる)

見せるのをやめたいときは、Emails からアドレスを消します。ただ、消しただけでは、すでにログインしている人は、セッションが切れるまで見られる可能性があります。 ドキュメントによると、Access はセッションが切れたときに、ポリシーを確かめ直すしくみです。

すぐに止めたいときは、セッションも取り消します。ドキュメントを読む限り、Zero Trust の Users でその人のセッションを取り消すか、アプリの設定にある「Revoke existing tokens」で、そのアプリのセッションをまとめて切れそうです(私はまだ試していません)。

まとめ

  • Cloudflare Pages は GitHub と連携でき、main に push するだけで公開される
  • Cloudflare Access で、許可したメールアドレスの人だけが見られるようにできる。見る側はメールのコードを入れるだけ
  • Pages の「Restrict previews」で守られるのはプレビュー用の URL だけ。本番の URL は、Zero Trust のアプリに自分で足す
  • 設定のあとは、トップページだけでなく写真などのファイルの URL も、本番・プレビューの両方で、ログインせずに開けないことを確かめる
  • 本番の URL を足すには Zero Trust の Free プランが必要。私のときは、カードの登録を求められた
  • 静的なファイルへのリクエストは無料・無制限。1 ファイル 25 MiB、月 500 ビルドなどの上限はある
  • HTTPS の証明書は約 3 か月で期限が来る。Cloudflare が管理しているので自動で更新されると思うが、まだ更新されたところは見ていない

家族や友人など、決まった人にだけ見せたいページがある人には、かなり手軽な方法だと思います。反対に、たくさんの人に気軽に見てもらいたいページは、ログインの手間がかかるので向いていません。そういうページは、Access を付けずに普通に公開するのがよいと思います。

参考 – Limits · Cloudflare Pages docs – Pricing · Cloudflare Pages docs – Session management · Cloudflare One docs – Cloudflare Access(料金のプラン)

自作の Web ページを家族だけに公開する:Cloudflare Pages + Access なら無料で、見る側はメールのコードだけ

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

エンジニア。Claude Code / Codex / MCP / BigQuery / 自動化 / ガジェット / 3Dプリンター / スマートホーム。楽して生きたい。ゲーム / イヤホン / キーボード / プログラミング / AI

目次