本番化に向けて残っている「追加でやらなきゃいけない作業」まとめ Everything still required to take Parky to production
コード側の実装は Phase 0-11 まで dev 環境で完了しています(公開ポータル / Marketing Portal / Cloudflare Workers BFF / モバイルアプリ等)。 このページは、コードだけでは完結できない作業——インフラ構築・契約・シークレット投入・データ投入・OAuth 接続・移行手続き——を 「開発者がやる作業」と 「運用ユーザー(=あなた)がやる作業」に分けて網羅的にまとめたものです。
Code-side work is complete through Phase 0-11 in the dev environment (public portal, marketing portal, Cloudflare Workers BFF, mobile app). This page lists everything that code alone cannot finish — infrastructure, contracts, secrets, data, OAuth wiring, migration — split into developer tasks and operator (you) tasks.
各タスクには 「何のために必要か(目的)」と 「具体的に何をやるか(手順)」を必ず添えています。 また、必須(これをやらないと本番公開できない)/推奨(運用上やっておくべき)/任意(将来の拡張)でレベル分けしています。
Each task has a purpose and a concrete step list. Priority markers: required (blocks production), recommended (operational hygiene), optional (future expansion).
全体サマリ — 今どこにいて、あと何が残っているか Summary — where we are and what's left
| 領域 | Area | 現状 | Status | 残り | Remaining |
|---|---|---|---|---|---|
| Cloudflare Workers BFF | Cloudflare Workers BFF | dev 稼働 | dev running | prod 環境作成 + custom domain api.parky.co.jp 紐付け |
Create prod environment + bind custom domain api.parky.co.jp |
公開ポータル dev.parky.co.jp | Public portal | Phase 4 完了 | Phase 4 done | Mapbox / 申請フォーム URL 投入、地域段階展開 | Mapbox token, owner form URL, regional rollout |
| Marketing Portal | Marketing Portal | Phase 11 完了 | Phase 11 done | X API tier / Resend 契約、OAuth 接続 | X API tier, Resend contract, OAuth connections |
| 管理者 / オーナーポータル | Admin / Owner portals | 稼働中 | running | Cloudflare Pages に移行済み(Xserver 不使用) | Migrated to Cloudflare Pages (Xserver not used) |
| モバイルアプリ | Mobile app | プロトタイプ | prototype | (別計画で進行、本ページ対象外) | (tracked separately) |
| メディア(/media/) | Media (/media/) | 移行完了 | migrated | Astro に統合済み。301 + GSC 通知は残作業 | Integrated into Astro. 301 redirects and GSC notification pending |
| Supabase | Supabase | migration 適用中 | migrations in flight | 009 / 010 / 031 の適用確認、地域 seed 本番投入 | Verify 009/010/031 applied, seed region masters to prod |
カテゴリ早見表 Category map
A. Cloudflare prod 構築A. Cloudflare prod
Workers / R2 / KV / Hyperdrive / Queues の本番環境作成と custom domain 紐付け。
Create Workers / R2 / KV / Hyperdrive / Queues prod and bind custom domain.
B. Secrets 投入B. Secrets
store-sync / FCM / Resend / X / Mapbox など 23 本のシークレット。
23 secrets across store-sync, FCM, Resend, X, Mapbox.
C. Supabase 適用確認C. Supabase
009 / 010 / 031 / 046-049 の dev / prod 適用確認、seed & MV REFRESH。
Verify migrations 009/010/031/046-049, run seeds and MV REFRESH.
D. 継続実装D. Continuing impl.
Play sales / DLQ 監視 / R2 移行 / 英語駅ハブ。
Play sales, DLQ monitor, R2 migration, English station hubs.
E. Xserver(完了・参考)E. Xserver (done / reference)
Cloudflare Pages 移行完了。Parky では Xserver 不使用。
Migrated to Cloudflare Pages. Xserver is no longer used for Parky.
F. ドメイン / 契約F. Domains / contracts
marketing / api 本番ドメイン、Mapbox / X API / Resend 契約。
Prod domains for marketing / api, Mapbox / X API / Resend contracts.
G. OAuth 接続G. OAuth wiring
Meta / X / GA4 / Search Console を管理 UI から連携。
Connect Meta / X / GA4 / Search Console from the admin UI.
H. 運用データH. Operational data
レビュー承認、属性データ投入、WP → /media/ 移行、地域段階展開。
Review approval, attribute seeding, WP → /media/, regional rollout.
開発者側の作業 Developer-side tasks
コマンドライン・リポジトリ・クラウドコンソール操作が中心。Claude(このチャット)に「〇〇やって」と指示すれば大半は自動化できます。
Mostly CLI / repo / cloud-console work. Almost all of it can be delegated to Claude in this chat.
A. Cloudflare Workers prod 環境の構築 A. Build the Cloudflare Workers prod environment
必須 required
現在は dev-api.parky.co.jp のみ稼働しており、本番 API api.parky.co.jp が存在しません。
モバイルアプリや本番ポータルを公開する前に、本番用の R2 / KV / Hyperdrive / Queues を作成し、Worker を prod として切り出す必要があります。
Today only dev-api.parky.co.jp runs; there is no api.parky.co.jp yet.
Before shipping the mobile app or the prod portals we need to create prod-equivalent R2 / KV / Hyperdrive / Queues and cut a prod Worker.
具体的な作業
Concrete steps
- Cloudflare ダッシュボードで本番用リソースを新規作成:
- R2 バケット(
parky-prod等) - KV namespace(
parky-cache-prod) - Hyperdrive config(prod 用の Supabase 接続プール)
- Queues producer/consumer × 2(
parky-store-sync-prod/parky-fcm-dispatch-prod)+ DLQ
- R2 バケット(
- Create prod-side resources from the Cloudflare dashboard (R2 / KV / Hyperdrive / Queues × 2 + DLQs).
parky/api/wrangler.tomlの[env.production]セクションをアンコメントし、上で作成した ID を貼り付け- Uncomment
[env.production]inparky/api/wrangler.tomland paste the IDs you just created. bash scripts/set-secrets.sh productionで 23 本の secrets を prod worker に投入- Run
bash scripts/set-secrets.sh productionto seed 23 secrets. npx wrangler deploy --env productionで初回デプロイ → Cloudflare でapi.parky.co.jpを Custom Domain として Worker に紐付け- Deploy with
npx wrangler deploy --env production, then bindapi.parky.co.jpas Custom Domain. - GitHub Actions の prod デプロイワークフローを追加(dev と同型、トリガーは main ブランチ push or 手動)
- Add a prod deploy workflow in GitHub Actions mirroring dev.
参照: cloudflare-setup-steps.html — dev 構築時に使った手順書。リソース名だけ prod に読み替えれば再利用可。
Reference: cloudflare-setup-steps.html — the dev setup runbook, reusable by substituting names.
B. 未投入の secrets 投入 B. Fill in missing secrets
必須(dev も) required (dev too)
dev Worker は consumer が skipped_not_configured で graceful に完走するよう作られていますが、
実 API 疎通のためには下記が必須です。未投入だと store-sync やプッシュ通知が「スキップされ続ける」状態で見かけ上エラーにならず見落としやすい点に注意。
Queue consumers are written to gracefully skip when secrets are missing (skipped_not_configured),
so failures are silent. The real store-sync and push-delivery flows won't run until these are in.
store-sync に必要(Google Play / App Store レビュー・売上同期):
For store-sync (Google Play / App Store reviews & sales):
GOOGLE_PLAY_CLIENT_EMAIL # Service Account の client_email
GOOGLE_PLAY_PRIVATE_KEY # SA の PEM 秘密鍵(改行は \n エスケープ)
GOOGLE_PLAY_PACKAGE_NAME # 例: co.jp.parky.app
APPLE_ISSUER_ID
APPLE_KEY_ID
APPLE_PRIVATE_KEY_P8 # App Store Connect API Key .p8
APPLE_APP_ID # 数値 App ID
APPLE_VENDOR_NUMBER # 8 桁 Vendor Number
Marketing 用に必要:
For Marketing portal:
X_ACCESS_TOKEN # X API アクセストークン(tier 決定後)
X_ACCESS_TOKEN_SECRET
X_CLIENT_ID / X_CLIENT_SECRET # OAuth 2.0 PKCE 用
RESEND_API_KEY # or SENDGRID_API_KEY
META_APP_ID / META_APP_SECRET # Instagram Business OAuth 用
手順(1Password SA 経由推奨):
Steps (prefer 1Password SA):
- 1P の
parky-api-dev-secrets/parky-api-prod-secretsアイテムに値を入れる cd parky/api && bash scripts/set-secrets.sh dev(prod 時はproduction)cd parky/api && bash scripts/set-secrets.sh dev(orproduction).- 反映確認:
npx wrangler secret list --env dev - Verify with
npx wrangler secret list --env dev.
C. Supabase マイグレーション / seed の適用確認 C. Verify Supabase migrations / seeds
必須 required
dev では流し済みだが、本番(同一プロジェクトの別スキーマ運用に未移行なら同一 DB)への適用状況が未確認のマイグレーションが複数あります。
特に 010_codes_oversized_ok.sql が未適用だと「大型車OK」属性フィルタの UI 側ドロップダウンが出ません。
Some migrations are applied in dev but not verified in prod. Without 010_codes_oversized_ok.sql
the "oversized-ok" attribute filter won't appear in the UI dropdown.
| Migration | 内容 | What | 状態 | Status |
|---|---|---|---|---|
009_geo_hierarchy_and_hub_stats.sql |
regions/prefectures/cities/stations/landmarks + hub_inventory_stats MV | geo tables + hub stats MV | dev 適用済 / prod 要確認 | dev ok, verify prod |
010_codes_oversized_ok.sql |
lot_attribute/oversized_ok コード追加 | adds oversized_ok code | dev / prod 両方要確認 | verify in both |
031_store_sync_status_expand.sql |
store_sync_runs.status に queued / started 追加 | adds queued/started to status | dev 適用済 | dev applied |
046-049 |
Marketing Portal(x_* / newsletter / integrations / campaigns / assets 他) | Marketing Portal tables | 2026-04-20 Management API 経由で本番適用済 | Applied to prod 2026-04-20 |
具体的な作業
Concrete steps
- Supabase Management API で適用済 migration 一覧を取得し、上表と突き合わせる
- Fetch applied migration list via Supabase Management API and reconcile.
- 未適用分があれば
infra/supabase/scripts/apply-migration.sh <file>で流す - For any missing ones, run
infra/supabase/scripts/apply-migration.sh <file>. - 地域マスター seed(
90_regions.sql/91_prefectures.sql/92_cities_tokyo.sql/93_stations_tokyo.sql)を本番投入 - Seed region masters (90-93) into prod.
rebuild_nearby_spots.sql実行 →REFRESH MATERIALIZED VIEW hub_inventory_stats;を実行- Run
rebuild_nearby_spots.sqlthenREFRESH MATERIALIZED VIEW hub_inventory_stats;.
D. 継続実装(低優先だが将来必要) D. Continuing implementation (lower priority)
-
推奨
Queues DLQ 監視 cron —
目的: DLQ にメッセージが溜まったことを検知して通知しないと、失敗が気付かれず放置される。作業: Cloudflare Worker の cron で
parky-store-sync-dlq/parky-fcm-dispatch-dlqの件数を 1 日 1 回チェックし、閾値越えで管理者通知を送る。 Why: silent DLQ accumulation = silent failure. How: cron checks DLQ counts daily, alerts admin past threshold. -
推奨
Google Play sales 取り込み —
目的: Play は Cloud Storage に月次 CSV を吐く方式のため API で売上が取れない。現状
skipped_not_configured。作業:api/src/lib/store-sync/google-play.tsに Cloud Storage クライアントを追加し、pubsite_prod_<accountId>/sales/から月次 CSV をダウンロードしてパース。 Why: Play sales come as monthly CSVs in Cloud Storage (no API). How: extendgoogle-play.tswith a Cloud Storage client to ingestpubsite_prod_<id>/sales/. -
任意
R2 本番移行 —
目的: Wasabi は 2026-04-19 に完全削除済。既存の本番データがあれば R2 にコピーが必要(dev にはもうない想定)。作業: 本番 R2 バケット
parky-prodに対してrcloneで同期。 Why: Wasabi removed 2026-04-19; any remaining prod assets must be copied to R2. How: sync withrclone. -
任意
英語駅ハブ
/en/p/[pref]/[city]/[spot]/— 目的: Phase 3-2 で i18n 枠組みは作ったが、駅ハブ本体の英語化は未対応。作業:stations.name_enを使ってテンプレ英語化、/en/p/...動的ルート生成をhub-queriesに追加。 Why: i18n scaffolding exists (Phase 3-2) but station hub pages aren't translated. How: usestations.name_en, add/en/p/...routes inhub-queries.
運用ユーザー側の作業 Operator-side tasks
Xserver パネル・Cloudflare ダッシュボード・各種外部サービス(Mapbox / X / Resend / Google)での 契約・UI 操作・OAuth 認可など、Claude が代行できず必ず人の手が必要な作業です。
These can't be delegated — they require human consent, contracts, or account-level actions in external services.
E. Xserver(完了 / 参考のみ) E. Xserver (completed / reference only)
Parky の全サブドメイン(admin / dev-admin / dev / dev-app-mock / dev-marketing 等)は Cloudflare Pages に移行済みです。Xserver は現在 Parky では使用していません。 このセクションは移行経緯の参考として残しています。
All Parky subdomains (admin, dev-admin, dev, dev-app-mock, dev-marketing, etc.) have been migrated to Cloudflare Pages. Xserver is no longer used for Parky. This section is kept as a historical reference.
F. ドメイン契約 / 外部サービス契約 F. Domain & external-service contracts
| 項目 | Item | 優先度 | Priority | 目的と作業 | Purpose & action |
|---|---|---|---|---|---|
api.parky.co.jp Custom Domain 紐付け |
Bind api.parky.co.jp as Custom Domain |
必須 | required | prod Worker デプロイ後、Cloudflare ダッシュボード → Workers → parky-api → Custom Domain から追加。DNS は Cloudflare zone なので自動で A/AAAA が張られる。 | After prod Worker deploy, add Custom Domain in the CF dashboard; DNS auto-populates (zone is on CF). |
marketing.parky.co.jp 本番契約 |
Prod marketing.parky.co.jp |
推奨 | recommended | dev は dev-marketing.parky.co.jp で稼働中。本番公開時に Cloudflare Pages の parky-portal-marketing プロジェクト(新設)にカスタムドメイン追加。 |
Dev is up; for prod, create a new Pages project and add the custom domain. |
| Mapbox アカウント + Public Token 発行 | Mapbox account & public token | 必須 | required | 目的: Phase 4-1 の駅ハブ / spot 詳細ページのマップ表示に必須。作業: mapbox.com で無料アカウント作成 → Public Token をコピー → deploy-public-dev.yml の env に PUBLIC_MAPBOX_TOKEN を注入(値は 1Password に保存し、GitHub Secrets にも複製)。 |
Why: station-hub & spot maps. How: create Mapbox account, copy Public Token, inject as PUBLIC_MAPBOX_TOKEN in deploy workflow env (store in 1Password + GitHub Secrets). |
| オーナー申請フォーム URL | Owner application form URL | 推奨 | recommended | 目的: /for-owners/ の CTA。作業: Google Forms でフォーム作成(貸主情報・面積・地図リンク・連絡先)→ 共有 URL を PUBLIC_OWNER_APPLICATION_URL に設定。未設定時は mailto:owners@parky.co.jp が使われる。 |
Why: CTA on /for-owners/. How: create a Google Form, set its URL to PUBLIC_OWNER_APPLICATION_URL; fallback is mailto:. |
| X API Tier 決定 + OAuth | Decide X API tier + OAuth | 推奨 | recommended | 目的: Marketing Portal の X 自動投稿・リスニング。作業: Free / Basic ($100/月) / Pro ($5,000/月) を選ぶ。自動リアクは Basic 以上必須(cron は tier 見て自動 skip 済)。developer.x.com でアプリ作成 → Client ID/Secret を secrets 投入 → Integrations ページの「X 接続」ボタンでアカウント紐付け。 | Why: X auto-post & listen. How: choose tier (Free / Basic / Pro; auto-react needs Basic+); create app on developer.x.com, put Client ID/Secret in secrets, then click "Connect X" from Integrations. |
| Resend or SendGrid 契約 | Resend or SendGrid contract | 推奨 | recommended | 目的: ニュースレター配信。Supabase SMTP エンジンへのフォールバックは可能だが、本番配信はスループット不足。作業: Resend 推奨(送達率良好)。API キー発行 → RESEND_API_KEY を secrets 投入 → Integrations ページで provider を resend に設定。 |
Why: newsletter delivery (Supabase SMTP fallback is too low-throughput for prod). How: Resend recommended; issue API key, inject as RESEND_API_KEY, set provider to resend in Integrations. |
G. 外部サービスの OAuth 接続(Marketing Portal Integrations 画面) G. OAuth connections (Marketing Portal Integrations page)
推奨 recommended
Marketing Portal はダッシュボードの KPI / 分析 / 配信機能を各外部サービスから引いてきます。 OAuth アクセス許可は ブラウザで人が明示同意する必要があるため、Claude では代行できません。
The Marketing Portal pulls KPIs and analytics from external services. OAuth consent must come from a human in a browser.
接続対象(4 種)
Four connections
- Meta (Instagram Business) —
/integrations→ Meta 接続ボタン → Facebook ログイン → Instagram Business アカウント選択 → 権限許可 - Meta (Instagram Business) — click "Connect Meta" on
/integrations, log in to Facebook, pick the IG Business account. - X (OAuth 2.0 PKCE) —
/integrations→ X 接続ボタン → developer.x.com で作成したアプリと連携 - X (OAuth 2.0 PKCE) — click "Connect X" and authorize the app created on developer.x.com.
- Google Search Console —
/integrations→ GSC 接続ボタン → Google ログイン → 対象サイトを選ぶ - Google Search Console — click "Connect GSC", log in with Google, pick the target site.
- Google Analytics 4 — Service Account JSON を直接アップロード(
/integrations/ga4/upload-sa-json)。GA4 のプロパティで SA のメールアドレスに「閲覧者」権限を付与するのを忘れずに - Google Analytics 4 — upload the Service Account JSON at
/integrations/ga4/upload-sa-json; remember to grant the SA "Viewer" on the GA4 property.
H. 運用データの投入 / 運用フロー H. Operational data & workflows
-
必須
H-1.
PUBLIC_PUBLISHED_PREFECTURESの設定 — 目的: 地域段階展開。未設定(空)だと駅ハブが 0 件しか生成されず公開ポータルが空っぽになります。作業:deploy-public-dev.ymlの env にPUBLIC_PUBLISHED_PREFECTURES=tokyoを追加(初期は東京のみ推奨、順次kanagawa,saitama,...を足す)。*で全解禁。 Why: controls which prefectures publish. Without it, zero station hubs generate. How: setPUBLIC_PUBLISHED_PREFECTURES=tokyoin the deploy workflow; use*for full release.
参照:ops/regional-rollout.mdSeeops/regional-rollout.md. -
推奨
H-2.
parking_reviewsの承認運用 — 目的: Phase 2-2 の AggregateRating / Review の星 ⭐ を駅ハブ・spot 詳細に出すには、status='approved'のレビューが必要です。未承認だと何も表示されない(バグではなくデータ欠如)。作業: 管理者ポータル「レビュー管理」画面で、投稿されたレビューを内容確認のうえ承認ボタンを押す運用フローを定着させる。 Why: AggregateRating stars only render when reviews areapproved. How: make it routine to approve submitted reviews from the admin portal's "Review management" page. -
推奨
H-3.
parking_lot_attributesのデータ投入 — 目的: Phase 2-1 の属性掛合わせフィルタページ(/p/.../reservable//ev-charging//oversized-ok/)は、属性データが埋まらないと SSG で生成されません(閾値HUB_FILTER_MIN_COUNT=3)。作業: 管理者ポータル「駐車場管理」画面の各駐車場詳細で、該当属性のチェックボックスをオンにする(または一括 SQL でデータ投入)。 Why: attribute filter pages only build when enough lots have the attribute (threshold 3). How: check the attribute boxes on each lot in the admin portal, or bulk-insert via SQL. -
完了
H-4. WordPress →
/media/移行 — 済み: WordPress は廃止済み。web/home/src/pages/media/の Astro ルートとして統合完了(Supabasearticlesテーブル駆動)。残作業:media.parky.co.jpからの 301 リダイレクト設定と Google Search Console へのドメイン変更通知。 Done: WordPress retired. Content is integrated underweb/home/src/pages/media/as an Astro route (Supabasearticlestable). Remaining: 301 redirects frommedia.parky.co.jpand GSC domain change notification. -
任意
H-5. Parky ブランド / コンテンツ設定 —
目的: Marketing Portal の「ブランド」画面でサイト名・トーン・NG ワード・カバー画像などを登録しておくと、AI 生成記事 / SNS 投稿のトーンが揃う。作業:
/brand画面で単一行の設定レコードを編集。 Why: aligns AI-generated posts to brand voice. How: edit the single-row record on/brand.
作業の依存関係 Task dependencies
下図は「どのタスクを先に片付けると次に進めるか」の関係。 赤線は本番公開に必須のクリティカルパス、灰色は順序が緩いもの。
Which tasks unblock which. Red = critical path to production; grey = loose ordering.
推奨着手順序(最短ルート) Suggested order (shortest path)
上の依存グラフから「クリティカルパスだけ」を線形に並べると、以下が本番公開までの最短ルート:
Linearising the critical path gives the shortest route to production:
- E. 完了済み — Cloudflare Pages 移行済みのためスキップ
- E. Already done — Cloudflare Pages migration complete, skip this step.
- C. Supabase migration
010と地域 seed(90-93)を本番適用(Claude) - C. Apply Supabase
010and region seeds 90-93 in prod (Claude can do this). - F. Mapbox アカウント作成 + Public Token を 1Password → GitHub Secrets に投入(あなた/10 分)
- F. Mapbox account + token into 1Password / GitHub Secrets (you, 10 min).
- H-1.
PUBLIC_PUBLISHED_PREFECTURES=tokyoを workflow env に追加(Claude) - H-1. Add
PUBLIC_PUBLISHED_PREFECTURES=tokyoto workflow env (Claude). - A. Cloudflare prod Worker 作成 +
set-secrets.sh production(Claude が CLI 操作) - A. Create prod Worker, run
set-secrets.sh production(Claude on CLI). - B. store-sync secrets を 1P に揃える(あなた/30 分)→
set-secrets.sh dev(Claude) - B. Gather store-sync secrets into 1P (you, 30 min), then
set-secrets.sh dev(Claude). - F. Cloudflare ダッシュボードで
api.parky.co.jpを prod Worker に Custom Domain 紐付け(あなた/5 分) - F. Bind
api.parky.co.jpas Custom Domain in CF dashboard (you, 5 min). - 🚀 ここで本番公開。以降は H-2 / H-3 / H-4 / G を運用しながら順次
- 🚀 Production launch. Address H-2 / H-3 / H-4 / G iteratively post-launch.
参照ドキュメント Reference docs
- cloudflare-setup-steps.html — Cloudflare dev 初期構築手順(prod 時の参考)
ops/xserver-subdomain-migration.md— Xserver サブドメイン再作成手順(参考・Parky では Cloudflare Pages に移行済み)ops/regional-rollout.md— 公開都道府県の段階展開ops/wordpress-to-astro-media.md— WordPress →/media/移行手順ops/build-time-scaling.md— ビルド時間スケーリング計画(規模拡大時の参考)ops/logging.md— ロギング / 観測性- architecture.html — システム全体像
- repository.html — リポジトリ構成とデプロイ経路