Clone
Deployment Guide for qrurl.us
Prerequisites
-
Cloudflare Account with:
- Workers subscription (free tier works)
- R2 enabled
- Pages enabled
- Domain
qrurl.usadded to Cloudflare
-
GitHub Repository: https://github.com/toreyheinz/qrurl
Setup Steps
1. Configure Cloudflare API Token
Create a Cloudflare API token with these permissions:
- Account: Cloudflare Workers Scripts:Edit
- Account: Cloudflare Pages:Edit
- Account: D1:Edit
- Account: Workers R2 Storage:Edit
- Account: Workers KV Storage:Edit
- Zone: DNS:Edit (for qrurl.us)
2. Add GitHub Secrets
Go to GitHub repo → Settings → Secrets → Actions and add:
CLOUDFLARE_API_TOKEN: Your Cloudflare API tokenCLOUDFLARE_ACCOUNT_ID: b253e6fbfd2f7757cadd0386de5bde3f
3. Configure Cloudflare Environment
Workers Secrets (via Dashboard or CLI):
# Set production secrets
npx wrangler secret put JWT_SECRET --env production
npx wrangler secret put EMAIL_API_KEY --env production
npx wrangler secret put AUTHORIZED_EMAILS --env production
Initialize Production Database:
# Run database migrations on production
npm run db:init:remote
4. Set Up Custom Domains
For API (Workers):
- Go to Cloudflare Dashboard → Workers & Pages → qrurl
- Settings → Triggers → Custom Domains
- Add:
api.qrurl.us
For Frontend (Pages):
- Go to Cloudflare Dashboard → Workers & Pages → qrurl-frontend
- Custom domains → Add domain
- Add:
qrurl.usandwww.qrurl.us
5. Create Cloudflare Pages Project
# One-time setup for Pages project
npx wrangler pages project create qrurl-frontend --production-branch main
6. DNS Configuration
Add these DNS records in Cloudflare:
Type Name Content
A @ 192.0.2.1 (Proxied - placeholder for Pages)
CNAME www qrurl.us (Proxied)
CNAME api qrurl.workers.dev (Proxied - or use Workers custom domain)
Deployment Process
Automatic Deployment
Push to main branch triggers automatic deployment:
git push origin main
This will:
- Deploy backend to Cloudflare Workers
- Build and deploy frontend to Cloudflare Pages
- Update both production environments
Manual Deployment
Backend:
npm run deploy
Frontend:
cd frontend
npm run build
npx wrangler pages deploy dist --project-name qrurl-frontend
Environment Variables
Backend (Workers):
JWT_SECRET: Strong random secret for JWT signingEMAIL_API_KEY: Resend or SendGrid API keyAUTHORIZED_EMAILS: Comma-separated list of authorized emailsFRONTEND_URL: https://qrurl.usBACKEND_URL: https://qrurl.us
Frontend (Build-time):
VITE_API_URL: https://api.qrurl.us/apiVITE_SHORT_URL: https://qrurl.us
Post-Deployment Checklist
- Verify Workers deployment at https://api.qrurl.us/health
- Verify Pages deployment at https://qrurl.us
- Test authentication flow
- Test URL creation and redirection
- Test logo upload to R2
- Verify QR code generation with logos
- Check analytics tracking
- Test rate limiting
Monitoring
- Workers Analytics: Cloudflare Dashboard → Workers & Pages → qrurl → Analytics
- Pages Analytics: Cloudflare Dashboard → Workers & Pages → qrurl-frontend → Analytics
- R2 Storage: Cloudflare Dashboard → R2 → qrurl-storage
- D1 Database: Cloudflare Dashboard → D1 → qrurl-db
Rollback
If issues occur:
-
Workers: Deploy previous version via dashboard or:
npx wrangler rollback -
Pages: Rollback via dashboard to previous deployment
Troubleshooting
CORS Issues
- Verify
FRONTEND_URLis set correctly in Workers environment - Check custom domain configuration
Database Issues
- Ensure D1 database ID matches in wrangler.toml
- Run migrations:
npm run db:init:remote
R2 Issues
- Verify R2 bucket exists:
qrurl-storage - Check bucket permissions
Domain Issues
- Ensure DNS records are proxied through Cloudflare
- Wait for DNS propagation (up to 48 hours)