Tailwind v4 へ移行した PR を main にマージしたあと、本番 redamoon.net に記事 000107 が出てこない、という事態になりました。Cloudflare Pages のビルドは成功しているように見えるのに、本番だけ古いまま。
調べたところ、Astro 7 移行で本番の配信先が Cloudflare Pages から Cloudflare Workers に切り替わっていたのが原因でした。ここでは移行前後の仕様の違いと、main マージ後に本番へ自動反映するための対応(Workers Builds)をまとめます。
何が起きていたか
000107 を main にマージした直後の状態は次のとおりです。
| URL | Astro | /log/post/000107 |
更新の仕組み |
|---|---|---|---|
| redamoon.net | v7.0.0 | 200(手動デプロイ後) | 手動 pnpm deploy:site |
Worker プレビュー(<worker>.<account>.workers.dev) |
v7.0.0 | 200 | 同上(同一 Worker) |
旧 Pages プレビュー(<project>.pages.dev) |
v5.18.0 | 404 | 旧 Pages プロジェクト(更新停止) |
本番ドメイン redamoon.net と Worker プレビュー(*.workers.dev)の中身は一致していました。一方 旧 Pages プレビュー(*.pages.dev)は Astro 5 系の古いビルドのままで、000107 も存在しません。
「main にマージ = 本番反映」と思っていたのに当てはまらなかったのは、本番ドメインが Worker を向いているのに、自動更新されているのは Pages 側だけだったからです。
移行前の仕様(〜 Astro 5 時代)
以前の運用イメージはこうでした。
- ホスティング: Cloudflare Pages(旧プロジェクト)
- プレビュー URL:
<project>.pages.dev(Cloudflare が付与する Pages サブドメイン) - 本番ドメイン: Pages のカスタムドメインとして
redamoon.netを向ける - デプロイ: GitHub の main へ push / merge → Pages が
astro build→ 自動で本番反映
README や ADR にも「Astro + Cloudflare Pages」と書いてあり、この構成が前提でした。
Astro 7 移行で変わったこと
Astro 7 へのアップグレードで @astrojs/cloudflare v14 を入れた結果、ビルド出力とデプロイ経路が変わりました。
Astro 公式の Cloudflare デプロイガイド でも、新規プロジェクトは Cloudflare Workers を推奨しており、Cloudflare Pages へのデプロイは @astrojs/cloudflare v13 以降で非サポートになっています。
ビルド出力
| 項目 | Astro 5(Pages 時代) | Astro 7(現行) |
|---|---|---|
| 静的アセット | dist/ など |
dist/client/ |
| Worker エントリ | _worker.js 系 |
dist/server/entry.mjs |
| デプロイ設定 | Pages が dist を拾う |
アダプタが dist/server/wrangler.json を生成 |
本番の配信先
wrangler.site.toml で Worker 名 redamoon-site を定義し、ゾーンルートで本番ドメインを Worker に直接結びつけています。
name = "redamoon-site"
[[routes]]
pattern = "redamoon.net/*"
zone_name = "redamoon.net"
[[routes]]
pattern = "www.redamoon.net/*"
zone_name = "redamoon.net"
本番反映は package.json の deploy:site(ローカル)または Workers Builds(自動)です。
# ローカル一発
pnpm deploy:site
# 内訳
pnpm build # astro build + jampack
pnpm run deploy # wrangler deploy --config ./dist/server/wrangler.json
ルートの wrangler.toml は scrap-api(Hono)専用です。サイト本体は wrangler.site.toml → ビルド後の dist/server/wrangler.json という流れになります。デフォルトの wrangler deploy をそのまま使うと scrap-api 側を触るリスクがあるので、Deploy コマンドは必ず dist/server/wrangler.json を指定します。
Pages が Astro 5.18 のまま残る理由
旧 Pages プロジェクトは GitHub 連携が残っていますが、Astro 7 + @astrojs/cloudflare v14 のビルド出力は Pages 向けではありません。結果として 最後に成功した Astro 5 系のデプロイが *.pages.dev に残り続ける状態になりました。
Pages を Astro 7 まで追いつかせるのではなく、プロジェクトを削除または Git 連携解除して retire するのが正攻法です。プレビュー URL は Worker の *.workers.dev(本番 Worker と同一)を使います。
scrap-api は別 Worker
サイト本体(redamoon-site)とは別に、Scraps API は workers/scrap-api として独立した Worker です。
| コンポーネント | Worker 名 | デプロイ |
|---|---|---|
| ブログ本体 | redamoon-site |
pnpm deploy:site / Workers Builds |
| Scraps API | scrap-api |
wrangler deploy --config wrangler.toml |
方針 — Workers Builds で main マージ後に自動デプロイ
GitHub Actions でも同じことはできますが、Astro 公式 が示す CI/CD は Cloudflare Workers Builds です。Cloudflare ダッシュボードから Git リポジトリを Worker redamoon-site に接続し、push 時にビルド → デプロイを走らせます。
ダッシュボード設定
Workers & Pages → Worker redamoon-site → Settings > Build で次を設定します(Workers Builds 設定)。
| 項目 | 値 |
|---|---|
| Git repository | redamoon/redamoon.net |
| Production branch | main |
| Build command | pnpm build |
| Deploy command | pnpm run deploy |
| Build variables | PUBLIC_SCRAP_API_BASE=<本番 Scrap API URL> |
PUBLIC_SCRAP_ADMIN_ENABLED=true |
PUBLIC_* は Astro のビルド時に埋め込まれるため、Build variables(ランタイムではない)に置きます。Node.js は .node-version(22.16.0)に合わせてください。
非 production ブランチではデフォルトで wrangler versions upload が走り、プレビュー URL が発行されます。
旧 Pages プロジェクトの整理
ダッシュボードで 旧 Pages プロジェクトを削除するか、Git 連携を外してください。本番 redamoon.net とは無関係なのにビルドが走り続ける混乱の元です。
Worker 名を redamoon-site に移行する手順
Astro 7 移行時はテーマ名に合わせて Worker 名 astro-paper でデプロイしていました。Wrangler の name は Cloudflare 上の リソース ID であり、TOML を変えるだけではダッシュボードの Worker がリネームされません。新しい名前の Worker に載せ替え、ルートを移す必要があります。
前提
- リポジトリの
wrangler.site.tomlはname = "redamoon-site"に更新済み - KV(
SESSION)の namespace ID は TOML にそのまま記載(同じ KV を新 Worker から bind) - Workers Builds を
astro-paperに既に接続している場合、先に Build を止めるか、移行完了まで main への auto deploy を控える
手順
-
旧 Worker からルートを外す
ダッシュボード → 旧 Worker(astro-paper)→ Settings > Domains & Routes でredamoon.net/*とwww.redamoon.net/*を削除する。
(ルートが二重だと新 Worker への deploy が失敗する) -
新 Worker へ初回デプロイ
ローカルで本番と同じ env を付けて deploy する。pnpm deploy:site成功すると Worker
redamoon-siteが作成され、ルートと KV が TOML どおり付く。 -
動作確認
- redamoon.net が 200 で最新ビルドか
- Worker プレビュー(
redamoon-site.<account>.workers.dev)が同内容か - Scraps の投稿・一覧が通るか(
PUBLIC_SCRAP_API_BASEがビルドに入っているか)
-
Workers Builds を
redamoon-siteに接続- 旧 Worker(
astro-paper)側の Git 連携があれば Disconnect redamoon-siteで Connect to Git → 上記「ダッシュボード設定」の Build / Deploy / Build variables を設定- main へ空コミットまたは README 修正など小さな push で CI が通るか確認
- 旧 Worker(
-
旧 Worker を削除
astro-paperにルートが残っていないことを確認してから、ダッシュボードで Worker を削除する。 -
(任意)旧 Pages プロジェクトを retire
<project>.pages.devの Pages プロジェクトを削除または Git 連携解除。
注意点
| 項目 | 内容 |
|---|---|
| ダッシュボードのリネーム | UI から Worker 名を変える機能は基本ない。TOML の name 変更 = 別 Worker として deploy |
package.json の "name": "astro-paper" |
npm パッケージ名(テーマ由来)。Worker 名 redamoon-site とは無関係で、そのままでよい |
| Workers Builds と TOML の一致 | Build が参照する Worker 名と wrangler.site.toml の name は 一致させる |
| ダウンタイム | 手順 1 でルートを外してから 2 が終わるまで、短時間 redamoon.net が落ちる。メンテ時間帯での実施を推奨 |
運用の整理(移行後)
| 用途 | 手段 |
|---|---|
| 本番反映(redamoon.net) | main マージ → Workers Builds → pnpm run deploy |
| ローカル確認 | pnpm dev(.env で Scrap API を 127.0.0.1:8787 に向ける) |
| ローカルから本番デプロイ | pnpm deploy:site |
| Scrap API 本番 | 別途 wrangler deploy --config wrangler.toml |
| プレビュー URL | Worker の *.workers.dev |
まとめ
Astro 7 移行で 本番の配信先が Cloudflare Pages から Cloudflare Workers に移っていたため、main マージだけでは redamoon.net が更新されませんでした。*.pages.dev 側でデプロイできているように見えても、本番ドメインは別ルートです。
自動デプロイは Workers Builds(Astro / Cloudflare 公式の正系)に寄せ、Worker 名は redamoon-site に統一します。旧 astro-paper Worker と Pages プロジェクトは retire してください。