0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【開発記②後編】Next.js × Supabaseアプリを実際にVercelへデプロイしてみる

0
Posted at

はじめに

こんにちは。前編に引き続き、動物病院向けWebアプリ Vet Clinic Assistant を
開発しているsirocodevです。

前編ではカラーパレット・Supabase連携・Googleログイン・カレンダー機能を
実装しました。今回はいよいよ、このアプリを実際にVercelへデプロイして、
誰でもアクセスできる状態にするところまでを書いていきます。

完成イメージ

実際に公開したURLはこちらです。

👉 https://vet-clinic-ai-9gzz.vercel.app

image.png

今回やったこと

  • GitHubリポジトリの作成とpush
  • Vercelへのデプロイ
  • 本番用の環境変数設定
  • Google OAuthのリダイレクトURL設定(Google Cloud Console / Supabase 両方)

対象読者

  • Next.jsアプリを初めてVercelにデプロイする方
  • next/font/googleがビルド時にエラーになって困っている方
  • OAuthの redirect_uri_mismatch に遭遇している方

開発環境

  • Next.js 15
  • React
  • TypeScript
  • Supabase (Database / Storage / Auth)
  • Vercel

1. GitHubにリポジトリを作ってpushする

GitHub上で新規リポジトリを作成し、ローカルのプロジェクトをpushしました。

ここで一つ注意点があります。GitHubでリポジトリを作る際、
「Add a README file」にチェックを入れると、リモート側に最初から
コミットが1つ存在する状態になります。ローカルにも別のREADMEがある場合、
最初のpushが rejected になることがあります。

! [rejected] main -> main (fetch first)
error: failed to push some refs

このケースでは、ローカルの内容を正にしたいので、force pushで解決しました。

git push -u origin main --force

2. Vercelにデプロイする

  1. Vercelにログイン(GitHubアカウントで連携すると楽です)
  2. 「Add New Project」からリポジトリをインポート
  3. Framework Presetは自動的に「Next.js」が検出される
  4. 環境変数を設定(.env.local の内容をそのまま貼り付け可能)
  5. Deployをクリック

環境変数のうち、NEXT_PUBLIC_ から始まるものはブラウザに露出しても
問題ない値、SUPABASE_SECRET_KEY だけは本当に秘密にすべき値です。
Vercelの「Sensitive」オプションは、この後者にだけチェックを入れれば
十分でした。

3. 本番URLをSupabase / Google Cloud側に登録する

デプロイが終わったら、本番URLを認証まわりの2箇所に反映する必要が
ありました。

Supabase側(Authentication > URL Configuration)

  • Site URL: 本番URL (https://vet-clinic-ai-9gzz.vercel.app)
  • Redirect URLs: ローカル用と本番用、両方を登録

http://localhost:3000/auth/callback
https://vet-clinic-ai-9gzz.vercel.app/auth/callback

Google Cloud Console側(意外な落とし穴)

最初、てっきり自分のアプリのURLをGoogle側に登録すればいいと
思っていたのですが、実際に登録すべきなのは Supabaseのコールバック
URL
でした。

https://<プロジェクトref>.supabase.co/auth/v1/callback

OAuthのフローは「アプリ → Google → Supabase → アプリ」という順で
リダイレクトが挟まっているため、Googleが検証するのはSupabase側の
URLだという点を理解していませんでした。

実際にハマったこと

今回は4つ、それぞれ性質の違うエラーに遭遇しました。

① クリティカルなセキュリティ脆弱性(CVSS 10.0)

デプロイ時、依存関係インストールのログにこんな警告が出ていました。

npm warn deprecated next@15.1.6: This version has a security vulnerability.

調べてみると、CVE-2025-66478という、App RouterのReact Server Components
プロトコルに起因する未認証RCE(リモートコード実行)の脆弱性でした。
next15.1.9 以上に上げることで解決しました。ローカルで
npm run dev しているだけでは気づけなかったので、実際にデプロイ
してみて初めて発見できたという点で印象的でした。

② Googleフォントのビルド時フェッチ失敗

Vercel上でのビルドが以下のエラーで失敗しました。

request to https://fonts.gstatic.com/s/manrope/v20/....woff2 failed, reason:
Retrying 1/3...

next/font/google はビルド時にフォントファイルをダウンロードして
自前でホストする仕組みなのですが、このリクエストがビルドマシンから
失敗すると、ビルドごと止まってしまいます。調べたところ既知の問題
だったため、next/font/google をやめて、従来通り <link> タグで
Google Fontsを読み込む方式に変更しました。これでビルドが外部
ネットワークに依存しなくなり、解決しました。

redirect_uri_mismatch

Googleログインを試したところ、次のエラーが出ました。

400 エラー: redirect_uri_mismatch

原因は上述の通り、Google Cloud Console側に自分のアプリのURLを
登録してしまっていたことでした。Supabaseのコールバック URL
https://<ref>.supabase.co/auth/v1/callback)に登録し直すことで
解決しました。

次にやりたいこと(今回の宿題)

デプロイ作業と並行して、右上のログインユーザー表示のリアルタイム化、
Attending Vetとログインアカウントの連携、アプリ内通知(ベルアイコン)も
実装できました。残っている宿題は以下の1点です。

  • Consultationの編集・キャンセル機能の実装

そして次のステップとして、Whisperによる音声文字起こしと、AIによる
診療内容の自動要約に着手していきたいと思っています。

おわりに

今回は「動くところまで作る」のと「実際に公開して誰かに使ってもらえる
状態にする」のとの間に、これだけの距離があるのだと実感した回でした。
特に ②〜③ は、ローカル環境では絶対に気づけなかった問題ばかりで、
デプロイして初めて見える世界があるのだと学びました。

最後まで読んでいただき、ありがとうございました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?