デモ → 本番化ロードマップ 方針・手順・進捗の社内ドキュメント

DEMO TO PRODUCTION

デモを活かしつつ、本番でも使える形へ。

セミナー用デモはそのまま残し、顧客本番はサブドメイン・共通SQL・統一マスタ・AIキー方針で段階的に切り出します。おおむね 8割共通・2割カスタム を目標に進めます。

共通マスタ(着手済み)

複数デモ連携のため、tenant / employee / customer / location の正規名と ID 対応表を DX/demo/shared/ に置きました。

まず1社だけ練習する(おすすめ)

いきなり全部本番化せず、1デモ × 1社 × 固定テナント でリハーサルするのが安全です。通常デモの「業種切替」は本番練習では出ません。

パス URL(今すぐ): /DX/practice/sites/yamada/ · サブドメイン(DNS後): yamada.astropro.net → ドキュメントルートを sites/yamada/ に

基本方針(4つ)

デモはデモのまま残す

DX/demo/ はセミナー・商談用の「触れるサンプル」として維持。本番は別ホスト・別DB・別設定で動かし、デモを壊さない。

8割共通・2割カスタム

コア(認証・テナント・マスタ・API)は共通化。業種ラベル・画面項目・ワークフロー分岐だけ顧客ごとに差し替える。

1本のコードベース

デモ用と本番用でリポジトリを分けない。設定(環境変数・tenant_id・feature flag)で切り替える。

優先度で段階導入

すでにバックエンド化済みの booking・物品ナビ(item)から。JS-only デモは schema 確定後に API 化。

推奨アーキテクチャ(全体像)

1つのコードベースを、ホスト名と設定で「デモ」と「顧客本番」に分岐させます。

