Parky プロジェクト / 残作業チェックリスト Parky project / pending-work checklist

本番化に向けて残っている「追加でやらなきゃいけない作業」まとめ 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.

このページの読み方 How to read this page

各タスクには 「何のために必要か(目的)」「具体的に何をやるか(手順)」を必ず添えています。 また、必須(これをやらないと本番公開できない)/推奨(運用上やっておくべき)/任意(将来の拡張)でレベル分けしています。

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 BFFCloudflare 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.jpPublic portal Phase 4 完了 Phase 4 done Mapbox / 申請フォーム URL 投入、地域段階展開 Mapbox token, owner form URL, regional rollout
Marketing PortalMarketing 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
SupabaseSupabase migration 適用中 migrations in flight 009 / 010 / 031 の適用確認、地域 seed 本番投入 Verify 009/010/031 applied, seed region masters to prod

カテゴリ早見表 Category map

開発者側の作業 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

目的 Purpose

現在は 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

  1. 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
  2. Create prod-side resources from the Cloudflare dashboard (R2 / KV / Hyperdrive / Queues × 2 + DLQs).
  3. parky/api/wrangler.toml[env.production] セクションをアンコメントし、上で作成した ID を貼り付け
  4. Uncomment [env.production] in parky/api/wrangler.toml and paste the IDs you just created.
  5. bash scripts/set-secrets.sh production で 23 本の secrets を prod worker に投入
  6. Run bash scripts/set-secrets.sh production to seed 23 secrets.
  7. npx wrangler deploy --env production で初回デプロイ → Cloudflare で api.parky.co.jp を Custom Domain として Worker に紐付け
  8. Deploy with npx wrangler deploy --env production, then bind api.parky.co.jp as Custom Domain.
  9. GitHub Actions の prod デプロイワークフローを追加(dev と同型、トリガーは main ブランチ push or 手動)
  10. 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)

