この記事では THINK YOU LAB(https://think-you-lab.vercel.app)の実際のデプロイ設定を公開します。GitHub 連携からデプロイまでの手順、サブディレクトリ構成での Root Directory 設定、Supabase + Stripe の環境変数5つの意味と取得場所まで、一通りカバーします。
Vercel デプロイの全体フロー
GitHub リポジトリを用意する
↓
Vercel にプロジェクトをインポートする
↓
Root Directory を設定する(サブディレクトリ構成の場合)
↓
環境変数を設定する
↓
デプロイ実行 → 本番 URL が発行される
↓
Supabase の Site URL を Vercel URL に更新する
↓
デプロイ後チェック
GitHub と Vercel の連携
Vercel にプロジェクトをインポートする手順
- vercel.com にアクセスしてサインアップ・ログイン(GitHub アカウントで可)
- ダッシュボードの「Add New → Project」をクリック
- 「Import Git Repository」から対象のリポジトリを選択
- 権限を求められたら許可する
Vercel は GitHub のデフォルトブランチ(通常 main)への push を検知して自動でデプロイします。Pull Request を作ると Preview URL も自動で発行されます。
Root Directory の設定(サブディレクトリ構成の場合)
THINK YOU LAB のリポジトリ構成
think-you-lab/ ← リポジトリルート
├── lms/ ← Next.js アプリ(ここをデプロイする)
│ ├── app/
│ ├── lib/
│ ├── package.json
│ ├── next.config.ts
│ └── vercel.json
├── docs/
└── scripts/
リポジトリのルートに package.json がないため、Vercel はそのままではどのディレクトリをビルドすればいいか分かりません。Root Directory の設定が必要です。
Vercel の「Root Directory」設定で lms を指定する
プロジェクト設定(Import 画面または Settings → General)で「Root Directory」に lms を入力します。
Root Directory: lms
これを設定すると、Vercel は lms/ ディレクトリをプロジェクトルートとして扱い、lms/package.json を参照してビルドします。
vercel.json の配置場所
{
"framework": "nextjs",
"buildCommand": "npm run build",
"devCommand": "npm run dev",
"installCommand": "npm install",
"outputDirectory": ".next"
}
vercel.json は Root Directory 直下(= lms/vercel.json)に置きます。リポジトリルートに置いても Root Directory が lms に設定されている場合は参照されません。
環境変数の設定
Vercel の「Settings → Environment Variables」から環境変数を設定します。
設定が必要な環境変数5つ(THINK YOU LAB の例)
1. NEXT_PUBLIC_SUPABASE_URL
- 取得場所: Supabase ダッシュボード → Project Settings → API → Project URL
- 例:
https://xxxxxxxxxx.supabase.co
NEXT_PUBLIC_ がついているため、クライアントサイドのコードからも参照されます
2. NEXT_PUBLIC_SUPABASE_ANON_KEY
- 取得場所: Supabase ダッシュボード → Project Settings → API →
anon public
- RLS(Row Level Security)が有効な状態での読み書きに使用します
- クライアントサイドに露出しても問題ないキーですが、RLS が正しく設定されていることが前提です
3. SUPABASE_SERVICE_ROLE_KEY(絶対に NEXT_PUBLIC_ を付けない)
- 取得場所: Supabase ダッシュボード → Project Settings → API →
service_role secret
警告: このキーには NEXT_PUBLIC_ プレフィックスを絶対につけないでください。NEXT_PUBLIC_ をつけると Next.js がビルド時にクライアントサイドのコードにこのキーを埋め込みます。ブラウザの開発者ツールから誰でも確認できる状態になり、全ユーザーのデータが読み書き可能になります。
Webhook エンドポイント(サーバーサイドのみ)で使用するため、NEXT_PUBLIC_ なしにします。
RLS とサービスロールキーの詳細 → Supabase RLS の書き方入門
4. STRIPE_SECRET_KEY
- 取得場所: Stripe ダッシュボード → 開発者 → API キー → 「シークレットキー」
- 本番環境では
sk_live_ で始まるキーを使います(テスト環境では sk_test_ のまま)
- サーバーサイドのみで使用するため
NEXT_PUBLIC_ なしで設定します
5. STRIPE_WEBHOOK_SECRET(Stripe 審査後に追加)
- 取得場所: Stripe ダッシュボード → 開発者 → Webhook → 該当エンドポイント → 「署名シークレット」
- Vercel にデプロイ → Stripe に本番 URL を登録 → シークレットを取得 → ここに追加 → Redeploy の順番で設定します
- デプロイ直後には設定できないため、最初のデプロイ時は空欄でも構いません
NEXT_PUBLIC_ プレフィックスの意味
NEXT_PUBLIC_ がついた変数は、next build 時にクライアントサイドの JavaScript バンドルに静的に埋め込まれます。ブラウザで動くコードから参照できる代わりに、ビルド後に変更するには Redeploy が必要です。
NEXT_PUBLIC_ がない変数はサーバーサイド(API Route / Server Component / Server Action)でのみ参照できます。
Production / Preview / Development の環境別設定
| 環境 | 用途 |
|------|------|
| Production | main ブランチへの push でデプロイされる本番環境 |
| Preview | Pull Request ごとに発行される Preview URL |
| Development | vercel dev コマンドでのローカル開発 |
STRIPE_SECRET_KEY は Production には sk_live_ キー、Preview には sk_test_ キーを設定するといった使い分けができます。
Supabase の Site URL を更新する(デプロイ後に必須)
Site URL が localhost のままだとログインが壊れる
Supabase Auth の「Site URL」は、メール認証(magic link)のリダイレクト先 URL として使われます。初期設定では http://localhost:3000 になっているため、本番 URL にデプロイしてもログイン後に localhost にリダイレクトされてしまいます。
Supabase ダッシュボードで更新する手順
- Supabase ダッシュボードにログイン → 対象プロジェクトを選択
- 左メニューの「Authentication」→「URL Configuration」を開く
- Site URL を Vercel の本番 URL に変更する
https://think-you-lab.vercel.app
- Redirect URLs に以下を追加する
https://think-you-lab.vercel.app/**
https://*.vercel.app/**
https://*.vercel.app/** を追加することで Vercel の Preview URL でもログインが動作します。
デプロイ後チェックリスト
ビルドログを確認する
Vercel ダッシュボードの「Deployments」から最新のデプロイを開き、ビルドログを確認します。Error が含まれている行を探し、TypeScript の型エラーや import パスの問題がないか確認します。
ローカルで先に確認する: npm run build をローカルで実行してビルドエラーを事前に潰しておくと Vercel 上でのデバッグが楽になります。
本番 URL でログインが通るか確認する
https://think-you-lab.vercel.app/login にアクセス
- メールアドレスを入力してログインを試みる
- メールが届いてリンクをクリック → 正しくリダイレクトされるか確認
Stripe Webhook エンドポイントを本番 URL で登録する
Stripe ダッシュボード → 「開発者」→「Webhook」→「エンドポイントを追加」
URL: https://think-you-lab.vercel.app/api/webhooks/stripe
受信イベント:
- checkout.session.completed
- invoice.payment_failed
- customer.subscription.deleted
登録後に発行される「署名シークレット」を Vercel の環境変数 STRIPE_WEBHOOK_SECRET に追加し、Redeploy します。
Stripe Webhook の本番登録手順はこちら → Supabase + Stripe Webhook で会員ステータスを自動更新する
よくある詰まりポイント
ビルドエラー(型エラー・import パスの問題)
Vercel はデフォルトで TypeScript の型エラーをビルドエラーとして扱います。ローカルで npm run build が通ることを確認してから push してください。
@/ のパスエイリアスが解決されない場合は tsconfig.json の paths 設定を確認します。
環境変数が反映されない
NEXT_PUBLIC_ の変数はビルド時に埋め込まれます。Vercel の環境変数を変更した後は必ず Redeploy してください。変数を追加しただけでは既存のデプロイには反映されません。
ログイン後に 404 になる
Supabase の Site URL または Redirect URLs が未更新の可能性が高いです。上記の設定手順を確認してください。
まとめ
-
GitHub 連携からデプロイまでのステップバイステップ手順
-
Root Directory を lms に設定する方法(サブディレクトリ構成)
-
環境変数5つの意味・取得場所・NEXT_PUBLIC_ の使い分け
-
SUPABASE_SERVICE_ROLE_KEY に NEXT_PUBLIC_ を付けてはいけない理由
-
Supabase の Site URL / Redirect URL を更新しないとログインが壊れる理由
-
Stripe Webhook の本番登録手順はこちら → Supabase + Stripe Webhook で会員ステータスを自動更新する
-
Supabase Auth の magic link 実装はこちら → Supabase magic link でログイン機能を実装する
Vercel へのデプロイは「環境変数の設定ミス」でほぼ全員が詰まります。Next.js + Supabase Vercel デプロイチェックリスト(環境変数設定確認込み)を LINE で無料配布中です。
→ Vercel デプロイチェックリストを受け取る(LINE登録・無料)
LINE 公式アカウント
Vercel × Supabase 本番設定チェックリストをLINEで無料配布中