セットアップ
前提条件
| ツール | バージョン |
|---|---|
| Bun | v1.x 以上 |
| Docker / Docker Compose | Postgres コンテナ起動に必要 |
| Node.js | v20 以上(フロントエンドの型定義用) |
| Google Cloud プロジェクト | OAuth クライアント ID / シークレットの発行に必要 |
リポジトリ構成
このプロジェクトは独立した 2 つのリポジトリからなる。作業ディレクトリ直下に両方を並べて配置する運用を想定している。
backend の手順
1. リポジトリのクローン
git clone <backend-repository-url> heineken-interview-arrange-backend
cd heineken-interview-arrange-backend
2. 一括セットアップ
.env の作成、Postgres の起動、依存関係のインストール、スキーマ反映をまとめて実行する。
内部で以下を順に行う。
.env.exampleから.envを作成(既にあればスキップ)- Docker の起動確認
docker compose up -d postgres(PostgreSQL 17)pg_isreadyで起動待ちbun installbun run db:push
個別に実行する場合は以下。
3. 環境変数の設定
.env のうち、Google OAuth の 3 項目は必ず自分の値に置き換える。
| 変数名 | 必須 | 説明 | 例 |
|---|---|---|---|
NODE_ENV |
- | 実行モード | development |
PORT |
- | 待ち受けポート(既定 8080) | 8080 |
HOST |
- | 待ち受けホスト(既定 0.0.0.0) | 0.0.0.0 |
APP_BASE_URL |
◯ | バックエンド自身の URL | http://localhost:8080 |
FRONTEND_URL |
- | フロントエンドの URL(既定 http://localhost:3000) |
http://localhost:3000 |
ALLOWED_ORIGINS |
◯ | CORS 許可オリジン(カンマ区切り) | http://localhost:3000 |
DATABASE_URL |
◯ | DB 接続文字列 | postgresql://user:password@localhost:5432/interview_arrangement |
GOOGLE_CLIENT_ID |
◯ | OAuth クライアント ID | xxx.apps.googleusercontent.com |
GOOGLE_CLIENT_SECRET |
◯ | OAuth クライアントシークレット | - |
GOOGLE_REDIRECT_URI |
◯ | OAuth コールバック URL | http://localhost:8080/api/v1/auth/google/callback |
ALLOWED_EMAIL_DOMAINS |
◯ | ログインを許可するメールドメイン(カンマ区切り) | 4digit.jp |
ALLOWED_SURVEY_IDS |
- | 連携する調査を限定する(カンマ区切り)。未設定なら制限なし | 389867 |
GOOGLE_SERVICE_ACCOUNT_EMAIL |
- | Calendar 操作用サービスアカウント | - |
GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY |
- | 同秘密鍵 | "-----BEGIN PRIVATE KEY-----\n...\n" |
GMAIL_SENDER_EMAIL |
- | 送信元アドレス | noreply@example.com |
EMAIL_ENABLED |
- | 実メール送信の可否(既定 false) |
true |
JWT_SECRET |
◯ | JWT 署名鍵(32 文字以上) | - |
JWT_EXPIRES_IN |
- | アクセストークン有効期限(既定 1h) |
1h |
JWT_REFRESH_EXPIRES_IN |
- | リフレッシュトークン有効期限(既定 7d) |
7d |
PROTOTYPE_MODE |
- | 外部副作用の無効化(既定 true) |
true |
LOG_LEVEL |
- | ログレベル(既定 info) |
debug |
LOG_SQL_QUERIES |
- | SQL ログ出力(既定 false) |
false |
SCHEDULING_TOKEN_TTL_DAYS |
- | 調整トークン有効日数(既定 14) |
14 |
DATABRICKS_HOST |
- | ワークスペース URL | https://dbc-xxxx.cloud.databricks.com |
DATABRICKS_WAREHOUSE_ID |
- | SQL Warehouse の ID | - |
DATABRICKS_CLIENT_ID |
- | サービスプリンシパルの Application ID | - |
DATABRICKS_CLIENT_SECRET |
- | サービスプリンシパルの OAuth secret | - |
DATABRICKS_TOKEN |
- | ローカル用。CLI のトークンで代替する場合に指定 | - |
DATABRICKS_CATALOG |
- | 既定 cs |
cs |
DATABRICKS_SCHEMA_DM |
- | 調査別テーブルのスキーマ。既定 cs_dm |
cs_dm |
DATABRICKS_SCHEMA_DWH |
- | メタ集計用スキーマ。既定 cs_dwh |
cs_dwh |
環境変数は src/config/env.ts の Zod スキーマが起動時に検証する。変数を追加するときは src/config/env.ts と .env.example の両方を更新すること。
ALLOWED_EMAIL_DOMAINS は必須
未設定だと起動時に失敗する。任意にすると設定漏れで誰でもログインできる穴が残るため、意図的に fail-closed にしている。
Databricks 変数は process.env を直読みする
lib/databricks-client.ts は getEnvConfig() を通さない。バッチがアプリ用の必須変数なしで動くため。env.ts の定義は API 側の検証用。ローカルでは DATABRICKS_TOKEN=$(databricks auth token -p <profile> | jq -r .access_token) で資格情報を省略できる。
PROTOTYPE_MODE
PROTOTYPE_MODE=true(既定)の間は メール送信と Google Calendar への書き込みが無効化される。コードから判定するときは env を直接読まず isEmailEnabled() / isCalendarEnabled() / isPrototypeMode() を使う。dev は既定のまま、stg は false にして実際に送信・書き込みを行う。
ALLOWED_SURVEY_IDS は空文字を許さない
未設定なら制限なし(ローカルと dev)。一方、設定されているのに空の場合は起動時エラーにしている。限定が必須の環境で値が抜けたときに、全調査が見える状態へ黙って戻らないようにするため。判定は isSurveyAllowed() / getAllowedSurveyIds() を使う。
効くのは services/survey.ts の一覧・詳細(対象外の ID は 404)と、batch/databricks-meta-sync.ts のキャッシュ対象(WHERE survey_id IN (...) で絞るのでメタ集計自体も速くなる)。
4. 起動
| URL | 内容 |
|---|---|
http://localhost:8080/health |
ヘルスチェック |
http://localhost:8080/docs |
Swagger UI |
http://localhost:8080/openapi.json |
OpenAPI 定義(Orval の入力) |
frontend の手順
1. 依存関係のインストール
2. 環境変数の設定
| 変数名 | 説明 | 例 |
|---|---|---|
NEXT_PUBLIC_API_URL |
バックエンドのベース URL。未設定時は http://localhost:8080 |
http://localhost:8080 |
3. API クライアントの生成
backend を起動した状態で実行する。停止していると Orval は失敗する。
http://localhost:8080/openapi.json から src/api/**(React Query フックと型)が再生成される。生成物は手で編集しない。
4. 起動
http://localhost:3000 にアクセスして確認する。
API を変更したときの手順
graph LR
A[backend でルート/スキーマを修正] --> B[bun run dev で backend 起動]
B --> C[frontend で bun run generate-api]
C --> D[画面側のコードを修正]
よくあるエラー
Invalid environment variables:
原因: src/config/env.ts の Zod 検証に失敗している。必須変数の欠落か、形式違反(JWT_SECRET が 32 文字未満、URL 形式でないなど)。
解決策: エラーメッセージに列挙された変数を .env で修正する。
Orval の生成が失敗する
原因: backend が起動していない、または /openapi.json が返らない。
解決策:
# 別ターミナルで backend を起動
cd ../heineken-interview-arrange-backend && bun run dev
# 疎通を確認してから再実行
curl http://localhost:8080/openapi.json | head
docker compose で Postgres が起動しない
原因: ポート 5432 が既存の PostgreSQL に使われている。
解決策:
スキーマ変更が DB に反映されない
原因: 開発時のスキーマ反映は db:push が主。マイグレーションファイル生成(db:generate)だけでは DB は変わらない。
解決策: