# Network Architecture Visual overview of how all services connect and communicate. ## 🌐 Network Flow Diagram ``` INTERNET β”‚ β”‚ DNS A Records β”‚ (cloud.yourdomain.com β†’ SERVER_IP) ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Firewall (UFW)β”‚ β”‚ Ports: 80 β”‚ β”‚ 443 β”‚ β”‚ 41641 β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Port 80/443 Port 41641 Port 22 β”‚ β”‚ β”‚ ↓ ↓ ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ CADDY β”‚ β”‚ TAILSCALE β”‚ β”‚ SSH β”‚ β”‚ Reverse Proxyβ”‚ β”‚ VPN β”‚ β”‚ Access β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ ↓ ↓ ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ PUBLIC β”‚ β”‚ TAILSCALE-ONLY β”‚ β”‚SERVICES β”‚ β”‚ SERVICES β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸ” Access Matrix | Service | Public URL | Tailscale URL | Direct Access | |---------|-----------|---------------|---------------| | **Nextcloud** | βœ… https://cloud.domain.com | βœ… Via Tailscale IP | ❌ No | | **OnlyOffice** | βœ… https://office.domain.com | βœ… Via Tailscale IP | ❌ No | | **Excalidraw** | βœ… https://draw.domain.com | βœ… Via Tailscale IP | ❌ No | | **Obsidian** | βœ… https://notes.domain.com | βœ… Via Tailscale IP | ❌ No | | **Homarr** | ❌ 403 Forbidden | βœ… https://home.domain.com | ❌ No | | **Dockhand** | ❌ 403 Forbidden | βœ… https://manage.domain.com | ❌ No | | **Uptime Kuma** | ❌ 403 Forbidden | βœ… https://uptime.domain.com | ❌ No | | **PostgreSQL** | ❌ No | ❌ No | βœ… Docker network only | | **Redis** | ❌ No | ❌ No | βœ… Docker network only | | **Caddy** | ❌ No (serves others) | ❌ No | βœ… Docker network only | | **Watchtower** | ❌ No | ❌ No | βœ… Docker network only | --- ## 🐳 Docker Network Topology ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ nextcloud_network (bridge) β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚PostgreSQLβ”‚ β”‚ Redis β”‚ β”‚Nextcloud β”‚ β”‚OnlyOfficeβ”‚ β”‚ β”‚ β”‚ :5432 β”‚ β”‚ :6379 β”‚ β”‚ :80 β”‚ β”‚ :80 β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ ↑ ↑ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚Excalidrawβ”‚ β”‚ Caddy β”‚ β”‚ Obsidian β”‚ β”‚ Homarr β”‚ β”‚ β”‚ β”‚ :80 β”‚ β”‚80β†’:80 β”‚ β”‚ :3000 β”‚ β”‚ :7575 β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚443β†’:443 β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” ↓ β”‚ β”‚ β”‚ Dockhand β”‚ β”‚ β”‚ β”‚ Uptime β”‚ /var/run/ β”‚ β”‚ β”‚ :3000 β”‚ β”‚ β”‚ β”‚ Kuma β”‚ docker.sock β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ :3001 β”‚ (read-only) β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Watchtower (monitors all) β”‚ β”‚ β”‚ β”‚ Accesses: /var/run/docker.sock β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ Exposed Ports β”‚ Internal β”‚ β”‚ Communication ↓ ↓ Host: 80, 443 Container-to-Container (Caddy only) via Docker DNS ``` --- ## πŸ”„ Request Flow Examples ### Example 1: User Accesses Nextcloud ``` User Browser β”‚ β”‚ HTTPS GET https://cloud.yourdomain.com ↓ Internet β”‚ ↓ Firewall (Port 443) β”‚ ↓ Caddy Container (:443) β”‚ β”‚ Validates SSL certificate β”‚ Checks Caddyfile rules β”‚ Proxies to backend ↓ Nextcloud Container (:80) β”‚ β”‚ Checks trusted domains β”‚ Queries PostgreSQL β”‚ Checks Redis cache ↓ PostgreSQL + Redis β”‚ β”‚ Returns data ↓ Nextcloud β†’ Caddy β†’ User ``` ### Example 2: User Accesses Homarr (via Tailscale) ``` User Browser (on Tailscale) β”‚ β”‚ HTTPS GET https://home.yourdomain.com ↓ Internet β†’ DNS Resolution β”‚ ↓ Firewall (Port 443) β”‚ ↓ Caddy Container β”‚ β”‚ Checks client IP: 100.64.x.x (Tailscale range) β”‚ βœ… Match! Proxy to backend β”‚ ↓ Homarr Container (:7575) β”‚ β”‚ Reads Docker socket β”‚ Shows container status ↓ Returns dashboard β†’ Caddy β†’ User ``` ### Example 3: User Accesses Homarr (NOT on Tailscale) ``` User Browser (public internet) β”‚ β”‚ HTTPS GET https://home.yourdomain.com ↓ Internet β†’ DNS Resolution β”‚ ↓ Firewall (Port 443) β”‚ ↓ Caddy Container β”‚ β”‚ Checks client IP: NOT in 100.64.0.0/10 β”‚ ❌ No match! Return 403 Forbidden β”‚ ↓ 403 Access Denied ``` ### Example 4: Nextcloud Connects to Database ``` Nextcloud Container β”‚ β”‚ Docker DNS lookup: next-db β”‚ Resolves to: 172.20.0.x ↓ PostgreSQL Container (next-db:5432) β”‚ β”‚ Internal Docker network β”‚ No external exposure β”‚ ↓ Returns query results ``` --- ## πŸ“Š Data Flow Diagram ### File Upload to Nextcloud ``` User β†’ Caddy β†’ Nextcloud β†’ Storage Volume β”‚ β”œβ†’ PostgreSQL (metadata) β””β†’ Redis (cache) ``` ### Document Editing with OnlyOffice ``` User β†’ Caddy β†’ Nextcloud β†’ Caddy β†’ OnlyOffice β”‚ β”‚ ↓ ↓ PostgreSQL Document (metadata) Processing β”‚ β”‚ ↓ ↓ Nextcloud ←───────── OnlyOffice β”‚ ↓ Storage Volume ``` ### Watchtower Auto-Update ``` Watchtower (cron: every 24h) β”‚ β”‚ Check Docker Hub for new images ↓ New image available? β”‚ β”œβ”€ NO β†’ Sleep β”‚ β”œβ”€ YES β†’ Check container labels β”‚ β”œβ”€ "enable=false" β†’ Skip β”œβ”€ "enable=true" β†’ Pull & Update └─ "monitor-only=true" β†’ Notify ``` --- ## πŸ” Security Boundaries ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ INTERNET (Untrusted) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ UFW Firewall β”‚ ← Layer 1: Host Firewall β”‚ 22, 80, 443 β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ fail2ban β”‚ ← Layer 2: Intrusion Detection β”‚ SSH Protection β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Caddy (HTTPS) β”‚ ← Layer 3: TLS Termination β”‚ SSL Validation β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β” β”‚ Public β”‚ β”‚Tailscaleβ”‚ β”‚ Docker β”‚ ← Layer 4: Network β”‚Servicesβ”‚ β”‚ Check β”‚ β”‚ Network β”‚ Isolation β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β” β”‚ Admin β”‚ ← Layer 5: Admin Access β”‚ Servicesβ”‚ (Tailscale VPN only) β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸ—„οΈ Data Persistence ### Docker Volumes ``` Host Filesystem β”‚ β”œβ”€β”€ /var/lib/docker/volumes/ β”‚ β”œβ”€β”€ nextcloud_pg_data/ ← PostgreSQL database β”‚ β”œβ”€β”€ nextcloud_redis_data/ ← Redis cache β”‚ β”œβ”€β”€ nextcloud_nextcloud_data/ ← Nextcloud files β”‚ β”œβ”€β”€ nextcloud_nextcloud_apps/ ← Nextcloud apps β”‚ β”œβ”€β”€ nextcloud_onlyoffice_data/ ← OnlyOffice docs β”‚ β”œβ”€β”€ nextcloud_caddy_data/ ← SSL certificates β”‚ β”œβ”€β”€ nextcloud_caddy_config/ ← Caddy config β”‚ β”œβ”€β”€ nextcloud_dockhand_data/ ← Dockhand settings β”‚ └── nextcloud_uptime_kuma_data/ ← Uptime Kuma data β”‚ └── /opt/nextcloud-stack/ β”œβ”€β”€ configs/ β”‚ β”œβ”€β”€ caddy/Caddyfile β”‚ └── nextcloud/ β”œβ”€β”€ data/ β”‚ β”œβ”€β”€ homarr/ β”‚ └── obsidian/ └── backups/ β”œβ”€β”€ database/ └── volumes/ ``` --- ## πŸ”„ Update Mechanism ### Watchtower Label-Based Control ```yaml # Auto-update allowed labels: - "com.centurylinklabs.watchtower.enable=true" β†’ Caddy, Excalidraw, Obsidian, Homarr, Dockhand, Uptime Kuma # Monitor only (notify, no update) labels: - "com.centurylinklabs.watchtower.monitor-only=true" β†’ OnlyOffice # Never auto-update (manual only) labels: - "com.centurylinklabs.watchtower.enable=false" β†’ Nextcloud, PostgreSQL, Redis ``` --- ## πŸ“‘ Monitoring Architecture ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Uptime Kuma β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ HTTP Monitors (every 60s) β”‚ β”‚ β”‚ β”‚ β€’ https://cloud.yourdomain.com/status.php β”‚ β”‚ β”‚ β”‚ β€’ https://office.yourdomain.com/health β”‚ β”‚ β”‚ β”‚ β€’ https://draw.yourdomain.com β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ TCP Port Monitors β”‚ β”‚ β”‚ β”‚ β€’ next-db:5432 (PostgreSQL) β”‚ β”‚ β”‚ β”‚ β€’ next-redis:6379 (Redis) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ SSL Certificate Monitor β”‚ β”‚ β”‚ β”‚ β€’ Expiry check (30-day warning) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Notifications β”‚ β”‚ β”‚ β”‚ β€’ Email alerts β”‚ β”‚ β”‚ β”‚ β€’ Slack/Discord webhooks (optional) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## 🎯 Service Dependencies ``` Nextcloud β”‚ β”œβ”€ requires β†’ PostgreSQL (healthy) β”œβ”€ requires β†’ Redis (healthy) └─ requires β†’ Caddy (for external access) OnlyOffice β”‚ └─ requires β†’ Caddy (for external access) Homarr, Dockhand β”‚ β”œβ”€ requires β†’ Docker Socket (read-only) └─ requires β†’ Caddy (for Tailscale access) Watchtower β”‚ └─ requires β†’ Docker Socket (read-write) All Services β”‚ └─ network β†’ nextcloud_network ``` --- ## 🌟 Architecture Benefits ### High Availability Features - **Health checks**: Containers auto-restart on failure - **Database connection pooling**: Redis caching reduces DB load - **SSL auto-renewal**: Caddy handles certificate lifecycle ### Security Layers 1. **Network**: UFW firewall + fail2ban 2. **Transport**: TLS/SSL via Caddy 3. **Access**: Tailscale VPN for admin interfaces 4. **Secrets**: Ansible Vault encryption 5. **Isolation**: Docker network segmentation ### Scalability Points - **Database**: Can migrate to external PostgreSQL - **Cache**: Redis can be scaled/clustered - **Storage**: Volumes can be moved to network storage - **Reverse Proxy**: Caddy can be load-balanced --- **This architecture provides a secure, maintainable, and production-ready self-hosted cloud platform.**