デプロイDeployment
概要Overview
Web 版(web/home/, Astro Hybrid SSG + SSR)は Cloudflare Pages にホスティングする。
dev は deploy-public-dev.yml、prod は deploy-public-home-prod.yml がそれぞれ
wrangler pages deploy でビルド成果物を送り込む。
The web app (web/home/, Astro Hybrid SSG + SSR) is hosted on Cloudflare Pages.
Dev runs through deploy-public-dev.yml and prod through deploy-public-home-prod.yml — both call
wrangler pages deploy.
環境別プロジェクトProjects per environment
| 対象Target | 環境Env | ブランチBranch | Pages プロジェクトPages project | カスタムドメインCustom domain | Workflow |
|---|---|---|---|---|---|
| web/home (Astro) | dev | dev | parky-home-dev |
dev.parky.co.jp |
.github/workflows/deploy-public-dev.yml |
| web/home (Astro) | prod | main | parky-home-prod |
parky.co.jp / www.parky.co.jp |
.github/workflows/deploy-public-home-prod.yml |
パイプライン全景Pipeline overview
flowchart LR push["git push"] push -->|dev branch| devwf["deploy-public-dev.yml
(parky-home-dev)"] push -->|main branch| prodwf["deploy-public-home-prod.yml
(parky-home-prod)"] subgraph Common["GitHub Actions ランナー (ubuntu-22.04)"] op["1Password SA で
CLOUDFLARE_API_TOKEN /
SUPABASE / Mapbox / Sentry DSN を解決"] setup["actions/checkout
+ setup-parky composite"] install["npm ci -w @parky/home
--include-workspace-root"] cache["Astro / Vite build cache
(actions/cache)"] envf["web/home/.env を生成
(PUBLIC_SITE_URL / 閾値変数 等)"] build["npm run build:home
→ web/home/dist (HTML + _worker.js + Islands JS)"] headers["dist/_headers を生成
(dev: noindex, prod: HSTS)"] deploy["wrangler@4 pages deploy
web/home/dist --project-name=...
(prod は ensure-project + commit メタ付与)"] end devwf --> Common prodwf --> Common Common --> CFP["Cloudflare Pages edge
+ Pages Functions (_worker.js)"]
パイプライン詳細Pipeline details
- トリガー: dev は
devブランチ、prod はmainブランチへの push(web/home/**/web/packages/**/web/package*.json/ 該当 workflow /setup-parkycomposite 変更時)。workflow_dispatch手動実行も可。 - Triggers: push to
devfor dev ormainfor prod, scoped toweb/home/**,web/packages/**, the lockfiles, the workflow file itself, and thesetup-parkycomposite. Manualworkflow_dispatchis supported. - 2026-04-19 の SSR 化以降、ビルド時 API ヘルスチェック (
/v1/hubs/publishable?min=1) とworkflow_run連鎖は廃止。SSR ページはビルド時に DB を見ないため、API のレース対策が不要になった。 - Since the 2026-04-19 SSR cutover, the build-time API health check (
/v1/hubs/publishable?min=1) and theworkflow_runchain have been removed. SSR pages don't query the DB during build, so the API race no longer exists. - 1Password Service Account から
CLOUDFLARE_API_TOKEN/ Supabase URL+anon+service_role / Mapbox トークンを解決。dev はPUBLIC_SENTRY_DSNも同時に取得(DSN 未設定時は astro.config.mjs 側で Sentry integration ごと bundle から除外)。 - 1Password Service Account resolves
CLOUDFLARE_API_TOKEN, Supabase URL/anon/service_role, and the Mapbox token. Dev also pullsPUBLIC_SENTRY_DSN(when missing,astro.config.mjsdrops the Sentry integration entirely from the bundle). web/home/.envを CI で生成(PUBLIC_SITE_URL/PUBLIC_PARKY_API_BASE/PUBLIC_PUBLISHED_PREFECTURES/PUBLIC_HUB_MIN_INVENTORY等)。閾値は dev=1 / prod=3。- CI writes
web/home/.envwithPUBLIC_SITE_URL,PUBLIC_PARKY_API_BASE,PUBLIC_PUBLISHED_PREFECTURES,PUBLIC_HUB_MIN_INVENTORY, etc. Thresholds: dev=1, prod=3. npm ci -w @parky/home --include-workspace-root→ Astro / Vite キャッシュ復元 →npm run build:home(web/home/dist/に_worker.js含む成果物を出力)。astro-pagefindが同時にdist/pagefind/を生成。npm ci -w @parky/home --include-workspace-root→ restore Astro/Vite caches →npm run build:home(emitsweb/home/dist/with_worker.js).astro-pagefindemitsdist/pagefind/in the same step.- ヘッダ生成:
dist/_headersを直接 here-doc で書き出す。dev はX-Robots-Tag: noindex, nofollow, noarchive, nosnippet+ HSTS / X-Content-Type-Options / X-Frame-Options / Referrer-Policy。prod は noindex を外し HSTS にpreloadを追加。 - Headers: a here-doc writes
dist/_headersdirectly. Dev setsX-Robots-Tag: noindex, nofollow, noarchive, nosnippet+ HSTS / X-Content-Type-Options / X-Frame-Options / Referrer-Policy. Prod drops noindex and addspreloadto HSTS. - Deploy: dev は composite action
./.github/actions/cf-pages-deploy経由、prod はnpx wrangler@4 pages project create … || true(idempotent)→pages deployで--commit-hash/--commit-messageを付与。Sentry release をSENTRY_RELEASE=${GITHUB_SHA}で渡す。 - Deploy: dev uses the composite
./.github/actions/cf-pages-deploy; prod callsnpx wrangler@4 pages project create … || true(idempotent) thenpages deploywith--commit-hash/--commit-message. Sentry release is propagated viaSENTRY_RELEASE=${GITHUB_SHA}. - 同時実行制御: dev は
cancel-in-progress: true(連続 push で古いビルドを破棄)、prod はcancel-in-progress: false(中断による Cloudflare 側半端アップロードを回避)。 - Concurrency: dev uses
cancel-in-progress: true(drop older runs on rapid pushes), prod usescancel-in-progress: false(avoid leaving partial uploads on Cloudflare).
Pages 設定ファイル(ビルド後生成)Pages config files (generated post-build)
Cloudflare Pages は dist/_headers と dist/_redirects を読んでヘッダーと SPA フォールバックを制御する。
どちらも GitHub Actions ワークフロー側で here-doc によりビルド後に書き出す(Apache 用 .htaccess は使わない)。
Cloudflare Pages reads dist/_headers and dist/_redirects to control headers and SPA fallback.
Both are emitted via a here-doc in the GitHub Actions workflow after the build (no Apache .htaccess).
_headers(dev):X-Robots-Tag: noindex, nofollow, noarchive, nosnippet+Strict-Transport-Security+X-Content-Type-Options: nosniff+X-Frame-Options: SAMEORIGIN+Referrer-Policy: strict-origin-when-cross-origin_headers(dev):X-Robots-Tag: noindex, nofollow, noarchive, nosnippet+Strict-Transport-Security+X-Content-Type-Options: nosniff+X-Frame-Options: SAMEORIGIN+Referrer-Policy: strict-origin-when-cross-origin_headers(prod): dev と同じセキュリティヘッダ群からX-Robots-Tagを外し、Strict-Transport-Security: max-age=31536000; includeSubDomains; preloadに強化_headers(prod): same security headers minusX-Robots-Tag, withStrict-Transport-Security: max-age=31536000; includeSubDomains; preload- ホストガード不要: Cloudflare Pages はカスタムドメインに紐付いたホスト以外からは配信されないため、
HTTP_HOSTチェックは不要 - No host guard needed: Pages only serves the bound custom domain, so an
HTTP_HOSTcheck is unnecessary. - SPA fallback 不要: 公開ポータルは Astro Hybrid なので SSR ルートは
_worker.jsがカバー、SSG ルートは静的 HTML で 200 が返る。_redirectsは出力しない(管理者ポータルparky-admin-*は React Router 用に/* /index.html 200を別途持つ) - No SPA fallback: the public portal is hybrid Astro, so SSR routes are served by
_worker.jsand SSG routes by static HTML — no_redirectsfile is emitted. The admin portal (parky-admin-*) ships/* /index.html 200separately for React Router. - SRI 自動注入:
src/integrations/sri.mjsがastro:build:doneフックでdist/内 HTML の<script>/<link>にintegrity=を埋め込む - SRI auto-injection:
src/integrations/sri.mjshooksastro:build:doneand addsintegrity=attributes to<script>and<link>tags in the built HTML.
環境変数Environment variables
| Name | 用途 | Purpose | 使用タイミング | When |
|---|---|---|---|---|
CLOUDFLARE_API_TOKEN |
Pages デプロイ用。1Password Cloudflare|APIトークン|Parky Workers Edit から取得 |
For Pages deploy. Pulled from 1Password item Cloudflare|APIトークン|Parky Workers Edit |
CI | CI |
PUBLIC_SITE_URL |
canonical / OGP / sitemap の絶対URL組み立て | Base URL for canonical, OGP, and sitemap | build | build |
PUBLIC_SUPABASE_URL |
Supabase エンドポイント | Supabase endpoint | build + runtime | build + runtime |
PUBLIC_SUPABASE_ANON_KEY |
ランタイム用 anon キー | Runtime anon key | runtime | runtime |
SUPABASE_SERVICE_ROLE_KEY |
ビルド時の read-only 取得 | Build-time reads | build (CI only) | build (CI only) |
PUBLIC_MAPBOX_TOKEN |
Mapbox GL JS 公開トークン | Mapbox GL JS public token | runtime | runtime |
PUBLIC_PARKY_API_BASE |
Workers BFF のベース URL(dev: https://dev-api.parky.co.jp, prod: https://api.parky.co.jp)。本番ビルドで未設定だと site-config.ts が fail-fast |
Workers BFF base URL (dev: https://dev-api.parky.co.jp, prod: https://api.parky.co.jp). Production builds fail-fast in site-config.ts when missing |
build + runtime (SSR) | build + runtime (SSR) |
PUBLIC_PUBLISHED_PREFECTURES |
公開対象都道府県の slug CSV。地域マスター seed と整合させる(現状 tokyo、* で全解禁) |
CSV of prefecture slugs to publish (must match seeded data; currently tokyo, * opens all) |
build | build |
PUBLIC_HUB_MIN_INVENTORY / PUBLIC_HUB_FILTER_MIN_COUNT / PUBLIC_SCENE_MIN_COUNT |
ハブ・フィルタ・シーンページが「在庫薄」で 404 化する閾値。dev=1, prod=3 | Inventory thresholds below which hub / filter / scene pages 404. dev=1, prod=3 | build + runtime (SSR) | build + runtime (SSR) |
PUBLIC_SENTRY_DSN / SENTRY_RELEASE |
@sentry/astro 用 DSN。未設定時は astro.config が integration ごと bundle から外す。release は prod で ${GITHUB_SHA} |
DSN for @sentry/astro. When empty, astro.config.mjs drops the Sentry integration from the bundle. Release is ${GITHUB_SHA} in prod |
build (CI) | build (CI) |
PUBLIC_BUILD_TIME / PUBLIC_BUILD_COMMIT / PUBLIC_BUILD_ENV |
astro.config が自動注入する build メタ(フッター表示・問合せ調査用)。GITHUB_SHA / CF_PAGES_COMMIT_SHA 先頭 7 桁を使う |
Build metadata auto-injected by astro.config.mjs (used by the footer / for incident triage). Uses first 7 chars of GITHUB_SHA / CF_PAGES_COMMIT_SHA |
build | build |
新規ドメイン追加Adding a domain
- Dashboard > Pages > 対象プロジェクト > Custom domains で追加
- Dashboard > Pages > target project > Custom domains, then add.
parky.co.jpzone は Cloudflare 管理下なので CNAME は自動作成、SSL も自動発行(5〜15 分)- The
parky.co.jpzone lives in Cloudflare, so the CNAME is auto-created and SSL is auto-issued (5–15 min).
ロールバックRollback
- Dashboard > Pages > 対象プロジェクト > Deployments で過去のビルドを「Rollback to this deployment」から即復帰
- Dashboard > Pages > target project > Deployments — activate any past build via "Rollback to this deployment".
- GitHub Actions 側で
Re-run workflowを選べば、任意のコミットを再ビルド&デプロイできる - Alternatively, use GitHub Actions "Re-run workflow" to rebuild and redeploy a chosen commit.
- 静的ファイルのみなので DB マイグレーションのロールバックは不要
- Static-only output — no DB migration rollback needed.