Next.js+Supabase+Vercelのセットアップについて

## はじめに

こんにちは。elephantnodeと申します。

普段は都内で社内情シス+Web系エンジニアとして業務しています。

Next.jsとsupabaseを使ったアプリをVercelでデプロイして開発・公開する方法で、最もスマートな手順は、Vercelを起点にしたやり方で、

```
1. VercelでNext.jsのテンプレートを使ってプロジェクトを作成
2. Vercelと連携したGithubのレポジトリからローカルへNext.jsをClone
3. VercelからSupabaseのインテグレーションを使って、Supabaseプロジェクトを作成
4. ローカルのNext.jsでVercelから環境変数を取得
```

この方法になると思います。

こちらのQiitaの記事で丁寧に解説されていて、今でも度々参考にさせていただいています。本当に感謝。

https://qiita.com/kaho_eng/items/8a7faf77222a599fb31c

ですが、実際にはこんな状況ではないでしょうか。

* すでにNext.jsのアプリがローカルにある
* Supabaseのプロジェクトは作成済み
* VercelとSupabaseの連携が新しくなって操作方法がわからない

Next.jsやSupabaseのドキュメントやサンプルを参考にして作成したプロジェクトを、Vercelへデプロイしたい時に、なかなか手順が見えなかったりします。

そこでローカルで作成したNext.jsアプリをGithub経由でVercelへデプロイして、VercelとSupabaseを連携する際の手順をまとめてみました。

## ここでは

Next.jsやSupabase、Vercel、Githubを知っている方で、各サービスはすでにアカウント作成済みの方を対象としています。またnpmやgitなどのインストールなども割愛しています。

## package.json

作成時のプロジェクトのモジュールです。

```json
{
  "dependencies": {
    "react": "^19.0.0",
    "react-dom": "^19.0.0",
    "next": "15.3.2"
  },
  "devDependencies": {
    "typescript": "^5",
    "@types/node": "^20",
    "@types/react": "^19",
    "@types/react-dom": "^19",
    "@tailwindcss/postcss": "^4",
    "tailwindcss": "^4",
    "eslint": "^9",
    "eslint-config-next": "15.3.2",
    "@eslint/eslintrc": "^3"
  }
}
```



## Supabaseのプロジェクトを作成

https://supabase.com/

![Cursor_と_Supabase_と_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/53d7ffb4-09e5-46d7-96a0-744f8a251f1b.png)


まずはSupabaseのプロジェクトを作成します。すでに作成済みの場合は次の手順へ。

## ローカル環境にNext.jsをセットアップ

https://nextjs.org/docs/app/getting-started/installation

ローカルでターミナルからプロジェクト用のフォルダに移動して、Next.jsをセットアップします。ここも作成済みの方は次の手順へ。

```bash
npx create-next-app@latest nextjs-myapp

✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like your code inside a `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to use Turbopack for `next dev`? … No / Yes
✔ Would you like to customize the import alias (`@/*` by default)? … No / Yes
Creating a new Next.js app in /Users/so/01_project/ens/nextjs-myapp.

Using npm.

Initializing project with template: app-tw


Installing dependencies:
- react
- react-dom
- next

Installing devDependencies:
- typescript
- @types/node
- @types/react
- @types/react-dom
- @tailwindcss/postcss
- tailwindcss
- eslint
- eslint-config-next
- @eslint/eslintrc


added 389 packages, and audited 390 packages in 22s

139 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Initialized a git repository.

Success! Created nextjs-myapp at ***フォルダパス***/nextjs-myapp
```

特に設定はいじらず、Enterで設定しています。今回のアプリ名は`nextjs-myapp`にしておきます。

まずは起動チェックします。

```
cd nextjs-myapp
npm run dev
```

![Create_Next_App.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/1d5fcd36-8a03-46e5-81c3-04cee451e9de.png)

おなじみのスタート画面が表示されました。これをVercelにGithub経由でデプロイしていきます。

# Githubにアプリをpush

Githubにリポジトリを作成します。

![Cursor_と_New_repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/137b71a6-b2fa-4bc4-b6d3-cdde0f627851.png)


Next.jsのアプリはすでに.gitignoreの設定もされているので、ローカルでコミット後に、リモートリポジトリを追加すればすぐにGithubへPushできます。

Githubのガイダンスどおり、ターミナルで先程のNext.jsのmyappにリモートリポジトリを追加します。

```bash
git remote add origin git@github.com:elephantnode/nextjs-myapp.git
git branch -M main
git push -u origin main

Enumerating objects: 22, done.
Counting objects: 100% (22/22), done.
Delta compression using up to 10 threads
Compressing objects: 100% (21/21), done.
Writing objects: 100% (22/22), 65.41 KiB | 7.27 MiB/s, done.
Total 22 (delta 0), reused 0 (delta 0), pack-reused 0
To ensgithub.com:elephantnode/nextjs-myapp.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.
```

Githubにpushできました。

![Cursor_と_elephantnode_nextjs-myapp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/7438633a-3f16-4428-aeee-c890dc0ee90a.png)


# Vercelでプロジェクトを作成

https://vercel.com

Vercelで新規にプロジェクトを作成します。

![Vercel_🔊.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/699acd1f-3bf9-4b66-a911-16fd2144c9a5.png)

Add NewからProjectを選択。

![New_Project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/9d6b5276-d73b-4c96-a186-e3490d172716.png)

GithubとVercelを連携していれば、先程作成したリポジトリが画面に表示されているので、Importに進みます。、まだGithubと連携がなければすぐ上のプルダウンメニューから`Add Github Account`を選んでアカウントを追加してください。

![New_Project_–_Vercel_🔊.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/e03cd117-8a6b-4066-863e-edadd19a1a24.png)

Deployしてしばし待ちます。

![New_Project_–_Vercel_🔊.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/abe165b5-0ebb-45d4-bbb6-813f66933f91.png)

Vercelでプロジェクトが作成され、サイトが公開されました。

プロジェクトのダッシュボードでDomainsのURLをクリックすれば、デプロイされたNext.jsアプリを確認できると思います。

![Create_Next_App.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/57f6cecc-9d11-4fe7-a896-705e7e9d0e8d.png)


## VercelとSupabaseを連携

![nextjs-myapp_-_Overview_–_Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/7462d605-4b4d-4fae-bcbc-4e26bd77aa03.png)


Vercelのプロジェクト画面で、settings>integrationsへ進み、Browse Marketplaceをクリックします。

![Vercel_Marketplace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/fbd3f0b4-449e-43d0-97f2-bfb9b8935a13.png)

supabaseで検索し、Supabaseが表示されたらクリック。

:::note alert
右上の「Install」はSupabaseに新しくプロジェクトを作成しますので、挙動が異なります。Supabaseにプロジェクトを新規に作成したくない場合は、Install部分以外をクリックします。
:::

![Cursor_と_Integrations_–_Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/c04f5c90-132e-46e3-a0b0-e31ceb9d353b.png)


この画面のInstallはSupabaseでアカウントを作成するか、既存のアカウントと接続するかを選択できます。ここで、`Link Existing Supabase Account`を選択します。

![Integrations_–_Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/67a72250-4c05-4ccf-ae10-78b183eaae3d.png)

SupabaseにどのVercelプロジェクトを連携させるか選択できます。先ほど作成したプロジェクトを選択して、Connect Accountをクリックします。

![Supabase_と_Supabase_for_Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/0d4b86d2-1101-4921-9b6a-66134e2f88ee.png)

ブラウザで既にSupabaseにログインしていれば、supabase側の連携画面が開くので、`Organization`を選択して、`Install integration`をクリックします。
*ログインしていなければログインが表示されます。


![Supabase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/ec3b7a7e-24d8-4949-b40f-25ea291ed97f.png)

今度はSupabase側で、どのSupabaseプロジェクトとVercelプロジェクトを紐づけるかの画面が出てくるので、それぞれ作成したプロジェクトを選択し、プロジェクトを連携させます。

![Integrations_–_Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/bd6a54ca-8c8d-4d71-a673-bc508eafc114.png)

連携が完了すると、VercelプロジェクトのIntegrationsにSupabaseが表示されるようになり、以後はConfigureから連携先のSupabaseプロジェクトを開くことができるようになります。

![Integrations_–_Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/fe22d91f-801e-453a-9c16-ada7100b8b55.png)

また`Manage Access`からは`Supabase`と`Vercel`のプロジェクトを、All Projectsと紐づけるか、個別に紐づけるかを再設定できます。

## VercelでSupabaseの環境変数を確認

ここまで進めると、Vercelのプロジェクト画面で`Settings`>`Enviroments`を開くと、`Enviroments Variables`に`supabase`の各種環境変数が設定されているのを確認できます。

![nextjs-myapp_-_Overview_–_Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/87921ef0-a9f1-44d2-99f2-ee150f33ba8e.png)

もし表示されていない場合は、Supabase側の設定を確認してください。

![Supabase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/942eb45a-3c7a-4d78-a0e5-b6d6ff99e56f.png)

先程のVercelのCongigureからSupabase側の設定画面を開いて、プロジェクトが正しく設定されているかを確認してみてください。またSupabaseで環境変数を変更した場合も、ここから再度同期できます。（同期は未確認ですが）

## ローカル環境のNext.jsアプリでVercelとSupabaseの環境変数をダウンロード

最後にVercelから連携しているSupabaseの環境変数をローカルのNext.jsにダウンロードする方法です。

すでにSupabaseのガイドなどで.env.localをNext.jsに設置している方は不要ですが、anonkeyをコピペしないで設置できるので、間違えてアプリと一緒に外部へ公開してしまうリスクを減らせる方法です。

Vercelには便利なCLIが用意されています。

https://vercel.com/docs/cli

Next.jsの開発元はVercelなので、アプリのインストール時にすでにCLIが組み込まれています。そのため、アプリのディレクトリでnpxを使用して、node_modulesにある、Vercel CLIを利用できます。

最初にアプリのディレクトリでターミナルから、下記のコマンドでVercelにログインします。

```
npx vercel login

