Deploy
Push to main → .github/workflows/ci.yml runs typecheck, tests, the migration-number check and a D1 dry-run, then applies D1 migrations to production and deploys only the apps whose files changed (api before web).
One-time setup
bash
npx wrangler d1 create artlove365-platform # paste the id into workers/api/wrangler.jsonc
npx wrangler r2 bucket create artlove365-uploads
npx wrangler secret put ADMIN_TOKEN --config workers/api/wrangler.jsonc
npx wrangler secret put STRIPE_SECRET_KEY --config workers/api/wrangler.jsonc
npx wrangler secret put STRIPE_WEBHOOK_SECRET --config workers/api/wrangler.jsoncGitHub repository secrets: CLOUDFLARE_API_TOKEN (Workers Scripts: Edit, D1: Edit, Workers Routes: Edit, Zone: DNS Edit for artlove365.com) and CLOUDFLARE_ACCOUNT_ID.
The zone artlove365.com must be on Cloudflare; the custom_domain routes create DNS records for the apex, www, api and docs automatically.
Manual re-deploy of one app: Actions → deploy-app → choose web, api or docs.