デプロイ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) devdev parky-home-dev dev.parky.co.jp .github/workflows/deploy-public-dev.yml
web/home (Astro) prodmain 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

  1. トリガー: dev は dev ブランチ、prod は main ブランチへの push(web/home/** / web/packages/** / web/package*.json / 該当 workflow / setup-parky composite 変更時)。workflow_dispatch 手動実行も可。
  2. Triggers: push to dev for dev or main for prod, scoped to web/home/**, web/packages/**, the lockfiles, the workflow file itself, and the setup-parky composite. Manual workflow_dispatch is supported.
  3. 2026-04-19 の SSR 化以降、ビルド時 API ヘルスチェック (/v1/hubs/publishable?min=1) と workflow_run 連鎖は廃止。SSR ページはビルド時に DB を見ないため、API のレース対策が不要になった。
  4. Since the 2026-04-19 SSR cutover, the build-time API health check (/v1/hubs/publishable?min=1) and the workflow_run chain have been removed. SSR pages don't query the DB during build, so the API race no longer exists.
  5. 1Password Service Account から CLOUDFLARE_API_TOKEN / Supabase URL+anon+service_role / Mapbox トークンを解決。dev は PUBLIC_SENTRY_DSN も同時に取得(DSN 未設定時は astro.config.mjs 側で Sentry integration ごと bundle から除外)。
  6. 1Password Service Account resolves CLOUDFLARE_API_TOKEN, Supabase URL/anon/service_role, and the Mapbox token. Dev also pulls PUBLIC_SENTRY_DSN (when missing, astro.config.mjs drops the Sentry integration entirely from the bundle).
  7. web/home/.env を CI で生成(PUBLIC_SITE_URL / PUBLIC_PARKY_API_BASE / PUBLIC_PUBLISHED_PREFECTURES / PUBLIC_HUB_MIN_INVENTORY 等)。閾値は dev=1 / prod=3。
  8. CI writes web/home/.env with PUBLIC_SITE_URL, PUBLIC_PARKY_API_BASE, PUBLIC_PUBLISHED_PREFECTURES, PUBLIC_HUB_MIN_INVENTORY, etc. Thresholds: dev=1, prod=3.
  9. npm ci -w @parky/home --include-workspace-root → Astro / Vite キャッシュ復元 → npm run build:homeweb/home/dist/_worker.js 含む成果物を出力)。astro-pagefind が同時に dist/pagefind/ を生成。
  10. npm ci -w @parky/home --include-workspace-root → restore Astro/Vite caches → npm run build:home (emits web/home/dist/ with _worker.js). astro-pagefind emits dist/pagefind/ in the same step.
  11. ヘッダ生成: 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 を追加。
  12. Headers: a here-doc writes dist/_headers directly. Dev sets X-Robots-Tag: noindex, nofollow, noarchive, nosnippet + HSTS / X-Content-Type-Options / X-Frame-Options / Referrer-Policy. Prod drops noindex and adds preload to HSTS.
  13. 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} で渡す。
  14. Deploy: dev uses the composite ./.github/actions/cf-pages-deploy; prod calls npx wrangler@4 pages project create … || true (idempotent) then pages deploy with --commit-hash / --commit-message. Sentry release is propagated via SENTRY_RELEASE=${GITHUB_SHA}.
  15. 同時実行制御: dev は cancel-in-progress: true(連続 push で古いビルドを破棄)、prod は cancel-in-progress: false(中断による Cloudflare 側半端アップロードを回避)。
  16. Concurrency: dev uses cancel-in-progress: true (drop older runs on rapid pushes), prod uses cancel-in-progress: false (avoid leaving partial uploads on Cloudflare).

Pages 設定ファイル(ビルド後生成)Pages config files (generated post-build)

Cloudflare Pages は dist/_headersdist/_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).

環境変数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 CICI
PUBLIC_SITE_URL canonical / OGP / sitemap の絶対URL組み立て Base URL for canonical, OGP, and sitemap buildbuild
PUBLIC_SUPABASE_URL Supabase エンドポイント Supabase endpoint build + runtimebuild + runtime
PUBLIC_SUPABASE_ANON_KEY ランタイム用 anon キー Runtime anon key runtimeruntime
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 runtimeruntime
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) buildbuild
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 buildbuild

新規ドメイン追加Adding a domain

  1. Dashboard > Pages > 対象プロジェクト > Custom domains で追加
  2. Dashboard > Pages > target project > Custom domains, then add.
  3. parky.co.jp zone は Cloudflare 管理下なので CNAME は自動作成、SSL も自動発行(5〜15 分)
  4. The parky.co.jp zone lives in Cloudflare, so the CNAME is auto-created and SSL is auto-issued (5–15 min).

ロールバックRollback