# ๐ 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)