2-11 / Series
2-11 № 11 · 2026

置き場は二つ、
手順は一つ。

焼いた HTML を、二つの置き場のどちらにも、同じ手順で出す

2-10: Web を作る ── HTML と CSS と JavaScript に戻る で、中身を文字で持ち、外枠を HTML と CSS で書き、Python で焼く形を決めた。ここでは、その焼いた html/ を外に出す。

置き場は二つある。2-02 で立てた自分の一台に載せるか、Cloudflare Pages に置くかだ。出す手順はどちらも同じで、片方で始めて後から替えられる。

公開する形を、先に決める

この章で決めるのは、次の六つだ。AI にこの章を渡すとき、渡すのはこの決定であって、コードではない。

置き場は、二つから選ぶ

[cols="1,2,2"]

自分の一台(2-02 + Caddy) Cloudflare Pages
機械
自分で持つ(2-02 の一台にまとめる)
借りる。機械の面倒は無い
証明書
Caddy が Let's Encrypt から自動で取って更新する
Cloudflare が自動で付ける
配信
自分の回線の太さで決まる
世界中の CDN から出る
動く部分
同じ機械の FastAPI に、そのまま繋ぐ
自分の一台の門番の内側の API に、外から繋ぐ
向く場面
社内向け、規模の見える公開、IoT の受け口も同じ一台に置きたいとき
閲覧が多い、回線と機械のことを考えたくないとき

迷うなら、自分の一台から始める。2-02 で機械はもう立っていて、足すのは Caddy の数行だけだ。閲覧が増えて回線が気になったら、同じ html/ を Cloudflare Pages に上げれば、その日のうちに移れる。

自分の一台に載せる

2-02 で立てた Debian の一台に、Caddy を前に立てる。Caddy は Debian 13 の apt にあり、 systemd で動く(2-02)。80 と 443 を受け、証明書を自動で取って自動で更新する。設定はこれだけだ。

example.com {
    root * /srv/html
    file_server
    handle /api/* {
        reverse_proxy localhost:8000
    }
}

公開の Web(静的ファイル)と、動く部分(FastAPI)が、同じドメインの下に並ぶ。別のドメインを跨がないので、ブラウザ側の許可設定も要らない。

決めることは三つ。

Cloudflare Pages に置く

機械を持たずに出すなら、Cloudflare Pages を使う。ファイルを上げれば世界中の CDN から配信され、HTTPS も自動で付く。

配信と防御は Cloudflare に任せ、ソースとビルドは自分の手元に残す。公開する HTML に秘密は無いので、ここは任せてよい。

上げるのに npm も Node も要らない。Cloudflare の API を直接叩くスクリプト一つで足りる。そのスクリプトは aiseed-dev/cf-publish として公開してあり(PyPI、uv tool install cf-publish)、一行で、変わったファイルだけが上がる。本番とは別の枝に上げれば、プレビューの URL が出る。

ビルドと確認とデプロイを、分ける

置き場がどちらでも、出す手順は同じだ。一つのコマンドにまとめない。

uv run python tools/build.py                     # 1. 焼く
uv run python -m http.server --directory html 8000   # 2. 手元で、目で見る
rsync -a --delete html/ user@example.com:/srv/html/   # 3a. 自分の一台へ
cf-publish html --project <名前>                  # 3b. Cloudflare Pages へ

自動で作り直す設定や、「ビルドして上げる」を一つにまとめたコマンドは使わない。 確認した HTML と、本番に出る HTML を、同じにする ためだ。動く部分があるなら、「確認」の段で 2-12 の公開の前の四つの点検を回す。Cloudflare Pages には本番の前にプレビューの枝があるので、本番の URL に向ける前にそこで見られる。自分の一台なら、同じ機械にもう一つのホスト名を足せば、同じことができる。

ドメインをつなぐ

メール(MX・SPF)は触らない。替えるのは Web の置き場だけだ。旧サーバがあるなら、止めずに残したまま新しい側を確かめ、確かめてから名前を向ける。

動く部分は、FastAPI で裏につなぐ

問い合わせフォーム、予約の受け口、求人の検索 ── 動くのはこのくらいだ。ここは FastAPI 一つに寄せる。

外から来る人にも、先にメールアドレスを確かめさせる。返事を書くには宛先が要るし、確かめた宛先なら打ち間違いも偽の投稿も来ない。パスワードもアカウントの作成も要らず、番号を一つ入れるだけだ。これで、動く部分は全部、門番の内側に置ける。

繋ぎ方は置き場で変わる。自分の一台なら、Caddy の /api/* を同じ機械の FastAPI へ回す。Cloudflare Pages なら、自分の一台の FastAPI へ外から繋ぐ。どちらでも、通るのは門番で身元を確かめた人だけだ。

公開の側と、門番の内側を分ける

公開サイトは、どちらの置き場でもよい。静的で、秘密は無い。自立編で立てた内部の道具 ── 門番・文書・コード・メール・会議 ── は別に扱う。秘密や生のデータが通るので、門番の内側に残す。

借りている窓は、いつでも替えられる。公開サイトの実体は、静的ファイルの束と、手元のソースだ。明日、別の置き場に同じ html/ を送れば、それで引っ越しは終わる。窓は借りても、出口はいつも開いている。

確かめ方

この章は、次の五つができていれば済みだ。

  1. 公開した頁が独自ドメインで開き、ブラウザに鍵の印が付く
  2. 手元の 8000 番で目で見た頁と、本番の頁が同じに見える
  3. 本番に向ける前に、別の URL で同じ頁を開いて確かめられる
  4. 問い合わせフォームで、メールに届いた番号を入れてから送ると、2-08 のメールに通知が届き、2-03 の DB に残っている
  5. 今までどおりメールが届く(MX を触っていない)
curl -sI https://example.com | head -1      # 公開した頁が返る
curl -sI https://example.com/api/health     # 動く部分も同じ名前の下で返る

人が持つ物

人が渡す値

AI が「やる前に言う」操作

確かめた版と日付

まとめ

焼いた HTML を、二つの置き場のどちらかに出す。

次章では、基幹システムのロジックを API(FastAPI)として出し、各アプリから使えるようにする。


関連記事