Ok to proceed? (y) y
Vercel CLI 41.6.2
? Log in to Vercel (Use arrow keys)
❯ Continue with GitHub
  Continue with GitLab
  Continue with Bitbucket
  Continue with Email
  Continue with SAML Single Sign-On
 ─────────────────────────────────
  Cancel

? Log in to Vercel Continue with GitHub
> Success! GitHub authentication complete for so@elephantnode.com
Congratulations! You are now logged in. In order to deploy something, run `vercel`.
💡  Connect your Git Repositories to deploy every branch push automatically (https://vercel.link/git).
```

ここではVercelのログイン方法を選択します。それぞれを選ぶと別窓が開いて、Vercelのログイン画面になります。ログインに成功すると、Vercel Cli Login Successが表示されます。

私の場合Githubだったので、開いたところ、すでにログイン済みでした。

![CLI_Login_Success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/574325a3-8133-4b7f-9fd5-10071b10a6e5.png)

ログインができたので、次にプロジェクトをリンクさせます。

```
npx vercel link

Vercel CLI 41.7.4
? Set up “~/01_project/ens/nextjs-myapp”? yes
? Which scope should contain your project? murodon's projects
? Found project “murodons-projects/nextjs-myapp”. Link to it? yes
✅  Linked to murodons-projects/nextjs-myapp (created .vercel)
```

設定するアプリのディレクトリを確認し、リンク先のプロジェクト名を確認、プロジェクト候補が表示されるので、正しければYes（違っていたら、正しいプロジェクト名を入力）し、リンクさせます。

次に環境変数をVercel CLIで確認します。

```
npx vercel env ls

Vercel CLI 41.7.4
> Environment Variables found for murodons-projects/nextjs-myapp [152ms]

 name                               value               environments        created
 SUPABASE_URL                       Encrypted           Production          10m ago
 SUPABASE_SERVICE_ROLE_KEY          Encrypted           Production          10m ago
 SUPABASE_JWT_SECRET                Encrypted           Production          10m ago
 NEXT_PUBLIC_SUPABASE_ANON_KEY      Encrypted           Production          10m ago
 NEXT_PUBLIC_SUPABASE_URL           Encrypted           Production          10m ago
 POSTGRES_URL                       Encrypted           Production          10m ago
 POSTGRES_PRISMA_URL                Encrypted           Production          10m ago
 POSTGRES_URL_NON_POOLING           Encrypted           Production          10m ago
 POSTGRES_USER                      Encrypted           Production          10m ago
 POSTGRES_HOST                      Encrypted           Production          10m ago
 POSTGRES_PASSWORD                  Encrypted           Production          10m ago
 POSTGRES_DATABASE                  Encrypted           Production          10m ago
 SUPABASE_ANON_KEY                  Encrypted           Production          10m ago
```

Environmentsと設定されている環境変数の情報が表示されます。ここでのenvironmentsは環境変数ではなく、`Preview`、`Development`などのプロジェクトの状態です。

コマンドのオプションで、--environmentsにproductionを指定して、環境変数をPullします。

```
npx vercel env pull --environment=production
```
このコマンドでアプリのトップディレクトリにSupabaseとVercelの各種環境変数を含んだ`.env.local`ファイルが作成されます。

![Cursor_と__env_local_—_myapp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/d6b455ee-9d0b-4510-82fd-619df5dd6fc8.png)

supabaseの環境変数をローカルで取得できました。このURLとANON_KEYでsupabaseを開発していきます。


またこのNext.jsの環境であれば、Vercel側もSupabaseのanonkeyとURLが設定された状態で利用できるので、githubのリポジトリにアップロードすれば、そのままSupabaseと繋ぐことができます。

## 構築環境を消す手順

最後にここまで作成したプロジェクトの削除手順についてご紹介します。

最初にSupabase側の連携から削除します。

SUpabase側のVercel連携設定はプロジェクト単位ではなくて、アカウント単位で管理されています。そのため、Supabaseのプロジェクト内にあるIntegrationsではなくて、プロジェクトやTeamの管理画面のIntegrationsを選択します。

![Supabase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/0002c924-f91c-4b95-af77-82d0d211d129.png)

Manage > Delete connectionから連携を削除していきます。

![Cursor_と_Supabase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/48bec46f-a33d-45ce-9737-962033d4c5d1.png)

![Cursor_と_Supabase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/8a2fb8a7-1c97-464f-bab4-79009cdbdc58.png)

次にVercel側のIntegrationsからSupabaseのIntegrationsのManage > Settingsに進みます。

![Integrations_–_Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/7b215f18-40ae-4253-8cf3-6fc67bf447b0.png)

一番下段のUninstall Integrationを選択。

![Integrations_–_Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/9e0f8b2c-9f7a-45b4-9b9d-cd070307dff2.png)

これで連携は解除できました。

あとは、VercelのプロジェクトのSettingsからDelete ProjectでVercelのプロジェクトを削除。

![Cursor_と_nextjs-myapp_-_Overview_–_Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/f76e12d8-d337-45db-9e13-6e7975f7b146.png)

SupabaseはProject SettingsからDelete Projectで削除しましょう。

![General___Supabase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/ce4dbd15-8f21-444a-9336-ae06680897f4.png)

Githubのリポジトリも不要であれば削除しておきましょう。またローカルのNext.jsも不要な.env.localは削除しておいたほうが良いと思います。

## VercelでインストールしたSupabaseアカウントの場合

![Marketplace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/c8526ac2-93c0-4adf-a93d-f3c6de1b98ff.png)


なお、VercelでInstallを選んで、Supabaseに作成したプロジェクトは、連携の設定を解除するまで、Supabaseの管理画面から消せなくなります。（Vercel側は削除可能）

Vercel側でプロジェクトを削除したり、IntegrationをアンインストールしてもSupabase側の設定は残るため、一瞬どこで解除できるのか不明になります。

その場合はSupabase側のVercel Integrationに設定が残っていることがありますので、そちらの設定を解除してください。

![Cursor_と_Supabase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38388/eab976d1-eb89-4bf0-9cfa-40b0beeb9a53.png)

## おわりに

Next.jsやSupabase、Vercelなどは本当に変化が早く、技術系サイトで解説されている記事もすぐに手順が古くなり、そのままでは動かないケースが増えています。

最近はChatGPTなど生成AIのお陰で、すぐにトラブルシューティングができるので、ありがたいのですが、たまに廃止ずみのコンポーネントを案内されるなど、手戻りも多いと感じました。

この記事も来年にはどうなっているか分かりませんが、過去記事を超えていく、今の誰かの助けになればいいなと思います。

この記事はNext.jsとSupabase UI LibraryでGoogleの認証を使ってログインできるアプリケーションの構築手順の解説の前半でした。

次回はそちらで。

https://qiita.com/murodon/items/f6a0d3c746234b45a6ee