Deployment
| Development | Production | |
|---|---|---|
| Pages project | emaw-website, branch develop | emaw-website, production branch |
| URL | https://develop.emaw-website.pages.dev → https://develop-website.everymanawarrior.cc (Cloudflare Access) | everymanawarrior.com at launch |
| Trigger | GitHub Action on push to develop (.github/workflows/deploy-develop.yml) | Manual |
| Build | npm run deploy:develop = tsc -b && vite build --mode development && wrangler pages deploy dist --project-name emaw-website --branch develop | npm run build then wrangler pages deploy dist --project-name emaw-website |
| Variables | GitHub repository vars.VITE_* | Pages project environment variables (Production) |
| Secrets | CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID (GitHub environment develop) | the same token in your shell |
The workflow uses npm install (no lockfile, see Local development) and Node 24, cancels an older run when a newer push arrives, and reads its VITE_* values from repository variables because the .env.* files are gitignored.
Manual production deploy
npx wrangler login # once per machine
npm run build
npx wrangler pages deploy dist --project-name emaw-website --branch main
wrangler.toml deliberately has no pages_build_output_dir (it conflicts with the dev:pages proxy), so always pass dist explicitly.
Set the production VITE_* values in the Pages project (Settings → Environment variables → Production) before building there, or export them in the shell that runs npm run build; Vite bakes them into the bundle.
Go-live for commerce
Donations, store and events need live-mode Stripe objects and the production backend's env in place first. The checklist is docs/donations-go-live.md; the store and events follow the same pattern (webhook endpoint with all nine events, payment method configurations, products).
Deploy order
When a change spans the backend and the hand-off: backend, then web app, then website.
Known gaps
- No production workflow. Adding
deploy-production.yml(push tomain,--branch main) mirroring the web app is straightforward once the production custom domain exists. - The raw
*.pages.devhostname should sit behind Cloudflare Access like the custom domain.