目的 Purpose

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):

  1. 1P の parky-api-dev-secrets / parky-api-prod-secrets アイテムに値を入れる
  2. cd parky/api && bash scripts/set-secrets.sh dev(prod 時は production
  3. cd parky/api && bash scripts/set-secrets.sh dev (or production).
  4. 反映確認: npx wrangler secret list --env dev
  5. Verify with npx wrangler secret list --env dev.

C. Supabase マイグレーション / seed の適用確認 C. Verify Supabase migrations / seeds

必須 required

目的 Purpose

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

  1. Supabase Management API で適用済 migration 一覧を取得し、上表と突き合わせる
  2. Fetch applied migration list via Supabase Management API and reconcile.
  3. 未適用分があれば infra/supabase/scripts/apply-migration.sh <file> で流す
  4. For any missing ones, run infra/supabase/scripts/apply-migration.sh <file>.
  5. 地域マスター seed(90_regions.sql / 91_prefectures.sql / 92_cities_tokyo.sql / 93_stations_tokyo.sql)を本番投入
  6. Seed region masters (90-93) into prod.
  7. rebuild_nearby_spots.sql 実行 → REFRESH MATERIALIZED VIEW hub_inventory_stats; を実行
  8. Run rebuild_nearby_spots.sql then REFRESH MATERIALIZED VIEW hub_inventory_stats;.

D. 継続実装(低優先だが将来必要) D. Continuing implementation (lower priority)

運用ユーザー側の作業 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

目的 Purpose

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

  1. Meta (Instagram Business)/integrations → Meta 接続ボタン → Facebook ログイン → Instagram Business アカウント選択 → 権限許可
  2. Meta (Instagram Business) — click "Connect Meta" on /integrations, log in to Facebook, pick the IG Business account.
  3. X (OAuth 2.0 PKCE)/integrations → X 接続ボタン → developer.x.com で作成したアプリと連携
  4. X (OAuth 2.0 PKCE) — click "Connect X" and authorize the app created on developer.x.com.
  5. Google Search Console/integrations → GSC 接続ボタン → Google ログイン → 対象サイトを選ぶ
  6. Google Search Console — click "Connect GSC", log in with Google, pick the target site.
  7. Google Analytics 4 — Service Account JSON を直接アップロード(/integrations/ga4/upload-sa-json)。GA4 のプロパティで SA のメールアドレスに「閲覧者」権限を付与するのを忘れずに
  8. 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

作業の依存関係 Task dependencies

下図は「どのタスクを先に片付けると次に進めるか」の関係。 赤線は本番公開に必須のクリティカルパス、灰色は順序が緩いもの。

Which tasks unblock which. Red = critical path to production; grey = loose ordering.

graph TD classDef blocker fill:#fee,stroke:#d33,stroke-width:2px,color:#700; classDef soft fill:#f3f4f6,stroke:#888,color:#333; subgraph DEV["開発者側"] A["A. Cloudflare prod 構築"]:::blocker B["B. secrets 投入"]:::blocker C["C. Supabase 010 適用 / 地域 seed"]:::blocker D1["D. DLQ 監視 cron"]:::soft D2["D. Play sales 実装"]:::soft D3["D. 英語駅ハブ"]:::soft end subgraph OPS["運用ユーザー側"] E["E. Xserver 再作成"]:::blocker F1["F. api.parky.co.jp 紐付け"]:::blocker F2["F. Mapbox token"]:::blocker F3["F. 申請フォーム URL"]:::soft F4["F. X API tier / Resend 契約"]:::soft G["G. OAuth 接続 (Meta/X/GSC/GA4)"]:::soft H1["H-1. PUBLIC_PUBLISHED_PREFECTURES"]:::blocker H2["H-2. レビュー承認運用"]:::soft H3["H-3. 属性データ投入"]:::soft H4["H-4. WP→/media/ 移行"]:::soft end A --> F1 A --> B E --> F2 F2 --> H1 C --> H1 F4 --> G B --> D2 H1 --> LAUNCH["🚀 本番公開"] F1 --> LAUNCH E --> LAUNCH F2 --> LAUNCH H4 -.推奨.-> LAUNCH G -.推奨.-> LAUNCH H2 -.推奨.-> LAUNCH H3 -.推奨.-> LAUNCH

推奨着手順序(最短ルート) Suggested order (shortest path)

上の依存グラフから「クリティカルパスだけ」を線形に並べると、以下が本番公開までの最短ルート:

Linearising the critical path gives the shortest route to production:

  1. E. 完了済み — Cloudflare Pages 移行済みのためスキップ
  2. E. Already done — Cloudflare Pages migration complete, skip this step.
  3. C. Supabase migration 010 と地域 seed(90-93)を本番適用(Claude)
  4. C. Apply Supabase 010 and region seeds 90-93 in prod (Claude can do this).
  5. F. Mapbox アカウント作成 + Public Token を 1Password → GitHub Secrets に投入(あなた/10 分)
  6. F. Mapbox account + token into 1Password / GitHub Secrets (you, 10 min).
  7. H-1. PUBLIC_PUBLISHED_PREFECTURES=tokyo を workflow env に追加(Claude)
  8. H-1. Add PUBLIC_PUBLISHED_PREFECTURES=tokyo to workflow env (Claude).
  9. A. Cloudflare prod Worker 作成 + set-secrets.sh production(Claude が CLI 操作)
  10. A. Create prod Worker, run set-secrets.sh production (Claude on CLI).
  11. B. store-sync secrets を 1P に揃える(あなた/30 分)→ set-secrets.sh dev(Claude)
  12. B. Gather store-sync secrets into 1P (you, 30 min), then set-secrets.sh dev (Claude).
  13. F. Cloudflare ダッシュボードで api.parky.co.jp を prod Worker に Custom Domain 紐付け(あなた/5 分)
  14. F. Bind api.parky.co.jp as Custom Domain in CF dashboard (you, 5 min).
  15. 🚀 ここで本番公開。以降は H-2 / H-3 / H-4 / G を運用しながら順次
  16. 🚀 Production launch. Address H-2 / H-3 / H-4 / G iteratively post-launch.

参照ドキュメント Reference docs