コンテンツへスキップ
supastack
ドキュメントを閲覧

For AI agents: fetch the complete documentation index at /llms.txt, the full documentation corpus at /llms-full.txt, the agent skill at /skill.md, or this page as Markdown at /ja/docs/web/deploy-google-cloud.md (or send Accept: text/markdown).

Google Cloud にデプロイ

キットの Docker イメージを Cloud Build でビルドし、マネージドシークレットを使って Cloud Run で実行し、独自ドメインに載せます。

このガイドについて質問
開くアプリ

初心者向けのウォークスルー

前提条件:ローカルで動作するアプリ、インターネットから到達できる実際のデータベース(データベースのセットアップ)、そしてリリースする機能のプロバイダーアカウント。Google アカウントが必要です。軽い利用は無料枠内に収まりますが、請求設定ではカードの登録を求められます。

用語メモ:コンテナイメージは、どのホストでも実行できるアプリのパッケージ済みコピーです。Artifact Registry は Google のイメージ保管庫です。Cloud Build は Google のマシン上でイメージをビルドします——ローカルの Docker は不要です。Cloud Run はイメージを HTTPS サービスとして実行し、スケールします。Secret Manager はパスワードとキーを保持します。リビジョンはサービスのデプロイ済みバージョン 1 つを指します。

構築するもの:Google Cloud プロジェクト、イメージを保持する Artifact Registry リポジトリ、HTTPS でアプリを配信する Cloud Run サービス、Secret Manager のシークレット、そしてマネージド Postgres。キットのルート Dockerfile はすでにポート 8080 でリッスンするスタンドアロン Next.js サーバーを生成します——まさに Cloud Run が期待するものです。

正直なコスト注記:Cloud Run の無料枠は軽いトラフィックをカバーしますが、Google のマネージド Postgres である Cloud SQL には無料枠がありません。Supabase または Neon の無料枠データベースが最も安い始め方です。このガイドはその経路を使います。試す前に Billing → Budgets & alerts(請求 → 予算とアラート)で予算アラートの追加を検討してください。

アカウントを作成して CLI をインストールする

1. console.cloud.google.com を開き、Google アカウントでサインインして利用規約に同意します。

2. 求められたら請求を関連付けます:Billing → Link a billing account → Create billing account(請求 → 請求アカウントをリンク → 請求アカウントを作成)。アカウントの有効化にはカードが必要です。試用クレジットが初期の実験をカバーします。

3. プロジェクトドロップダウン → New Project(新しいプロジェクト)をクリックし、名前を付けて Create(作成)——または Google サインイン用に作成したプロジェクトを再利用します。プロジェクトは 1 つで構いません。

4. cloud.google.com/sdk から Google Cloud CLI をインストールします。OS 用のインストーラーをダウンロードして完了したら、新しいターミナルを開いて gcloud コマンドが使えるようにします。

5. 以下の 2 つのコマンドを実行します。最初のコマンドはブラウザを開いて CLI を認証し、2 つ目はプロジェクトを選択します——コンソールダッシュボードに表示されるプロジェクト ID を使ってください。名前と常に一致するとは限りません。

期待される結果:gcloud config list にアカウントとプロジェクトが表示されます。gcloud が認識されない場合は、ターミナルを開き直すか、先にインストーラーを完了させてください。

gcloud auth login
gcloud config set project YOUR_PROJECT_ID

本番データベースを作成する

初心者向け経路——Google 外のマネージド Postgres。supabase.com で:New project(新しいプロジェクト)→ 名前、データベースパスワード、リージョンを選択 → プロビジョニングを待つ → Project Settings → Database(プロジェクト設定 → データベース)。Supabase は 2 種類の接続文字列を提供します:ポート 5432 のセッションプーラー / ダイレクト接続と、ポート 6543 のトランザクションプーラーです——5432 の文字列はマイグレーションと長寿命クライアント用、6543 の文字列はサーバーレスアプリ用です。neon.tech では:New project → 表示される接続文字列をコピー。どちらでも構いません。パスワード部分はそのまま保持してください。

