This guide covers local development, staging, and production deployment for the Cloudflare Worker.
- Node.js 20+
- Cloudflare account with Workers, D1, Queues, and AI enabled
- Wrangler CLI available via
npxor local install
- Install dependencies:
npm install- Generate admin password hash (PBKDF2):
node generate-password-hash.js "your-password"- Add local secret(s) to
.dev.vars:
ADMIN_PASSWORD_HASH="pbkdf2:..."- Run locally:
npm run dev- Deploy:
npx wrangler deploy --env staging
# or
npx wrangler deploy --env productionEnvironment bindings are defined in wrangler.toml.
compatibility_flags = ["nodejs_compat"]DB(D1)AUTH_TOKENS(KV, where configured)AI(Workers AI binding in staging/production)SUMMARY_QUEUE(Queue producer/consumer in staging/production)
AI_SUMMARY_ENABLED = "true"AI_SUMMARY_AUTO_ON_SAVE = "false"AI_SUMMARY_STORIES_PER_JOB = "10"AI_FETCH_JINA_FALLBACK = "true"AI_FETCH_MARKDOWN_NEW_FALLBACK = "true"AI_FETCH_SUMMARIZE_DAEMON_URL = ""
AI_SUMMARY_ENABLED = "true"AI_SUMMARY_AUTO_ON_SAVE = "true"AI_SUMMARY_STORIES_PER_JOB = "5"AI_FETCH_JINA_FALLBACK = "true"AI_FETCH_MARKDOWN_NEW_FALLBACK = "true"AI_FETCH_SUMMARIZE_DAEMON_URL = ""
Set admin hash in each deployed environment:
npx wrangler secret put ADMIN_PASSWORD_HASH --env staging
npx wrangler secret put ADMIN_PASSWORD_HASH --env productionOptional/production observability:
npx wrangler secret put SENTRY_DSN --env productionOptional summarize daemon token:
npx wrangler secret put AI_FETCH_SUMMARIZE_DAEMON_TOKEN --env staging
npx wrangler secret put AI_FETCH_SUMMARIZE_DAEMON_TOKEN --env productionCreate queues once (recommended with latest Wrangler):
npx wrangler@latest queues create massmurdercanada-staging-summary \
--message-retention-period-secs 86400 \
--delivery-delay-secs 0
npx wrangler@latest queues create massmurdercanada-production-summary \
--message-retention-period-secs 86400 \
--delivery-delay-secs 0After queue creation, deploy Worker environments so producer/consumer bindings activate.
Apply migrations:
npx wrangler d1 migrations apply massmurdercanada --env staging
npx wrangler d1 migrations apply massmurdercanada --env productionCore tables:
recordsnews_storiesadmin_sessions(D1 fallback session store if KV unavailable)
npx wrangler deploy --env staging
npx wrangler deploy --env productionSet shell env once (for example in .envrc):
SENTRY_AUTH_TOKENSENTRY_ORGSENTRY_PROJECT
Then run:
npm run deploy:production:sentryThis wraps deploy and automates:
- release version proposal
- release creation
- commit association
- worker deploy with
SENTRY_RELEASEandSENTRY_ENVIRONMENT - release finalize and deploy marker
Tail logs:
npx wrangler tail --env production --format prettyBackfill missing/fallback AI summaries from admin dashboard:
- Open
/admin - Click
Backfill Missing AI
Equivalent API (from an authenticated admin session):
curl -X POST "https://massmurdercanada.org/admin/api/records/summarize-all" \
-H "Content-Type: application/json" \
-d '{"limit":25,"offset":0,"only_missing":true,"include_fallback":true}'- Use
npx wrangler@latest ...for queue creation. - Older Wrangler versions may fail with this generic error.
- Ensure
nodejs_compatcompatibility flag remains enabled inwrangler.toml.
- Confirm
ADMIN_PASSWORD_HASHis in PBKDF2 format:pbkdf2:<iterations>:<salt_hex>:<hash_hex>
- Re-run
node generate-password-hash.js "new-password"and reset secret.
- Confirm correct
--envis used for deploy and D1 commands. - Verify
wrangler.tomldatabase IDs and queue names match Cloudflare resources.