[ セミナー・商談 ] demo.astropro.net / DX/demo/* │ ├─ APP_MODE=demo → SQLite / サンプルデータ / Mock AI / ?t= で業種切替 │ [ 顧客本番 ] {slug}.astropro.net (例: salon-yamada.astropro.net) │ ├─ APP_MODE=production ├─ tenant 解決: HTTP Host → tenants.slug ├─ MySQL(共通サーバ、tenant_id で行分離) ├─ 共通コア: auth / employee / location / permission ├─ アプリ層: booking / item(物品ナビ) / knowledge …(feature flag) └─ AI: tenant.api_key または AstroPro 共用キー(利用量で切替) [ 8割 ] 共通 PHP lib・schema 接頭辞・API 形式・employee マスタ [ 2割 ] lexicon(表示ラベル)/ 画面項目 / 承認フロー / 業種テンプレ

EFFY 予約は別製品として維持。サロン予約の本命は EFFY、Dコンサル伴走デモは booking デモが参考、という現行方針はそのままです。

段階的手順(Phase 0〜5)

一度に全部やらない。Phase 0 でルールを決め、Tier 1 から実案件に載せていきます。

  • Phase 0

    共通基盤の設計(今ここ)

    デモを量産する前に、名前・テナント・AI・DB のルールを決める。

    • 共通マスタ命名規約を文書化(employee / tenant / location など)
    • テナント解決方式を決定(サブドメイン推奨)
    • AI キー運用ポリシーを決定(共用 vs 顧客別)
    • 各デモの schema.sql を棚卸し・不足分を追加
    • demo/catalog.php を製品化優先度の索引として使う
  • Phase 1

    Tier 1 デモの本番化(booking / 物品ナビ)

    すでに PHP + API がある予約ポータルと物品ナビを先に実案件へ。

    • MySQL を本番 DB に固定(SQLite / JSON はローカル・デモのみ)
    • デモパスワード・PIN を本番認証(bcrypt + ロール)に置換
    • booking: ?t=slug → サブドメイン or パスで tenant 解決
    • 物品ナビ (item): 必要なら tenant_id を追加(現状は単一組織・ledger.json)
    • 顧客ごとに booking / 物品ナビ データを同一 DB で tenant 分離
  • Phase 2

    共通ライブラリの抽出

    booking / 物品ナビ で重複している bootstrap・CSRF・API 応答を共通化。

    • DX/lib/ または apps/core/ に PDO ファクトリ・migrate ヘルパー
    • JSON API レスポンス・CSRF・セッションの共通パターン
    • テナント middleware(Host ヘッダ → tenant レコード)
    • 環境変数ローダー(.env / config.php 統一)
  • Phase 3

    Tier 2〜3 デモの API 化

    multilang → knowledge / stocknavi の順でバックエンドを実装。

    • multilang: state.json → DB、PIN → 本番認証、Perplexity キーは tenant 設定
    • knowledge / stocknavi: 既存 schema.sql に tenant_id を追加して API 実装
    • JS デモ(flow / shift / crm 等)は API 経由で同じデータモデルを参照
  • Phase 4

    マスタ統一(8割の核)

    デモごとにバラバラな「担当者」概念を1つの employee モデルへ。

    • 共通: tenant, employee, location, role, permission
    • booking: bk_staff(ログイン)と bk_resource(予約枠)の関係を整理
    • flow/shift: staffId / companies → employee_id + tenant_id
    • crm: stylist / attorney 等は employee.role または industry_extension で表現
    • UI ラベルのみ業種別 lexicon で差し替え(2割カスタム)
  • Phase 5

    AI デモの本番ゲートウェイ

    MockAI / localStorage をサーバー側 AI プロキシに置き換え。

    • DX/lib/AiGateway.php — プロバイダ抽象(Perplexity / OpenAI 等)
    • 利用量・レート制限・ログ(tenant 単位)
    • 軽量利用: AstroPro 共用キー / 本格利用: tenant.api_key_encrypted
    • デモモード: キーなしでもモック応答(セミナー用)

デモ成熟度マトリクス

現状の棚卸しです。改訂したらこのページの配列を更新してください。

デモ / 製品 段階 SQL バックエンド テナント 次のアクション
EFFY予約 製品 別製品 本番済 製品側 Dコンサル導線から紹介のみ
予約ポータル (booking) Tier 1 bk_* schema.sql あり PHP+SQLite/MySQL ?t=slug(要サブドメイン化) Phase 1 最優先
物品ナビ (item) Tier 1 ledger.json(デモ同期) PHP+Ajax なし(要追加検討) Phase 1
多言語 (multilang) Tier 2 JSON(要 SQL 化) PHP+Perplexity なし Phase 3、APIキー tenant 化
ナレッジ (knowledge) Tier 3 kn_* schema.sql(未実装) JS only なし Phase 3
在庫ナビ (stocknavi) Tier 3 sn_* schema.sql(未実装) JS only companyId(JS) Phase 3
ワークデスク (flow) Tier 4 なし JS+localStorage staff/managers 独自 Phase 4 マスタ統一後
シフト (shift) Tier 4 なし JS companies[] employee 統一
顧客ナビ (crm) Tier 4 なし JS 業種別担当キー lexicon + extension
経営ボード (board) Tier 4 なし JS companies API 化は後回し可
ガント (gantt) Tier 4 なし JS 担当者文字列 employee_id 参照へ
AIデモ群 (ai) Tier 4 なし Mock/localStorage なし Phase 5 AiGateway
asis-flow Tier 4 — 静的 — 本番化対象外(資料)

schema / データ: demo/booking/schema.sql · demo/item/data/ledger.json · demo/knowledge/schema.sql · demo/stocknavi/schema.sql

スタッフ・担当者マスタの命名統一

デモごとにバラバラな名前を、Phase 4 で1モデルに寄せます。UI の日本語ラベルだけ業種 lexicon で変えます。

現状(デモ別)目標(共通)
booking: bk_staff / bk_resource.role=staff employee(ログイン可)+ bookable_resource(予約対象)
flow: staffId, managers[], worker/manager employee_id + role(approver 等)
shift: companies[].staff[] tenant + employee
crm: stylist, attorney, primaryNurse… employee + industry_lexicon(表示名のみ差替)
gantt: 担当者文字列 assignee_employee_id

詳細: 共通マスタ仕様 · 段階手順: マスタ統一手順 · 目標テーブル例: core_tenant · core_employee · core_location(将来。現状は shared JSON がソース)

サブドメイン・テナント方針

顧客ごとに URL を分け、データは tenant_id で行分離します(booking がすでに近い形)。

推奨: サブドメイン
  • {slug}.astropro.net → tenants.slug
  • SSL はワイルドカード証明書
  • デモは demo.astropro.net 固定
移行ステップ(booking 例)
  • 現状: ?t=midori|food|trim で切替
  • 中間: パス /t/{slug}/ も許容
  • 本番: Host ヘッダのみで tenant 決定
  • デモ URL は従来どおり維持

AI API キー運用

multilang がすでに .env の Perplexity 読み込み・レート制限・モック fallback を持っています。これを全 AI 機能の標準にします。

利用形態APIキー制限フォールバック
デモ / セミナー AstroPro 共用 Perplexity(.env) max_calls / 時間制限(multilang と同型) モック応答
POC・小規模本番 共用キー + tenant 別利用量ログ 月次上限アラート キー未設定時は機能オフ
本格本番 tenant_settings.ai_api_key(暗号化保存) 顧客自身の契約・上限 管理画面でキー入力を促す

実装参照: demo/multilang/lib/perplexity.php · demo/multilang/lib/secret.php

8割共通・2割カスタムの切り分け

8割 — 共通(コードを分岐させない)
  • ログイン・権限・監査ログ
  • employee / tenant / location マスタ
  • REST API の形・CSRF・エラー形式
  • マイグレーション・バックアップ手順
  • AI ゲートウェイ(プロバイダ差し替え)
2割 — カスタム(設定・lexicon で)
  • 画面ラベル(担当者→スタイリスト等)
  • 業種テンプレの初期データ
  • 承認ルート・通知先
  • 追加フォーム項目(JSON schema)
  • ブランド色・ロゴ(tenant theme)

booking の lexicon_json(legal テンプレで「担当者」等)が、2割カスタムの先行例です。

顧客案件ごとの本番化チェック

案件(cases.php)で「どのデモを本番化するか」決まったら、以下を案件フォルダまたは Notion で管理。

契約前
  • 対象デモ・Tier を決定
  • 8割/2割の差分を lexicon 表に書く
  • サブドメイン slug を決める
  • AI: 共用 or 顧客キーか合意
開発
  • schema.sql を MySQL に適用
  • tenant レコード + 初期 employee
  • デモ URL と本番 URL の両方動作確認
  • バックアップ・障害連絡先
引き渡し
  • 管理画面ログイン情報
  • API キー設定手順(該当時)
  • 操作マニュアル(ナレッジデモ連携可)
  • 保守範囲(2割変更の受け方)
デモ維持
  • DX/demo/ のサンプルデータ更新
  • 本番修正をデモに逆マージしない
  • セミナー用 Mock AI は常に有効