Complete visual guide for deploying AVOW Protocol to Cloudflare via dashboard.
- Prerequisites
- Part 1: Cloudflare Pages Setup
- Part 2: DNS Configuration
- Part 3: Security Configuration
- Part 4: Zero Trust Setup
- Part 5: Testing & Verification
- Cloudflare account (free or paid)
- Domain
avow-protocol.orgadded to Cloudflare - GitHub repository
hyperpolymath/avow-protocolaccessible - Repository pushed to main branch
- Log in to Cloudflare Dashboard
- Click on your account in the top left
- In the left sidebar, click "Workers & Pages"
- Click "Create application" button
- Select "Pages" tab
- Click "Connect to Git"
- Click "Connect GitHub" (or "Connect another repository" if already connected)
- Authorize Cloudflare to access your repositories
- In the repository list, find and select:
hyperpolymath/avow-protocol - Click "Begin setup"
On the "Set up builds and deployments" page:
Framework preset: None (or Custom)
Build configuration:
- Build command:
deno task build - Build output directory:
.(just a dot) - Root directory:
/(leave as default)
Environment variables: (click "Add variable" if needed)
- None required for initial deployment
Branch deployment:
- Production branch:
main - Preview branch: Leave enabled for pull requests
Click "Save and Deploy"
- Watch the build logs in real-time
- Initial build takes 2-5 minutes
- Look for:
✅ Success! Deployed to https://avow-protocol-xxx.pages.dev - Copy the
.pages.devURL for testing
If build fails:
- Check that all dependencies are in
package.json - Verify
deno.jsonhas correct build task - Check build logs for specific errors
- Click the
.pages.devURL from build logs - Verify the site loads correctly
- Check browser console for any errors (F12 → Console)
- Test navigation between pages
- In Cloudflare Dashboard, click on
avow-protocol.orgdomain - Click "DNS" in the left sidebar
- You'll see the DNS records table
Option A: Bulk Import
- Click "Advanced" at top right
- Click "Import and export"
- Click "Import DNS records"
- Copy contents from
cloudflare-dns-zone.txt - Paste into the text box
- Click "Preview records"
- Review the records to be imported
- Click "Import"
Option B: Manual Entry (if import fails)
Add these critical records manually:
| Type | Name | Content | Proxy | TTL |
|---|---|---|---|---|
| A | @ | 192.0.2.1 | ✅ Proxied | Auto |
| AAAA | @ | 2001:db8::1 | ✅ Proxied | Auto |
| A | www | 192.0.2.1 | ✅ Proxied | Auto |
| AAAA | www | 2001:db8::1 | ✅ Proxied | Auto |
192.0.2.1 and 2001:db8::1 with your actual IPs (or leave if using Cloudflare Pages)
| Type | Name | Content | Proxy | TTL |
|---|---|---|---|---|
| CNAME | gh-pages | hyperpolymath.github.io | ❌ DNS only | Auto |
| Type | Name | Content |
|---|---|---|
| CAA | @ | 0 issue "letsencrypt.org" |
| CAA | @ | 0 issue "digicert.com" |
| CAA | @ | 0 iodef "mailto:jonathan.jewell@open.ac.uk" |
| TXT | @ | v=spf1 include:_spf.github.com ~all |
| TXT | @ | github-pages-challenge-hyperpolymath=avow-protocol-verification |
| Type | Name | Content |
|---|---|---|
| TXT | _dmarc | v=DMARC1; p=reject; rua=mailto:jonathan.jewell@open.ac.uk |
| MX | @ | 10 mail.avow-protocol.org |
- Go back to Workers & Pages → avow-protocol project
- Click "Custom domains" tab
- Click "Set up a custom domain"
- Enter:
avow-protocol.org - Click "Continue"
- Cloudflare will automatically create DNS records
- Wait for "Active" status (1-5 minutes)
- Repeat for
www.avow-protocol.org
- In domain settings, click "DNS"
- Scroll to "DNSSEC" section
- Click "Enable DNSSEC"
- Copy the DS record information
- Add DS record to your domain registrar (if required)
- In domain overview, click "Rules" in left sidebar
- Click "Transform Rules"
- Click "Create rule"
- Rule name:
AVOW Security Headers
When incoming requests match:
- Select: "All incoming requests"
Then:
- Click "Set static" → "Response header"
- Add these headers one by one:
| Header | Value |
|---|---|
| Strict-Transport-Security | max-age=63072000; includeSubDomains; preload |
| X-Content-Type-Options | nosniff |
| X-Frame-Options | DENY |
| X-XSS-Protection | 1; mode=block |
| Content-Security-Policy | default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline' |
| Referrer-Policy | strict-origin-when-cross-origin |
| Permissions-Policy | geolocation=(), microphone=(), camera=() |
- Click "Deploy"
- In left sidebar, click "Security" → "WAF"
- Click "Create rule"
Rate Limiting - API Endpoints:
- Rule name:
API Rate Limit - If:
URI Path contains "/api/" - Then: Rate limit
- Requests: 100 per minute
- Action: Block
- Duration: 600 seconds
Rate Limiting - General:
- Rule name:
General Rate Limit - If:
All incoming requests - Then: Rate limit
- Requests: 1000 per minute
- Action: Challenge (CAPTCHA)
- Click "Deploy"
- Click "SSL/TLS" in left sidebar
- Set encryption mode to: "Full (strict)"
- Click "Edge Certificates"
- Enable:
- ✅ Always Use HTTPS
- ✅ HTTP Strict Transport Security (HSTS)
- ✅ Minimum TLS Version: TLS 1.3
- ✅ TLS 1.3 (Post-Quantum)
- ✅ Automatic HTTPS Rewrites
- Go to Security → WAF
- Click "Custom rules" tab
- Add these rules:
Block Bad Bots:
(cf.client.bot) and not (cf.verified_bot_category in {"Search Engine Crawler" "Monitoring & Analytics"})
Action: Block
Require Valid Referer for POST:
(http.request.method eq "POST") and not (http.referer contains "avow-protocol.org")
Action: Block
- In Cloudflare Dashboard, go to Zero Trust
- Click "Networks" → "Tunnels"
- Click "Create a tunnel"
- Tunnel name:
avow-protocol-tunnel - Click "Save tunnel"
- Copy the tunnel token (you'll need this)
On your server:
# Install cloudflared
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared
chmod +x cloudflared
sudo mv cloudflared /usr/local/bin/
# Authenticate
cloudflared tunnel login
# Create tunnel
cloudflared tunnel create avow-protocol
# Configure tunnel
cat > ~/.cloudflared/config.yml <<EOF
tunnel: <your-tunnel-id>
credentials-file: /path/to/credentials.json
ingress:
- hostname: dashboard.internal.avow-protocol.org
service: http://localhost:3000
- hostname: ci.internal.avow-protocol.org
service: http://localhost:8080
- service: http_status:404
EOF
# Run tunnel
cloudflared tunnel run avow-protocolIn Cloudflare DNS, add:
| Type | Name | Content |
|---|---|---|
| CNAME | dashboard.internal | <tunnel-id>.cfargotunnel.com |
| CNAME | ci.internal | <tunnel-id>.cfargotunnel.com |
- Go to Zero Trust → Access → Applications
- Click "Add an application"
- Select "Self-hosted"
- Application name:
AVOW Internal Dashboard - Session duration: 24 hours
- Application domain:
dashboard.internal.avow-protocol.org - Click "Next"
Add policy:
- Policy name:
AVOW Team Access - Action: Allow
- Include: Emails:
jonathan.jewell@open.ac.uk - Click "Next" → "Add application"
# Test SSL certificate
curl -I https://avow-protocol.org
# Check for HSTS header
curl -I https://avow-protocol.org | grep -i strict
# Test HTTP → HTTPS redirect
curl -I http://avow-protocol.org
# Test TLS 1.3
openssl s_client -connect avow-protocol.org:443 -tls1_3# Check all security headers
curl -I https://avow-protocol.org | grep -E "(X-|Content-Security|Strict-Transport)"Expected headers:
- ✅ Strict-Transport-Security
- ✅ X-Content-Type-Options: nosniff
- ✅ X-Frame-Options: DENY
- ✅ Content-Security-Policy
# Test DNSSEC
dig +dnssec avow-protocol.org
# Test CAA records
dig CAA avow-protocol.org
# Test SPF
dig TXT avow-protocol.org | grep spf-
Lighthouse Audit:
- Open Chrome DevTools (F12)
- Click "Lighthouse" tab
- Click "Generate report"
- Target scores: 95+ for all categories
-
WebPageTest:
- Go to https://www.webpagetest.org
- Enter:
https://avow-protocol.org - Run test
- Check CDN performance
-
SSL Labs:
- Go to https://www.ssllabs.com/ssltest/
- Enter:
avow-protocol.org - Target grade: A+
Manual testing checklist:
- Home page loads correctly
- All navigation links work
- Interactive demo functions
- Forms submit properly
- No console errors (F12 → Console)
- Mobile responsive (F12 → Device toolbar)
- All assets load (images, CSS, JS)
- No mixed content warnings
# Check current DNS
dig avow-protocol.org
# Flush local DNS cache (Linux)
sudo systemctl restart systemd-resolved
# Or (macOS)
sudo dscacheutil -flushcache- Check Cloudflare SSL mode: must be "Full (strict)"
- Verify origin certificate on server
- Wait 5-10 minutes for certificate provisioning
- Clear browser cache and cookies
- Check build logs in Pages dashboard
- Verify
deno.jsonbuild command - Test build locally:
deno task build - Check for missing dependencies in
package.json
- Go to Security → WAF → Custom rules
- Adjust rate limits:
- Increase requests per minute
- Change action to "Challenge" instead of "Block"
- Custom domain configured and active
- DNS records imported and verified
- DNSSEC enabled
- SSL/TLS set to Full (strict)
- Security headers configured
- WAF rules deployed
- Rate limiting configured
- Zero Trust tunnel created (optional)
- Access policies configured (optional)
- All tests passing
- Lighthouse score 95+
- SSL Labs grade A+
- No console errors
- Mobile responsive verified
- Check Cloudflare Analytics for traffic patterns
- Review Security Events for blocked requests
- Monitor error rates in Real-time logs
- Review WAF rule effectiveness
- Check certificate expiration dates (auto-renewed)
- Update DNS records if IPs changed
- Run Lighthouse audit
- Run SSL Labs test
- Update security headers if needed
- Review Zero Trust policies
Documentation:
- Cloudflare Pages: https://developers.cloudflare.com/pages/
- Cloudflare DNS: https://developers.cloudflare.com/dns/
- Cloudflare Tunnel: https://developers.cloudflare.com/cloudflare-one/
Contact:
- Jonathan D.A. Jewell: jonathan.jewell@open.ac.uk
- GitHub Issues: https://github.com/hyperpolymath/avow-protocol/issues
Your AVOW Protocol site is now deployed with:
- ✅ Global CDN (Cloudflare)
- ✅ Post-quantum TLS 1.3
- ✅ DNSSEC enabled
- ✅ Security headers configured
- ✅ WAF protection active
- ✅ Rate limiting enabled
- ✅ Zero Trust ready (optional)
Visit: https://avow-protocol.org