# ๐Ÿ“ Architecture Overview > [!NOTE] > The stable, directional laws governing how traffic moves through the fleet โ€” re-verified against live infrastructure, not assumed from older documentation. Two real corrections were caught and fixed the last time this was checked, which is exactly the point of re-verifying rather than trusting a prior write-up forever. ## Dependency graph ```mermaid flowchart TD Internet(["Internet"]) --> Edge["Edge Firewall
NAT ยท public reverse proxy ยท NTP ยท DHCP"] Edge --> LAN["LAN"] LAN --> DNS["Internal DNS"] LAN --> Vault["Vault"] DNS --> Vault Vault --> Apps["App Host
~40 stacks"] LAN --> FileServer["File Server"] DNS --> FileServer Vault --> Automation["Automation Host"] LAN --> Automation Apps --> InternalProxy["Internal reverse-proxy zone"] Apps --> SSO["SSO"] Automation --> Gitea["Git hosting
internal + public mirror"] Vault --> EdgeProxy["User-facing reverse proxy
mTLS"] DNS --> EdgeProxy Apps -.proxied by.-> EdgeProxy SSO -.auth gate via.-> EdgeProxy Apps -.reports to.-> Monitoring["Monitoring"] Automation -.reports to.-> Monitoring FileServer -.reports to.-> Monitoring EdgeProxy -.reports to.-> Monitoring Vault -.reports to.-> Monitoring DNS -.reports to.-> Monitoring Apps -.reports to.-> Wazuh["Security Monitoring"] Automation -.reports to.-> Wazuh FileServer -.reports to.-> Wazuh EdgeProxy -.reports to.-> Wazuh Vault -.reports to.-> Wazuh DNS -.reports to.-> Wazuh ``` ## Four trust boundaries, not two ```mermaid flowchart LR WAN["WAN"] -->|public application boundary| EdgeFW["Edge Firewall / public proxy"] Browser["LAN browsers"] -->|mTLS + SSO| UserProxy["User-facing proxy"] Service["App-to-app"] -->|IP-allowlist + SSO| InternalProxy["Internal proxy"] Infra["LAN infra-to-infra"] -->|explicit per-flow rules| HostFW["Host firewall rules"] ``` Backend services trust proxy headers, not raw client IP, on every path. ## Two structurally independent traffic planes | Plane | Path | |---|---| | **Ingress โ€” public** | Client โ†’ edge firewall/proxy โ†’ backend | | **Ingress โ€” LAN-facing** | Client โ†’ user-facing proxy (mTLS) โ†’ backend | | **East-west โ€” app-to-app** | Service โ†’ internal proxy zone โ†’ service | | **East-west โ€” infra-to-infra** | Service โ†’ firewall rule โ†’ service, direct, no proxy | > [!IMPORTANT] > **Observability sits outside every request path on purpose.** Logs and metrics push asynchronously to monitoring infrastructure; nothing in that pipeline is inline with application traffic, and application services don't depend on monitoring availability. If monitoring goes down, collection stops โ€” nothing else does. ## Caught by re-verification, not assumed > [!WARNING] > The last full re-check against live infrastructure found two real corrections to what was previously documented: the public reverse-proxy layer had actually moved from running as its own dedicated VM to running as a package directly on the edge firewall โ€” and an older "flat mesh network, no mutual TLS" model for internal service traffic had been fully replaced by the two-zone split described in [`docs/dns-naming.md`](dns-naming.md), without the architecture documentation being updated to match at the time. Both were caught by running real commands against the live fleet, not by re-reading the previous version and assuming it still held. ## What this map deliberately excludes Not a firewall rule listing, not a port inventory, not a service configuration reference โ€” those live in their own docs ([`docs/firewall-and-network.md`](firewall-and-network.md) and elsewhere). This is strictly the stable, directional shape of how trust and traffic actually move. --- Related: [`docs/firewall-and-network.md`](firewall-and-network.md), [`docs/dns-naming.md`](dns-naming.md)