ダイレクト/セッション文字列を、ルート .env の DATABASE_URL に入れます——マイグレーションツールはルートファイルを読み、セッション接続が必要です——またローカル開発サーバー用に apps/web/.env.local にも入れます。その後、リポジトリルートからマイグレートコマンドを一度実行し、新しいデータベースにキットのテーブルを作成します。デプロイされたアプリが使う DATABASE_URL シークレットは、代わりにプールされた 6543 の文字列でも構いません。

Google ネイティブな代替案は、同じプロジェクト内のマネージド Postgres である Cloud SQL です。無料枠がなく、プライベート IP 接続には VPC コネクタが必要です——出発点ではなく後のアップグレードとして扱ってください。

# DATABASE_URL=<the direct/session Postgres string, port 5432> in .env + apps/web/.env.local, then:
corepack pnpm --filter @supastack/db db:migrate

サービスを有効化してイメージをプッシュする

以下のコマンドをリポジトリルートから実行します。このデプロイが使う 4 つの Google サービスを有効化し、Artifact Registry に Docker リポジトリを作成し、リポジトリを Cloud Build に送信します——ルートの Dockerfile をリモートでビルドするため、Docker Desktop は不要です。

YOUR_PROJECT_ID を置き換え、リージョンを 1 つ選び——以下では us-central1——リポジトリとサービスの両方でそれを使い回します。期待される結果:ビルドログが数分流れ、DONE / STATUS: SUCCESS で終わります。その後、コンソールの Artifact Registry → supastack → web にイメージが表示されます。

gcloud services enable run.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com secretmanager.googleapis.com

gcloud artifacts repositories create supastack --repository-format=docker --location=us-central1

gcloud builds submit --tag us-central1-docker.pkg.dev/YOUR_PROJECT_ID/supastack/web:latest

Secret Manager にシークレットを保存する

シークレットを --set-env-vars やイメージに入れてはいけません——どちらも平文で保存され、サービス設定を読める人なら誰にでも見えます。Secret Manager は暗号化して保管し、実行時に注入します。

1. コンソールで Security → Secret Manager → Create Secret(セキュリティ → Secret Manager → シークレットを作成)を開きます。

2. 完全な Postgres 接続文字列で DATABASE_URL を作成します——アプリにはプールされたサーバーレス文字列で構いません——AUTH_SECRET には少なくとも 32 文字のランダム文字列(openssl rand -hex 32 で生成できます)、CREDENTIAL_ENCRYPTION_KEY には Base64 エンコードされた 32 バイトキー(openssl rand -base64 32)を設定します。これはワークスペースがアプリに保存するプロバイダーキーを暗号化します。

3. 有効にしたプロバイダーごとに 1 つのシークレットを作成します——例えば STRIPE_SECRET_KEY と STRIPE_WEBHOOK_SECRET、RESEND_API_KEY、GOOGLE_CLIENT_SECRET、GITHUB_CLIENT_SECRET。EMAIL_PROVIDER=resend のようなシークレットでない設定は、シークレットではなく通常の環境変数のままにします。

サービスが初めてシークレットを参照するとき、そのランタイムサービスアカウントに読み取り権限が必要です——コンソールのサービスエディターでシークレットをアタッチすると、Google がその許可を自動で提案します。CLI では、デプロイエラーが付与すべき不足している Secret Manager ロールを示します。

# Secrets to create in Secret Manager:
DATABASE_URL     # Postgres connection string — the pooled serverless string is fine
AUTH_SECRET      # openssl rand -hex 32
CREDENTIAL_ENCRYPTION_KEY   # openssl rand -base64 32

# plus one per enabled provider, e.g.:
STRIPE_SECRET_KEY
STRIPE_WEBHOOK_SECRET
RESEND_API_KEY
GOOGLE_CLIENT_SECRET
GITHUB_CLIENT_SECRET

Cloud Run サービスをデプロイする

コンソール経路:Cloud Run → Create service(サービスを作成)→ Deploy one revision from an existing container image(既存のコンテナイメージから 1 リビジョンをデプロイ)→ プッシュした …/supastack/web:latest イメージを選択 → 同じリージョンを選択 → Authentication(認証)で Allow unauthenticated invocations(未認証の呼び出しを許可)を選択(公開アプリのため)→ Create。

