ガイド 第4

環境変数リファレンス

@event/core@event/fours-sdk

defineEnv — zod 検証つき env リゾルバ

3リポのどこにも無かった欠落機能である。DATABASE_URL / CRON_SECRET / FOURS_* の欠落を boot 時に fail-fast で検出し、本番で undefined のまま静かに走らせない。

// src/env.ts
import { z } from "zod";
import { defineEnv } from "@event/core";

export const env = defineEnv({
  FOURS_EVENT_SLUG: z.string().min(1),
  ADMIN_PASSWORD: z.string().min(8),
  SESSION_SECRET: z.string().min(16),
  DATABASE_URL: z.string().url().optional(),
});

検証失敗は EnvValidationError を throw し、キーごとの理由を列挙する。同じ shape から envExample(shape, comments).env.example の内容を生成できる(optional キーには # optional 注記が付く)。生成物は commit して運用する。

4S 接続(@event/fours-sdk — createFoursConfig が解決)

変数用途既定 / 備考
FOURS_API_BASEevent API basehttps://api.4s.link。legacy FOURS_API / FOUR_S_API fallback あり
FOURS_EVENT_SLUG対象イベント slugfetchEvent の既定 slug
FOURS_PUBLIC_READ1/true で public-read mode認証なし読み取り
FOURS_API_KEYwrite 系 Bearer。設定で authenticated modelegacy FOUR_S_API_KEY / FOUR_S_SERVICE_TOKEN fallback
USE_MOCK_DATA1 で mock-locked(4S に一切出ない)mode 判定の最優先
FOURS_WEBHOOK_SECRETinbound webhook HMAC-SHA256 鍵verifyWebhookSignature
FOURS_V2_API_BASE / NEXT_PUBLIC_4S_V2_API_BASEauth 系(login / users/me / handoff)base未指定なら apiBase と同一ホスト
NEXT_PUBLIC_4S_V2_WEB_BASE4S Web base(プロフィール URL 組み立て)https://4s.link
NEXT_PUBLIC_4S_LOGIN_URLログインレス handoff の起点 URLhttps://4s.link/ja/handoff/launch

セッション / 認証

変数用途備考
SESSION_SECRETjose HS256 cookie セッションの署名鍵本番未設定は createSessionCodec が throw(fail-closed)。dev は警告つき固定鍵
ADMIN_PASSWORD共有パスワード admin の期待値未設定は fail-closed(ログイン不可)。realm ごとに passwordEnv で別変数も指定可

4S service / admin API(opt-in)

変数用途
FOURS_REFRESH_TOKENCognito refresh token(優先。Google ログインのアカウント可)
FOURS_LOGIN_EMAIL / FOURS_LOGIN_PASSWORDPOST /auth/login fallback
FOURS_EVENT_IDadmin API(/manage/events/{id}/entries 等)の対象イベント ID

コンテンツストア(@event/core createContentStore — 本番のみ)

変数用途既定
GITHUB_TOKENOctokit commit 用 PAT必須(本番書き込み)
GITHUB_REPO_OWNER / GITHUB_REPO_NAMEcommit 先リポジトリ必須
GITHUB_BRANCHcommit 先ブランチmain

ストレージ / KV / cron

変数用途備考
BLOB_READ_WRITE_TOKENVercel Blob(@event/asset-kit createAssetStore)未設定時 put は throw
KV_REST_API_URL / KV_REST_API_TOKENUpstash Redis REST(Vercel KV)未設定なら dev in-memory shim に自動フォールバック
UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN同上の別名kv() が両方を解決
CRON_SECRETAuthorization: Bearer 厳格一致(withCronAuth)未設定は 503 fail-closed。比較は trim 硬化

機能モジュール別

変数機能用途備考
LIVE_HOST_SECRETsurveyslive poll の host key 導出秘密未設定は ADMIN_PASSWORD に fallback(どちらも無ければ throw)
DATABASE_URLdb / bookingNeon pooled 接続schema 操作(MCP addField)は不要。行データ操作のみ必須
DATABASE_URL_UNPOOLEDdbmigration 適用用の直接接続apply-migrations.mjs が優先使用
MCP_BEARER_TOKENmcpHTTP(URL 経由)MCP の Bearer 認証HTTP を使うなら必須。stdio は不要
BOOKING_OPENbooking予約/見積の受付 kill-switch0 で停止。既定 open
RESEND_API_KEYmailer / leadsResend 送信キー未設定は preview-only / no-op(fail-safe)
MAIL_FROM / MAIL_REPLY_TOmailer差出人 / 返信先"Event <onboarding@resend.dev>"
MAIL_BRAND_NAME / MAIL_BRAND_COLORmailerメール HTML shell のブランド任意
SLACK_WEBHOOK_URLmailer / leads運用 Slack 通知 / リード着信通知未設定は無言 no-op
LEAD_NOTIFY_TOleadsリード通知メールの宛先RESEND_API_KEY と両方揃うと有効
NEXT_PUBLIC_SITE_URLshare-cardOG 画像の絶対 URL 解決Vercel は VERCEL_URL で自動解決。ローカル共有プレビュー時のみ

ビルド制御

変数用途
NEXT_DIST_DIRdistDir の明示指定(createNextConfig)
BUILD_LOCAL1 で distDir を .next-local に分離(dev 中の yarn build 事故防止)

既知のトラップ

  • 前後空白 / 末尾スラッシュ: env に紛れ込んだ空白は Authorization ヘッダを壊して 401 になる。createFoursConfig は全値を trim() し、base URL は normalizeBase() で末尾スラッシュも除去する。CRON_SECRET の比較も trim 済み。ただし SDK を通らない自前コードは自衛が必要
  • *2 付きホストapi-staging2.4s.link / api-develop2.4s.link)は staging / develop 専用。本番は api.4s.link / 4s.link
  • legacy FOUR_S_ 系は fallback として読まれるが、新規イベントでは FOURS_ に統一する