ざっくりT3 Stack入門 - 環境構築
web入門者のけめるです。
webサービスを作りたく、T3 Stackについて入門してみたのでそのメモです。
T3 Stackについて
フルスタック(フロントエンドもバックエンドもいける的)なNext.jsベースのフレームワークです。
以下の技術・フレームワークが統合されています:
参考:公式ドキュメント
pnpmのインストール
npm, yarnでもいいですがpnpmの方が速いらしいので。
以下のページを参考にインストール。
windowsの場合:
powershellにてインストール。
iwr https://get.pnpm.io/install.ps1 -useb | iex
macの場合:
多分terminalにてインストール。
curl -fsSL https://get.pnpm.io/install.sh | sh -
環境構築
T3 Stackの環境構築をして、ローカルで実行していきます。
powershell/terminalにてプロジェクトを作りたいディレクトリに移動したのち、以下を実行します。
pnpm create t3-app@latest
実行後、いろいろな質問が聞かれますが、すべてデフォルトを選択していきます。プロジェクト名は任意で。
これでプロジェクトが作成できたので、使いたいエディタ(VSCodeとか)で開きます。
ファイル構造
.
├─ public
│ └─ favicon.ico
├─ prisma
│ └─ schema.prisma
├─ src
│ ├─ env.js
│ ├─ pages
│ │ ├─ _app.tsx
│ │ ├─ api
│ │ │ ├─ auth
│ │ │ │ └─ [...nextauth].ts
│ │ │ └─ trpc
│ │ │ └─ [trpc].ts
│ │ └─ index.tsx
│ ├─ server
│ │ ├─ auth.ts
│ │ ├─ db.ts
│ │ └─ api
│ │ ├─ routers
│ │ │ └─ example.ts
│ │ ├─ trpc.ts
│ │ └─ root.ts
│ ├─ styles
│ │ └─ globals.css
│ └─ utils
│ └─ api.ts
├─ .env
├─ .env.example
├─ .eslintrc.cjs
├─ .gitignore
├─ next-env.d.ts
├─ next.config.js
├─ package.json
├─ postcss.config.cjs
├─ prettier.config.js
├─ README.md
├─ tailwind.config.ts
└─ tsconfig.json
-
.env
にてデータベースや認証システムの設定等を行います。 - 念のため、
.gitignore
にて.env
が登録されていることを確認してください。 -
pages/
にてクライアント側のコードを、server/
にてサーバー側のコードを書きます。
ローカル環境の実行(失敗)
開いたらエディタのコマンドプロンプトを起動し、以下を実行します。
pnpm run dev
エラーが出るはずです。
❌ Invalid environment variables: { DISCORD_CLIENT_ID: [ 'Required' ] }
file:///C:/<省略...>
throw new Error("Invalid environment variables");
上記のエラーが出てればOKです。
このエラーはNextAuthのログイン認証機能が正しく設定されていないために発生します。NextAuthを導入している際は、ローカル環境でもまずこの設定を始める必要があります。
T3 StackではGoogleやGitHubなどのいろんな認証方法を利用できますが、デフォルトでは設定が一番シンプルなDiscordになっていますので、今回はDiscordで設定してみます。
Discordの認証設定
- Discordアカウントを登録します。
-
登録後、https://discord.com/developers/applications に移動し、右上の「New Application」をクリックします。
-
アプリケーションの名前を付け、利用規約に同意します。
-
「Settings → OAuth2」に移動します。
-
「Client ID」をコピーし、
.env
にてDISCORD_CLIENT_ID=
の右側に貼り付けます。 -
「Reset Secret」をクリックし、Discordのパスワードを入力して認証したら、新しいシークレット情報をコピーし、
.env
にてDISCORD_CLIENT_SECRET=
の右側に貼り付けます。 -
「Add Redirect」をクリックし、http://localhost:3000/api/auth/callback/discord と入力します。
- 以下を実行し、生成された文字列を
.env
のNEXTAUTH_SECRET=
の右側に貼り付けます。
openssl rand -base64 32
- ローカルの場合、
NEXTAUTH_URL=
の右側に"http://localhost:3000"
を貼り付けます。
ローカルの場合、これでDiscordの設定は終了です。
# When adding additional environment variables, the schema in "/src/env.js"
# should be updated accordingly.
# Prisma
# https://www.prisma.io/docs/reference/database-reference/connection-urls#env
DATABASE_URL=""
# Next Auth
# You can generate a new secret on the command line with:
# openssl rand -base64 32
# https://next-auth.js.org/configuration/options#secret
NEXTAUTH_SECRET="<7.生成した文字列>"
NEXTAUTH_URL="http://localhost:3000"
# Next Auth Discord Provider
DISCORD_CLIENT_ID="<5.クライアントID>"
DISCORD_CLIENT_SECRET="<6.シークレットパスワード>"
supabaseの設定
このままsupabaseにてDB(データベース)の登録をしていきましょう。
- 上記サイトにアクセスし、アカウント登録します。
- ログインしたら「Dashboard」にて「New Project」を選択します。
- 以下の様な画面で、プロジェクト名、DBのパスワード(後で必要)、Region(日本ならTokyoを選択)を埋めていきます。
- 「Project Settings → Database」に移動し、URIをコピーします。
-
.env
にて、DATABASE_URL=
に貼り付けます。URI内の[YOUR-PASSWORD]という文字列の部分に先ほどの3のパスワードを入力します。
DATABASE_URL="<5.URI>"
-
prisma/schema.prisma
にて、dbの内容をsupabase用に修正します。provider = "postgresql"に変更します。
datasource db {
provider = "postgresql"
// NOTE: When using mysql or sqlserver, uncomment the @db.Text annotations in model Account below
// Further reading:
// https://next-auth.js.org/adapters/prisma#create-the-prisma-schema
// https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#string
url = env("DATABASE_URL")
}
- そのまま下のUserの@db.Textをすべてアンコメントします。
// Necessary for Next auth
model Account {
id String @id @default(cuid())
userId String
type String
provider String
providerAccountId String
refresh_token String? @db.Text
access_token String? @db.Text
expires_at Int?
token_type String?
scope String?
id_token String? @db.Text
session_state String?
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([provider, providerAccountId])
}
- この状態で以下を実行します。
pnpm prisma db push
これでdbのpushが完了し、supabase上に反映されていると成功です!
supabaseの「table editor」にてprismaに登録されているデータ型が存在することを確認してください!
この状態で以下を実行し、起動するか確認して下さい。
pnpm run dev
「Sign In」からDiscord認証によるログインが可能です!
おわりに
T3 Stackとsupabaseを使えばかなり楽に認証付きのシステムが作れる気がします。
機会があれば次は具体的なアプリの設計についてまとめたいと思います。
Discussion