以下の CLI 相当コマンドは、同じステップで環境の配線を追加します。平文の設定は --set-env-vars に入れ、シークレットは --set-secrets で Secret Manager の名前で参照します。プロバイダーフラグ(EMAIL_PROVIDER、BILLING_PROVIDER、AI_PROVIDER、JOB_PROVIDER)は APP_URL と一緒に通常の環境変数として追加します。

APP_ENV=production は必須です——これがないとアプリは local モードで起動します。本番設定の検証がスキップされ、セキュアクッキープレフィックスが無効のまま、開発専用の /mail-preview ページが公開されたままになります(EMAIL_PROVIDER=local の場合、ローカルのメール送信トレイが漏洩します)。本番では起動時にさらに 4 つの値が必要です。EXPO_PUBLIC_API_URL はモバイルアプリが API に到達するための公開 https URL です——サービス URL に設定します(Web のみのデプロイでは APP_URL と同じ)。EXPO_PUBLIC_APP_SCHEME はモバイルのディープリンクスキームです——モバイルアプリを出荷しない場合は supastack などの有効な値で構いません。MOBILE_ALLOWED_ORIGINS はサーバーが信頼する正確な https 生成元のカンマ区切りリストです——アプリ URL が適切な出発点で、ワイルドカードは拒否されます。CREDENTIAL_ENCRYPTION_KEY は保存されたプロバイダー認証情報を暗号化し、Secret Manager に保持します。

Cloud Run は最初のデプロイで https://….run.app の URL を割り当て、認証コールバックとリンクが機能するにはアプリの APP_URL が実際の公開 URL と一致している必要があります。そのため、まずプレースホルダーで一度デプロイし、サービスページから *.run.app URL をコピーして、APP_URL——および対応する EXPO_PUBLIC_API_URL / MOBILE_ALLOWED_ORIGINS の値——をその URL に設定してサービスを更新します(コンソール:Edit & deploy new revision(新しいリビジョンを編集してデプロイ)、またはコマンドを再実行)。コンテナポートは 8080 のままです——Cloud Run のデフォルトはすでに Dockerfile の PORT と一致しています。

gcloud run deploy supastack --image us-central1-docker.pkg.dev/YOUR_PROJECT_ID/supastack/web:latest --region us-central1 --allow-unauthenticated --set-env-vars "APP_ENV=production,APP_URL=https://YOUR_SERVICE_URL,EXPO_PUBLIC_API_URL=https://YOUR_SERVICE_URL,EXPO_PUBLIC_APP_SCHEME=supastack,MOBILE_ALLOWED_ORIGINS=https://YOUR_SERVICE_URL" --set-secrets "DATABASE_URL=DATABASE_URL:latest,AUTH_SECRET=AUTH_SECRET:latest,CREDENTIAL_ENCRYPTION_KEY=CREDENTIAL_ENCRYPTION_KEY:latest"

独自ドメインをマップする(任意)

テスト中はスキップしてください——*.run.app URL はすでに HTTPS を提供しています。準備ができたら:Cloud Run → サービス → Custom Domains / Domain Mappings(カスタムドメイン / ドメインマッピング)→ Add mapping(マッピングを追加)→ サービスを選択してドメインを入力。

求められたらドメインの所有権を確認し(Google が案内します)、レジストラでマッピング画面に表示される DNS レコードを作成します。マネージド HTTPS 証明書はレコードが伝播した後に自動で発行されます——通常数分、最長で 1 日です。

ドメインがトラフィックを配信し始めたら、APP_URL を https://yourdomain.com に更新し、対応する OAuth リダイレクト URI(https://yourdomain.com/api/auth/callback/…)を登録します——サインインガイドが場所を説明しています。

デプロイを確認する

https://YOUR_SERVICE_URL/api/health を開きます——ok が期待値です。次にアプリを端から端まで試します。URL を開き、サインアップし、メールコードをリクエストし、受信トレイに届くことを確認します(これには EMAIL_PROVIDER=resend、RESEND_API_KEY、検証済み送信者が必要です——ローカルアダプターは実際の受信トレイには届きません)。サインインして、有効にした機能を 1 つ使います。

