Azure Primary · On-Premises Failover · Cloudflare Edge · JuiceFS + Backblaze B2
▸ DMZ — Ingress from Cloudflare (dmz-subnet: 10.10.0.0/26)
▸ HAProxy Layer — SSL Termination + Load Balancing (haproxy-subnet: 10.10.1.0/24)
web_backend → WS 1&2 port 8080 (round-robin). cas_backend → CAS 1&2 port 8443 (round-robin + cookie affinity).
▸ Egress & Admin Access
▸ Compute Subnets (Separate NSGs per subnet)
▸ JuiceFS Storage Layer — Content at /var/www (shared-subnet: 10.10.4.0/24)
/mnt/staging →
promoted to /var/www (JuiceFS) → chunks written to Backblaze B2 →
Web Server 1 & 2 see updated content instantly via JuiceFS mounts.
Future (VPN live): DFS → Azure File Sync → JuiceFS replaces GitLab deploy step.
▸ NSG Rules (Key)
Cloudflare health checks Azure cloudflared tunnel (HTTPS /cas/login every 30s). 2 consecutive failures → all traffic routes to on-prem HAProxy automatically. On-prem web servers read /var/www from DFSR local replica — content available independently of Azure and Backblaze. On-prem CAS uses local Redis — users re-authenticate on failover (acceptable). Once S2S VPN is live: on-prem web servers mount JuiceFS directly over VPN, achieving full content parity with Azure at all times.
▸ Normal Traffic Flow — Auth (Azure Primary)
▸ Content Publish Flow — JuiceFS + Backblaze B2
▸ Cloudflare Tunnel Failover Flow — Azure Down → On-Prem
2 × 30s = 60 seconds →
onprem-pool promoted automatically → on-prem cloudflared VM forwards to on-prem HAProxy → on-prem web servers serve content.
Azure recovers → Cloudflare fails back to azure-pool automatically. No manual intervention needed.
FortiGate must allow: outbound TCP 443 from cloudflared VM + inbound TCP 80 from cloudflared VM to HAProxy.
| Subnet | CIDR | Purpose |
|---|---|---|
| dmz-subnet | 10.10.0.0/26 | cloudflared Connector VM |
| haproxy-subnet | 10.10.1.0/24 | HAProxy Node 1 & 2 (Deb12) |
| web-subnet | 10.10.2.0/24 | Web Server 1 & 2 + JuiceFS client |
| cas-subnet | 10.10.3.0/24 | CAS Node 1 & 2 |
| shared-subnet | 10.10.4.0/24 | Redis VM (CAS+JuiceFS) + AD DS |
| nat-subnet | 10.10.5.0/27 | NAT Gateway |
| AzureBastionSubnet | 10.10.6.0/26 | Azure Bastion (required name) |
| GatewaySubnet | 10.10.255.0/27 | VPN Gateway (required name) |