| 文書バージョン | 1.0 |
|---|---|
| 発行日 | 2026-07-27 |
| 作成者 | RERISE JAPAN開発チーム |
| 対象システム | 会員サイト(frontend / backend / DB) |
| 参照文書 | docs/client-docs/basic-design.html(基本設計書)/ docs/requirements.md |
| 区分 | 役職・氏名 | 承認日 | 押印 |
|---|---|---|---|
| 承認者 | 印 |
||
| 確認者 | 印 |
||
| 作成者 | RERISE JAPAN開発チーム | 2026-07-27 | 印 |
| 版数 | 改訂日 | 改訂者 | 改訂内容 |
|---|---|---|---|
| 1.0 | 2026-07-27 | RERISE JAPAN開発チーム | 初版作成。CLAUDE.md(デプロイ手順・環境変数運用ルール)、docs/SCOPE_PROGRESS.md、deploy-frontend.sh/deploy-backend.sh、backend/src/routers 実装、docs/requirements.md を基に現行運用の実態を反映した運用保守ドキュメントとして作成。 |
図1-1: システム全体構成図
| 区分 | 内容 |
|---|---|
| フロントエンド | React 19 / TypeScript 5 / shadcn/ui / Tailwind CSS / Vite 7 / Framer Motion。配信基盤: Cloudflare Pages(プロジェクト名 smart-ec-link) |
| バックエンド | Python 3.12+ / FastAPI / SQLAlchemy 2.0 / Alembic。実行基盤: Google Cloud Run(リージョン asia-northeast1/サービス名 smart-ec-academy-api) |
| データベース | PostgreSQL(Supabase Free プラン)。スキーマ変更はAlembicマイグレーションで管理 |
| 認証 | Supabase Auth(JWT + RLS + TOTP 2要素認証) |
| AI | Gemini 2.5 Flash(google-genai SDK)。議事録の要約生成・タスク抽出・前回タスク照合に利用(無料枠 250 RPD) |
| 動画配信 | Cloudflare R2 + Workers(署名付きURL方式) |
| 外部連携 | Chatwork API(通知)/ Zoom API・Webhook(議事録取込)/ Google Sheets・Drive API(議事録・デポジット・契約管理シート連携) |
| 対象 | ポート |
|---|---|
| フロントエンド(開発サーバー) | 3847 |
| バックエンド(開発サーバー) | 7795 |
開発サーバーは1プロジェクトにつき1つのみ維持する。別ポートでの重複起動は行わない。
| 項目 | 内容 |
|---|---|
| バックエンドAPI URL | https://smart-ec-academy-api-786237390070.asia-northeast1.run.app |
| フロントエンドURL | https://smart-ec-link.pages.dev(独自ドメイン運用時はそちらを正とする) |
| GCPプロジェクト | gen-lang-client-0630810646(2026-04-14 移行完了。当プロジェクトには smart-ec-academy-api のみが存在し、他サービスとは同居していない) |
| Cloud Runサービス名 | smart-ec-academy-api |
旧GCPプロジェクト roulette-jelly-ec 上の smart-ec-academy-api は2026-04-14に削除済み。roulette-jelly-ec / ai-agent-biz-2026 / crevio-platform / tiktokshop-research / amazon-catalog-tool 等、他事業のGCPプロジェクトに対して本システムのコマンドを実行しないこと。Cloudflare Pagesも smart-ec-link(本番)と smart-ec-academy(旧・テスト用)を混同しないこと。
管理画面(オーナー/管理者権限)の会員管理ページから、会員の登録状況・契約プラットフォーム(platforms 配列)・ロールを確認する。
会員登録自体はバックエンドAdmin APIによる一括処理(/api/contracts/register)で行われ、登録時にスプレッドシート追記・Chatwork通知が自動実行される。
会員からの質問はQ&Aページに投稿され、AIアシスタント(伊藤遥)がドラフト回答を生成する。本番掲載は平部の承認のみで公開可能とする運用であり、松田承認のチェックは不要(平部が別途松田に確認する運用のため)。
/admin/opsにQ&A管理として集約)を開くstatus='published' に遷移し、Q&Aページに即時反映される承認のないQ&Aを勝手に公開掲載しない。会員が閲覧する情報の信頼性に直結するため、承認は必ず平部本人が実行する。
運営者ミーティング(松田氏×平部、週3回)の議事録は、Zoom Webhookからの自動取込パイプラインで処理される。
Zoom AI要約(日付・数値をハルシネーションする性質があるため)は使用せず、必ずVTT(transcript)を情報源とする。VTT自動取得が使えない場合は、genspark等で作成した議事録の共有URL/テキストを管理画面から貼り付ける手動フォールバックが利用できる(レガシー扱い)。
管理画面の「承認してスプシ+HTML公開」ボタンは、公開先ディレクトリがローカルリポジトリ前提の実装になっているため、Cloud Run上では正しく動作しない(公開URLが生成されず、承認済みドラフトのみ削除される事故につながる)。議事録の承認・公開は必ずローカル環境で実行する手順とし、承認後はスプレッドシート(環境変数 MINUTES_SHEET_ID で指定・松田氏と共有)へ本体行・タスク・論点を書き込み、DB上の下書き(meeting_minute_drafts)は削除する。確定議事録の単一真実源はスプレッドシートであり、DBには確定議事録を残さない。
議事録データ・タスク一覧はオーナー権限のみアクセス可能。タスク担当者は平部/松田のみ。
TEMU顧客のデポジット残高不足の催促は、会員サイトの管理画面ではなくChatwork上で運用する(/admin/deposits画面は廃止済み)。
承認URLはHMAC署名付き・有効期限7日。直近5日以内に張さん(スマート社担当)が催促済みの顧客ルームは自動除外される。
| 通知内容 | トリガー |
|---|---|
| コンテンツ追加・レポート更新・お知らせ公開 | 各機能の管理画面操作時に自動投稿 |
| 議事録タスクのリマインド | 未完了タスクを次回ミーティング前日に通知 |
| Q&A回答ドラフト | AIボット(伊藤遥)が生成し承認後に公開 |
| 申込フォーム(Google Forms経由)の受信 | SEL運営本部Chatwork(room_id 434842968)へ即時通知。取りこぼし防止のため会員アカウントは自動作成しない |
| 決済スクリーンショットのアップロード失敗 | SEL運営本部Chatworkへ即時アラート+Google Formハイブリッド予備経路の案内 |
デプロイはユーザー(平部)の明示的な承認を得てから実行する。承認を得ずにデプロイコマンドを実行しない。
フロントエンドはCloudflare Pages(プロジェクト名 smart-ec-link)で配信している。Git連携は行っておらず、git pushでは自動デプロイされない。必ず以下のスクリプトを実行する。
./deploy-frontend.sh
スクリプトの内容: cd frontend → npm run build → npx wrangler pages deploy dist --project-name smart-ec-link --branch main --commit-dirty=true
フロントエンドデプロイはmainブランチ・developブランチの両方に同時実行する運用とする。developのみの単独デプロイは行わない。
バックエンドはGoogle Cloud Run(サービス名 smart-ec-academy-api)で稼働している。デプロイは以下のスクリプトのみを使用し、生の gcloud コマンドを直接叩かない。
./deploy-backend.sh
スクリプトは以下の3ステップを自動実行する。
--select=F821,F822,F823,E9:未定義名・構文エラーの検出)python -m compileall)gcloud run deploy --source . --region asia-northeast1 --project gen-lang-client-0630810646)致命バグ検査を必須化しているのは、2026-06-04〜07-08に発生した owner_approve 関数のNameError(未定義名によるクラッシュ)が本番に流出した事故の再発防止のため。
| 項目 | 内容 |
|---|---|
| 真実源 | backend/.env.local。Cloud Runの環境変数と常に同期させる |
| 禁止コマンド | gcloud run services update --set-env-vars(全環境変数が上書きされる事故の原因となるため禁止) |
| 正しいコマンド | --update-env-vars のみを使用する。複数変数を指定する場合は区切り文字 ### を使う |
--update-env-vars で ### 区切りを使う場合、先頭に ^###^ のデリミタ宣言が必須。これを怠ると複数の値が1つの環境変数に連結されてしまい、Sheets API等の外部連携が404エラーになる事故につながる。単一の環境変数のみ変更する場合は KEY=value 単体で渡す方が安全。
環境変数はfrontend/backendとも .env.local のみを使用する(.env、.env.test、.env.development、.env.example は作成しない)。frontendは VITE_* プレフィックス必須。ハードコード禁止(process.env / import.meta.env は設定モジュール経由のみ)。
backend/.env.local(またはfrontendの .env.local)に該当キーが設定されているか確認するDATABASE_URL の値が正しいか、接続文字列の形式に誤りがないかを確認するalembic upgrade head を実行するDB関連の異常が疑われる場合、まずSupabase Dashboardで以下を確認する。
app_metadata.role)利用状況を記録するJSONカウンタファイルが空ファイル化する事象が発生し、そのファイルを読み取る関数が例外を送出したことで、当該機能への全リクエストが503エラーとなる障害が2日間継続した。
恒久対応: カウンタファイルの読み取り処理を、JSONパースに失敗しても例外を送出せず空データとして継続処理する「破損耐性のある読み取り」に修正した。破損したファイル自体もクラウドストレージ上で空オブジェクト({})に修復した。
教訓: キャッシュ・カウンタ用途の補助ファイルであっても、読み取り失敗時に全リクエストを落とす実装にしない。読み取り関数は「壊れたデータは初期値として扱い処理を継続する」フェイルセーフな設計とすること。
契約の甲側承認処理(owner_approve)内で未定義の変数(phase_types)を参照しており、本番環境でNameErrorによるクラッシュが発生していた。
恒久対応: バグを修正した上で、デプロイスクリプト(deploy-backend.sh)に flake8 --select=F821,F822,F823,E9 による致命バグ検査を必須化し、未定義名・構文エラーを含むコードが本番にデプロイされることを構造的に防止した。
backend/app/models/__init__.py)を変更するalembic revision --autogenerate でマイグレーションファイルを生成するalembic upgrade head を実行してDBに反映する起動時にはスキーマ自動補完(ALTER TABLE IF NOT EXISTS)も併用しているが、正式なスキーマ管理はAlembicマイグレーションを正とする。
| 対象 | 真実源 |
|---|---|
| 型定義 | frontend/src/types/index.ts(変更時はフロントエンド→バックエンドの順で同期) |
| SQLAlchemyモデル(DB定義) | backend/app/models/__init__.py |
| 要件定義 | docs/requirements.md |
| 実装進捗・計画 | docs/SCOPE_PROGRESS.md |
| デプロイ情報 | docs/DEPLOYMENT.md |
| 環境変数 | backend/.env.local(Cloud Run環境変数と同期) |
| 確定議事録 | Googleスプレッドシート(MINUTES_SHEET_IDで指定・松田氏と共有)。DBの下書きテーブルは承認後に削除 |
A. サーバーは1つのみ維持する運用のため、既存プロセスがある場合は再起動せずそのまま利用する。環境変数を変更した場合のみ再起動が必要。
A. 想定通りの挙動。フロントエンドはCloudflare Pagesとのgit連携を行っていないため、./deploy-frontend.sh を実行しない限り反映されない。
gcloud run deploy でデプロイしてよいかA. 不可。必ず ./deploy-backend.sh を使用する。生のgcloudコマンドは致命バグ検査(flake8/compileall)を経由しないため、過去のNameError本番流出事故の再発リスクがある。
A. 行えない。/admin/deposits画面は廃止済みで、デポジット催促はChatwork上の週次運用スキームで実施する(2.4節参照)。
A. 押さない。ボタンの実装はローカルリポジトリの存在を前提としており、Cloud Run上では公開URLが生成されずドラフトのみ消失する事故につながる。承認・公開作業は必ずローカル環境で行う(2.3節参照)。
A. 不要。平部の承認のみで公開できる運用(平部が別途松田に確認するため、二重承認は行わない)。
| ルーム | 用途 |
|---|---|
| SEL運営本部Chatworkグループ | 承認・アラートの集約先。申込フォーム受信通知、決済スクリーンショットアップロード失敗アラート等を集約 |
| 平部個人Chatworkルーム | デポジット週次催促の承認URL送信、システム開発関連のアラート通知先 |