Cloudflare リソース
apps/leader-collie/wrangler.jsonc で定義する。Worker 名は leader-collie。 エントリは workers/app.ts、静的アセットは build/client(react-router build の出力)。
Bindings
| Binding | 種類 | リソース名 | 用途 |
|---|---|---|---|
DB | D1 | leader-collie-db | メイン DB(イベント / ユーザー / 投票 / レポート) |
ANALYSIS_DB | D1 | leader-collie-analysis-db | 分析 DB(messages_vectors の読み取り) |
REPORTS_BUCKET | R2 | leader-collie-reports | レポート添付メディア |
初回プロビジョニング
bash
cd apps/leader-collie
bunx wrangler d1 create leader-collie-db
bunx wrangler d1 create leader-collie-analysis-db # 分析を使う場合のみ
bunx wrangler r2 bucket create leader-collie-reports出力された database_id を wrangler.jsonc に反映する。 R2 の公開配信用にカスタムドメイン(または r2.dev)を設定し、R2_PUBLIC_URL_BASE に入れる。
D1 マイグレーションは drizzle-kit で生成した SQL(packages/leader-collie-db/migrations/)を wrangler d1 migrations apply で適用する(migrations_dir 設定済み)。
Vars(wrangler.jsonc の vars)
| 変数 | 用途 |
|---|---|
BETTER_AUTH_URL | 公開 URL。better-auth の baseURL / OAuth リダイレクト |
NEXT_PUBLIC_APP_URL | 通知などに使うアプリ URL(変数名は旧スタック由来のまま) |
R2_ACCOUNT_ID | R2 S3 互換エンドポイント(presign)に使用 |
R2_BUCKET_REPORTS | レポートメディアのバケット名 |
R2_PUBLIC_URL_BASE | メディア公開 URL のベース(カスタムドメイン / r2.dev) |
OPENAI_MODEL_DEFAULT | AI ドラフト生成のモデル(省略時 gpt-4o-mini) |
ローカル開発では .dev.vars(.dev.vars.example をコピー)で上書きする。
Secrets(wrangler secret put)
| シークレット | 用途 |
|---|---|
BETTER_AUTH_SECRET | セッション署名 |
SLACK_CLIENT_ID / SLACK_CLIENT_SECRET | Slack OAuth(ログイン) |
SLACK_BOT_TOKEN | users.info / メンバー同期 |
SLACK_CHANNEL_ID | イベント通知先チャンネル |
TIED_BOT_URL / INTERNAL_API_SECRET | 通知ボット連携 / 内部 Webhook 認証 |
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET | Google カレンダー連携 OAuth |
OPENAI_API_KEY | AI ドラフト生成 |
OPENAI_BASE_URL | (任意)AI Gateway 経由にする場合のベース URL |
R2_ACCESS_KEY_ID / R2_SECRET_ACCESS_KEY | R2 S3 互換 API(presigned URL 生成) |
vars / secrets は nodejs_compat により Worker 内の process.env へ注入される。
運用スクリプト用(Workers 外、.env.local)
lib/scripts/ の運用スクリプトは Cloudflare REST API で本番 D1 に接続する:
CLOUDFLARE_ACCOUNT_IDCLOUDFLARE_D1_DATABASE_ID(メイン DB の database_id)CLOUDFLARE_API_TOKEN(D1 edit 権限)
アクセス制御
本アプリは一般メンバーがログインして使うため Cloudflare Access の外 に置く。 認証はアプリ内の better-auth (Slack OAuth) が担う (monorepo の「Access で保護し authentication logic を書かない」規約の例外)。