バイブコーディングで最初の壁になりやすいのが「デプロイ」です。

CursorやClaude Codeでコードを生成して、ローカル(自分のパソコン)では問題なく動いているのに、Vercelに公開したとたんに真っ白な画面や500エラーが出てしまう。

その原因の8割は、環境変数の設定漏れです。

今回はこの「環境変数」という概念を、非エンジニアの方にもわかるように丁寧に解説します。デプロイの仕組み、ドメイン設定まで一気に押さえましょう。

環境変数とは「パスワードを安全に管理する仕組み」

アプリを作ると、必ずAPIキーやデータベースのパスワードが必要になります。

たとえばSupabaseに接続するためのURL、Stripeで決済するための秘密鍵、SendGridでメールを送るためのAPIキー。これらは「知っている人だけが使える合言葉」です。

ここで絶対にやってはいけないのが、これらをコードの中に直接書くことです。

// 絶対ダメな例
const apiKey = "sk-1234567890abcdef";

コードはGitHubに上げることが多いですが、GitHubのリポジトリが公開設定になっていたら、APIキーが世界中に丸見えになります。実際にこれで課金被害に遭う事故は毎日どこかで起きています。

環境変数とは、こうした秘密情報をコードの外に切り出して管理する仕組みのことです。コードには「環境変数のここを見てね」という印だけ書いておき、実際の値は別のファイルや設定画面で管理します。

.envファイルの書き方

Next.jsプロジェクトのルートフォルダ(一番上の階層)に、.env.localというファイルを作ります。

SUPABASE_URL=https://xxxx.supabase.co
SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
STRIPE_SECRET_KEY=sk_test_51...

ルールはシンプルです。キー名=値 という形式で1行に1つ書くだけです。

ファイル名の末尾に .local がついているのは「このファイルはローカル専用で、GitHubには絶対にアップしない」という意味です。Next.jsは .env.local を自動的にGitの管理対象から外してくれます。

.gitignore(Gitの管理対象外ファイルのリスト)を確認すると、.env*.local が含まれているはずです。もし含まれていなければ、すぐに追加してください。

コードの中では次のように呼び出します。

const supabaseUrl = process.env.SUPABASE_URL;

process.env.キー名 と書くと、そのキーに設定した値が取り出せます。

NEXT_PUBLIC_プレフィックスの意味

Next.jsには特殊なルールがあります。環境変数の名前が NEXT_PUBLIC_ で始まるものだけが、ブラウザ側のコードで使えます。

Webアプリには「サーバーで動くコード」と「ブラウザで動くコード」の2種類があります。

サーバーで動くコードは、ユーザーのブラウザには見えません。だから秘密のAPIキーを置いても安全です。

ブラウザで動くコードは、ユーザーが「ページのソースを見る」をすれば中身が見えてしまいます。だから本当に秘密にしたい情報(決済の秘密鍵など)は絶対に置いてはいけません。

NEXT_PUBLIC_ をつけると「これはブラウザに渡してもいい情報です」という宣言になります。

# ブラウザに渡してもいい情報(公開前提)
NEXT_PUBLIC_SUPABASE_URL=https://xxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...

# サーバーだけで使う秘密情報(ブラウザに渡さない)
SUPABASE_SERVICE_ROLE_KEY=eyJ...
STRIPE_SECRET_KEY=sk_live_...

SupabaseのURLと公開用キー(anon key)はブラウザから直接アクセスするために必要なので NEXT_PUBLIC_ をつけます。一方、管理者権限のキー(service role key)や決済の秘密鍵はサーバー専用なので NEXT_PUBLIC_ をつけません。

ローカル・ステージング・本番の3環境

プロが使うアプリには通常、3つの環境があります。

ローカル環境とは、自分のパソコン上で動かす開発用の環境です。データが壊れても自分だけが困るので、気軽に実験できます。.env.local ファイルが使われます。

ステージング環境とは、本番と同じ構成で作られたテスト用の環境です。「本番に上げる前に最終確認する場所」です。実際のユーザーはここにはアクセスしません。.env.staging や Vercel の Preview 環境が使われます。

本番環境とは、実際のユーザーが使う環境です。ここでミスをすると本物の被害が出ます。.env.production や Vercel の Production 環境が使われます。

バイブコーディングの初期フェーズでは、ローカルと本番の2環境で始めることが多いです。ユーザーが増えてきたらステージングを追加するという順番で問題ありません。

重要なのは「それぞれの環境で別々の環境変数を使う」という点です。ローカルではSupabaseのテスト用データベースを使い、本番では本番用データベースを使う、という分け方をします。

Vercelデプロイの仕組み

Vercelは、Next.jsを作った会社が提供するホスティングサービスです。GitHubと連携させると、コードを push するだけで自動的にビルドしてWebサイトを公開してくれます。

流れを整理すると次のようになります。

  1. ローカルでコードを書く
  2. git push でGitHubにコードを送る
  3. Vercelがそれを検知して自動でビルドを開始する
  4. ビルドが成功したらURLが発行される
  5. 世界中からアクセスできる状態になる

