運用 / デプロイ
コマンドは monorepo ルートから bun run --filter @tied-workspace/leader-collie <script>、 または apps/leader-collie/ 内で bun run <script>。
ローカル開発
bash
bun install # monorepo ルートで
bun run db:migrate # ローカル D1 作成(初回 / スキーマ変更時)
bun run db:seed # テストデータ投入
cp .dev.vars.example .dev.vars # ローカル用 Worker 環境変数
bun run dev # http://localhost:3000 (react-router dev)react-router dev(@cloudflare/vite-plugin)が SSR を workerd 上で実行し、 wrangler.jsonc の binding(ローカル D1 / R2)と .dev.vars を提供する。 Slack ログインを試さないなら .dev.vars の SKIP_AUTH=true で認証をスキップできる (事前に db:seed が必要)。
データベース運用
bash
bun run db:generate # スキーマ変更 → マイグレーション SQL 生成
bun run db:migrate # ローカル D1 に適用
bun run db:migrate:remote # 本番 D1 に適用
bun run db:reset # ローカル D1 の全データ削除
bun run db:backup # 本番 D1 の JSON ダンプ(D1 HTTP API)
bun run db:sync-slack # Slack メンバーを本番 D1 に upsert- SQL ダンプは
wrangler d1 export DB --remote --output backup.sqlでも取得できる - D1 Time Travel で 30 日以内の任意時点に復元できる(
wrangler d1 time-travel)
テスト
bash
bun run test # vitest(unit + integration)
bun run type-check # tsc --noEmit
bun run lint # ESLint
bun run test:e2e # Playwright(事前に bun run db:migrate が必要)E2E はローカル D1 の SQLite ファイルをフィクスチャが直接操作する (e2e/fixtures/database.ts → lib/db/local-db.ts)。 認証バイパス用の E2E_TEST_USER は e2e/global-setup.ts が .dev.vars を 一時的に差し替えて Worker に注入する(既存の .dev.vars は退避・復元される)。
デプロイ
bash
bun run deploy # react-router build && wrangler deploy事前に一度だけ:
- D1 / R2 を作成し
wrangler.jsoncのdatabase_idを実値にする vars(BETTER_AUTH_URL/R2_*など)を本番値にする- シークレットを登録する(Cloudflare リソース 参照)
bun run db:migrate:remoteでマイグレーション適用
デプロイ後の動作確認: ログイン(Slack OAuth)→ ダッシュボード表示 → イベント作成 → レポートのメディアアップロード(presigned URL が R2 に向くこと)。
既知の注意点
- D1 は対話型トランザクション非対応。
db.transactionを使わず、 必要ならdb.batchか単一 SQL で表現する - presigned PUT URL は R2 の S3 互換 API を使うため、
R2_ACCESS_KEY_ID/R2_SECRET_ACCESS_KEY(R2 API トークン)が必要 - メディアの公開配信には R2 のカスタムドメイン(または r2.dev)を有効化し、
R2_PUBLIC_URL_BASEを設定すること - 旧 Server Actions の戻り値は JSON 経由になったため Date は ISO 文字列になる (現状の呼び出し側は id / フラグ程度しか使っておらず影響なし)
- 旧 tied-event(Turso)からデータ移行する場合は、Turso からダンプした SQL を
wrangler d1 execute DB --remote --fileで流し込む