Cloud Run → サービス → Logs(ログ)にリクエストとエラーの出力が表示されます。Revisions(リビジョン)タブでは、デプロイが失敗した場合に前のリビジョンへワンクリックでロールバックできます。

モバイルとデスクトップのクライアントはこの HTTPS バックエンドを指す必要があります。Expo では apps/mobile/.env.local の EXPO_PUBLIC_API_URL、デスクトップシェルでは SUPASTACK_APP_URL です。

よくある質問

14 件の質問

supastack とは何ですか?

supastack は AI SaaS 製品を構築するためのモジュラー基盤です。共通インフラをまとめて提供するので、製品固有の機能に集中できます。

Web とモバイルに対応していますか?

はい。supastack には Web とモバイル体験の出発点として Next.js アプリと Expo アプリが含まれています。

どの認証が含まれていますか?

Better Auth がメール/パスワード、OTP、ソーシャルログインをカバーします。個人ワークスペースはアカウントと一緒にプロビジョニングされ、初日からレコードが境界内に収まります。

AI はどうサポートされていますか?

supastack には設定可能なマルチプロバイダー AI、使用量追跡、予算、暗号化された自前キー(BYOK)サポートが含まれています。

サブスクリプションはどう管理されますか?

このキット上に構築された製品では、Stripe 課金・サブスクリプション・権限が有料アクセスの基盤になります。プロバイダーの秘密はサーバー側に留まります。

製品固有のコードはどこに置きますか?

製品固有の機能は別のコードベースに置き、製品側が supastack の基本モジュールを設定・統合します。

supastack の価格は?

キットは生涯アップデート付きの一回払いです:単一フレームワーク 249 ドル(期間限定のローンチ価格 — 通常価格 349 ドルから 100 ドル割引)、または全フレームワーク(Next.js・iOS・Android)499 ドル(期間限定のローンチ価格 — 通常価格 599 ドルから 100 ドル割引)、追加開発者シート 1 席 75 ドル。キットのサブスクリプションはありません。このサイトのチェックアウトはライセンスキーをメールで配信し、GitHub 招待でリポジトリアクセスを提供します。

ワークスペースはどうデータを囲いますか?

ユーザーレコードは workspaceId でスコープされます。認証、権限、AI 使用量、課金イベント、監査エントリは個人ワークスペースの境界内に留まります。

バックグラウンドジョブはどう機能しますか?

Trigger.dev が明示的なジョブランタイムです。JobRunner コントラクトは enqueue・status・cancel のみを約束し、ワークフロー意味論は Trigger.dev 固有で明示的です。

メールとアウトリーチの違いは?

トランザクションメールはタスク完了通知などの製品ワークフローをカバーします。コールドアウトリーチやキャンペーンは製品自身に属し、このキットのメールモジュールの外です。

モバイルの購入はどのように機能しますか?

モバイルでは RevenueCat によるネイティブ購入と復元に対応し、アクセス権をサーバーで検証します。公開前にストアアカウントを設定し、実機テストを完了してください。Web 課金は別に管理します。

AI プロバイダーのキーはどこにありますか?

BYOK 認証情報は暗号化され、サーバー側に留まります。キーはログでサニタイズされ、使用量と予算はワークスペースレベルで可視です。

チェックアウトで使える支払い方法は?

Stripe ホストのチェックアウトはカードを受け付け、Stripe アカウントでウォレットを有効にすれば Alipay と WeChat Pay も提供できます——中国の購入者に便利です。ウォレット認可は非同期で確定するため、決済完了と同時にライセンスページが更新されます。

返金を受けることはできますか?

リポジトリへのアクセス権を取得した後は、supastack は永久にあなたのものとなるため、返金はできません。ですがご安心ください。生涯アップデートを含む完全なソースコードを入手し、ご自身やクライアントのために無制限にプロダクトを構築・公開できます。コードの転売や、リポジトリをスターターキットやテンプレートとして再配布することのみ禁止されています。

JA
テーマ