Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion apps/reminder-worker/wrangler.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
"$schema": "../../node_modules/wrangler/config-schema.json",
"name": "kanban-reminder-worker",
"main": "src/index.ts",
// It only reacts to cron and queues, and has nothing to answer on the web.
"workers_dev": false,
"compatibility_date": "2026-01-01",
"vars": {
// Where the links in mails point to, and who they come from. Set RESEND_API_KEY as a secret.
"APP_URL": "http://localhost:8787",
"APP_URL": "https://kanban-web.ut-code.workers.dev",
"REMINDER_FROM": "onboarding@resend.dev",
},
"triggers": {
Expand Down
8 changes: 8 additions & 0 deletions apps/web/wrangler.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
"main": "dist/server/server.js",
"compatibility_date": "2026-01-01",
"compatibility_flags": ["nodejs_compat"],
"vars": {
// The address of the deployed app. Login only accepts requests from this origin, so it has to
// match the real address. A local `pnpm dev` takes its own value from apps/web/.dev.vars.
"BETTER_AUTH_URL": "https://kanban-web.ut-code.workers.dev",
},
"assets": {
"directory": "dist/client",
"binding": "ASSETS",
Expand Down Expand Up @@ -52,6 +57,9 @@
"env": {
"preview": {
"name": "kanban-web-preview",
"vars": {
"BETTER_AUTH_URL": "https://kanban-web-preview.ut-code.workers.dev",
},
"d1_databases": [
{
"binding": "DB",
Expand Down
37 changes: 27 additions & 10 deletions docs/deploy.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,21 @@ export CLOUDFLARE_ACCOUNT_ID=<アカウント ID> # `wrangler whoami` で分

プレビューにはリマインド用のワーカーを置かない。cron が動いて、本番と同じようにメールを送ってしまうのを避けるため。

## いまの状態 (ut-code のアカウント `ut.code();`)

| | 状態 |
| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| リソース | D1 2 個、R2 2 個、キュー 4 つ。作成済み |
| マイグレーション | 本番とプレビューの両方に、すべて適用済み |
| `kanban-web` (本番) | デプロイ済み: https://kanban-web.ut-code.workers.dev |
| `kanban-web-preview` | デプロイ済み: https://kanban-web-preview.ut-code.workers.dev (別の DB) |
| `kanban-reminder-worker` | デプロイ済み (cron は 15 分ごと)。公開 URL はない (`workers_dev: false`) |
| シークレット | `BETTER_AUTH_SECRET` は、本番とプレビューに設定済み (別の値) |
| デプロイ後の確認 | プレビューで、アカウント作成、タスク、状態の変更、添付 (R2)、共有 (キュー)、WebSocket と Durable Objects を確認済み。本番には、データを作らないよう、アカウントは作っていない |
| Workers Builds (自動デプロイ) | **未設定**。下の 5 を、ダッシュボードで設定する |
| メール (Resend) | **未設定** ([#8](https://github.com/ut-code/kanban/issues/8))。それまで、メールの送信は失敗して、デッドレターキューに溜まる |
| Google ログイン | **未設定** ([#2](https://github.com/ut-code/kanban/issues/2)) |

## 1. リソースを作る (最初の 1 回)

Wrangler にログインする (`pnpm --filter @todo/web exec wrangler login`)。
Expand Down Expand Up @@ -63,29 +78,31 @@ pnpm db:migrate:preview # プレビュー

シークレットは `wrangler secret put` で入れる (リポジトリには書かない)。プレビューには `--env preview` を付ける。

| 名前 | どこに | 内容 |
| ------------------------------------------- | ------------------------ | --------------------------------------------------------------------------------------------------------------- |
| `BETTER_AUTH_SECRET` | web (本番、プレビュー) | 長いランダム文字列 (`openssl rand -hex 32`)。本番とプレビューで別の値にする |
| `BETTER_AUTH_URL` | web (本番、プレビュー) | そのアプリの公開 URL (例 `https://todo.example.com`)。ログインのオリジン確認に使うので、実際の URL と一致させる |
| `RESEND_API_KEY` | reminder-worker | Resend の API キー。詳しくは [ワーカー仕様](worker.md) |
| `REMINDER_FROM` | reminder-worker (`vars`) | 送信元アドレス。独自ドメインの検証が要る |
| `APP_URL` | reminder-worker (`vars`) | メールのリンクの先 (本番の公開 URL) |
| `GOOGLE_CLIENT_ID` / `GOOGLE_CLIENT_SECRET` | web | Google でログインするとき ([#2](https://github.com/ut-code/kanban/issues/2)) |
| 名前 | どこに | 内容 |
| ------------------------------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `BETTER_AUTH_SECRET` | web (本番、プレビュー) | 長いランダム文字列 (`openssl rand -hex 32`)。本番とプレビューで別の値にする |
| `BETTER_AUTH_URL` | web (`wrangler.jsonc` の `vars`) | そのアプリの公開 URL。ログインのオリジン確認に使うので、実際の URL と一致させる。本番は `https://kanban-web.ut-code.workers.dev`、プレビューは `env.preview.vars` に書いてある |
| `RESEND_API_KEY` | reminder-worker | Resend の API キー。詳しくは [ワーカー仕様](worker.md) |
| `REMINDER_FROM` | reminder-worker (`vars`) | 送信元アドレス。独自ドメインの検証が要る |
| `APP_URL` | reminder-worker (`vars`) | メールのリンクの先。本番の公開 URL (`https://kanban-web.ut-code.workers.dev`) |
| `GOOGLE_CLIENT_ID` / `GOOGLE_CLIENT_SECRET` | web | Google でログインするとき ([#2](https://github.com/ut-code/kanban/issues/2)) |

```sh
cd apps/web
pnpm exec wrangler secret put BETTER_AUTH_SECRET
pnpm exec wrangler secret put BETTER_AUTH_SECRET --env preview
```

`BETTER_AUTH_URL` は、`wrangler.jsonc` の `vars` に書くか、ダッシュボードの Variables で設定する。
`BETTER_AUTH_URL` と `APP_URL` は、公開してよい値なので、シークレットではなく `wrangler.jsonc` の `vars` に書いてある。ローカルの `pnpm dev` は、`apps/web/.dev.vars` の値を使う。

シークレットを入れた直後は、反映まで数十秒かかる。そのあいだ、古いバージョンが応答して、ログインしているのに 401 になるなど、結果が一定しないことがある。少し待ってから試す。

**プレビューの URL の注意:** ログインは、`BETTER_AUTH_URL` と同じオリジンからのリクエストしか受け付けない。プレビューでログインを試すには、`https://kanban-web-preview.<アカウントのサブドメイン>.workers.dev` のように、**固定の URL** を `BETTER_AUTH_URL` に設定して、その URL で開く。ブランチごとに変わるバージョンの URL (`<ハッシュ>-kanban-web-preview…`) では、ログインできない。

## 4. 初回のデプロイ

```sh
pnpm deploy:web # 本番の Web
pnpm deploy:web # 本番の Web (中身は `pnpm --filter @todo/web run deploy`。`pnpm deploy` は pnpm 自身の別のコマンドなので、`run` が要る)
pnpm deploy:worker # リマインド用のワーカー
pnpm deploy:preview # プレビューの Web (Worker を作るため、最初に 1 回)
```
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
"db:migrate:remote": "pnpm --filter @todo/web exec wrangler d1 migrations apply kanban-db --remote",
"test:e2e": "playwright test",
"db:migrate:preview": "pnpm --filter @todo/web exec wrangler d1 migrations apply kanban-db-preview --remote --env preview",
"deploy:web": "pnpm --filter @todo/web deploy",
"deploy:web": "pnpm --filter @todo/web run deploy",
"deploy:preview": "pnpm --filter @todo/web build && pnpm --filter @todo/web exec wrangler deploy --env preview",
"deploy:worker": "pnpm --filter @todo/reminder-worker deploy",
"deploy:worker": "pnpm --filter @todo/reminder-worker run deploy",
"check:deploy": "pnpm --filter @todo/web build && pnpm --filter @todo/web exec wrangler deploy --dry-run --outdir .wrangler/dry-run && pnpm --filter @todo/web exec wrangler deploy --dry-run --env preview --outdir .wrangler/dry-run-preview && pnpm --filter @todo/reminder-worker exec wrangler deploy --dry-run --outdir .wrangler/dry-run"
},
"devDependencies": {
Expand Down
Loading