ここで多くの人がはまるのが、ステップ3のビルドです。

ローカルでは .env.local に書いた環境変数が使えます。しかしVercelのサーバーにはそのファイルがありません。あなたのパソコンにしか存在しないからです。

Vercelに環境変数を設定するには、Vercelの管理画面から手動で入力する必要があります。

手順はシンプルです。Vercelのプロジェクトページを開き、「Settings」から「Environment Variables」を選びます。ここに .env.local に書いたキーと値を一つずつ入力します。

設定できたら、次のデプロイから反映されます。すでにデプロイされているものに反映させるには「Redeploy」ボタンを押します。

よくある失敗パターンを挙げます。

パターン1: そもそも設定していない。ローカルでは動くのに本番で動かないときの原因の大半がこれです。

パターン2: 本番用のキーを使い忘れている。Supabaseには開発用プロジェクトと本番プロジェクトがあるのに、Vercelに開発用のURLを設定してしまうケースです。

パターン3: NEXT_PUBLIC_ の付け忘れ。ブラウザから呼び出す必要がある変数に NEXT_PUBLIC_ がついていないと、undefined(値なし)になってしまいます。

デバッグの基本は、Vercelのデプロイログを確認することです。「Functions」タブや「Deployments」からログを見ると、どの変数が undefined になっているかが確認できます。

カスタムドメインとDNS設定

Vercelでデプロイすると、最初は yourapp.vercel.app というURLが発行されます。これでも公開はできますが、ビジネス用途なら独自ドメインを使いたいはずです。

独自ドメインを使うには、次の2ステップが必要です。

ステップ1はドメインを取得することです。お名前.comやムームードメイン、Cloudflareなどで年間1,000〜2,000円程度で購入できます。

ステップ2はDNS設定です。DNSとは「このドメイン名はこのIPアドレス(サーバー)に繋いでください」という対応表のことです。電話帳のようなものです。

Vercelの「Settings」から「Domains」を開き、取得したドメイン名を追加すると、設定すべきDNSレコードが表示されます。表示された値をドメイン管理会社の設定画面に入力するだけです。

具体的には次のようなレコードを設定します。

Aレコードとは、ドメイン名とIPアドレスを紐づける設定です。76.76.21.21(VercelのIPアドレス)を設定します。

CNAMEレコードとは、www サブドメインを cname.vercel-dns.com に向ける設定です。

設定後、DNSが世界中に伝播するまで数分から最大48時間かかります。ほとんどの場合は数分で完了します。

HTTPS(通信の暗号化)はVercelが自動で設定してくれます。昔は証明書の取得と更新が手間でしたが、今はVercelが全部やってくれます。

ローカルでは動くのにVercelで500エラーになるときのチェックリスト

「ローカルでは動いていたのに本番で壊れた」というのはバイブコーダーあるあるです。遭遇したときのチェックリストを整理しておきます。

まず確認するのは、Vercelに環境変数が設定されているかどうかです。Vercel管理画面の「Settings → Environment Variables」を開き、.env.local の内容がすべて入力されているか確認してください。

次に確認するのは、NEXT_PUBLIC_ プレフィックスの付け忘れです。ブラウザ側で使っている変数に NEXT_PUBLIC_ がついているか確認してください。

それでも解決しない場合は、Vercelのデプロイログを確認します。「Deployments」から最新のデプロイを開き、「Functions」タブでエラーの内容を確認します。undefinedECONNREFUSED といったキーワードが手がかりになります。

APIルートでエラーが起きているなら、Vercelの「Logs」タブからリアルタイムのログを確認できます。実際に問題のURLにアクセスしながらログを見ると、原因を特定しやすくなります。

よくあるエラーとその原因をまとめると次のとおりです。

500 Internal Server Error は、サーバー側のコードでエラーが発生しています。ほとんどの場合は環境変数が undefined になっています。

TypeError: Cannot read properties of undefined は、環境変数が設定されていないので null になっているオブジェクトのプロパティを読もうとしています。

Connection refusedENOTFOUND は、データベースやAPIのURLが間違っているか設定されていません。

まとめ

今回のポイントを整理します。

環境変数とは、APIキーなどの秘密情報をコードの外で管理する仕組みです。.env.local ファイルに書いて、コードからは process.env.キー名 で呼び出します。

ブラウザ側で使う変数は NEXT_PUBLIC_ プレフィックスをつけます。秘密にしたい情報にはつけません。

Vercelにデプロイするときは、必ず管理画面の「Environment Variables」に同じ内容を設定してください。これを忘れると本番環境でアプリが動きません。

独自ドメインはVercelの「Domains」設定から追加でき、表示されたDNSレコードをドメイン管理会社の画面に入力するだけで設定できます。

「ローカルで動くのに本番で動かない」というトラブルに遭遇したら、まず環境変数の設定漏れを疑ってください。

次回は「データベース設計の基本とSupabaseのテーブル操作」を解説します。


Claude Codeを使った非エンジニア向けのバイブコーディング実践について、無料の個別相談を受け付けています。「自分のプロダクトに応用できるか聞いてみたい」という方はお気軽にどうぞ。