diff --git a/docs/architecture-overview.md b/docs/architecture-overview.md index d0da03f..54a8491 100644 --- a/docs/architecture-overview.md +++ b/docs/architecture-overview.md @@ -6,8 +6,8 @@ ## Dependency graph ```mermaid -flowchart TD - Internet(["Internet"]) --> Edge["Edge Firewall
NAT · public reverse proxy · NTP · DHCP"] +flowchart LR + Internet(["Internet"]) --> Edge["Edge Firewall"] Edge --> LAN["LAN"] LAN --> DNS["Internal DNS"] @@ -15,44 +15,46 @@ flowchart TD DNS --> Vault Vault --> Apps["App Host
~40 stacks"] + Vault --> Automation["Automation Host"] LAN --> FileServer["File Server"] DNS --> FileServer - Vault --> Automation["Automation Host"] LAN --> Automation - Apps --> InternalProxy["Internal reverse-proxy zone"] + Apps --> InternalProxy["Internal Proxy Zone"] Apps --> SSO["SSO"] + Automation --> GitHost["Git Hosting"] - Automation --> Gitea["Git hosting
internal + public mirror"] - - Vault --> EdgeProxy["User-facing reverse proxy
mTLS"] + Vault --> EdgeProxy["User-Facing Proxy
mTLS"] DNS --> EdgeProxy - Apps -.proxied by.-> EdgeProxy - SSO -.auth gate via.-> EdgeProxy + Apps -.proxied.-> EdgeProxy + SSO -.auth.-> 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 -.-> Monitoring["Monitoring"] + Automation -.-> Monitoring + FileServer -.-> Monitoring + Vault -.-> Monitoring + DNS -.-> Monitoring + EdgeProxy -.-> 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 + Apps -.-> SecMon["Security Monitoring"] + Automation -.-> SecMon + FileServer -.-> SecMon + Vault -.-> SecMon + DNS -.-> SecMon + EdgeProxy -.-> SecMon ``` +> [!TIP] +> Solid arrows are real dependencies — the target has to be reachable and healthy for the source to function. Dotted arrows into Monitoring and Security Monitoring are the one exception: every host reports telemetry to both, but per the Observability Independence Law below, that reporting is asynchronous and non-blocking — nothing here actually depends on Monitoring or Security Monitoring being up. The line style carries that distinction instead of repeating "reports to" twelve times. Full detail on what's actually collected: [`docs/observability.md`](observability.md) and [`docs/security-monitoring.md`](security-monitoring.md). + ## Four trust boundaries, not two ```mermaid flowchart LR - WAN["WAN"] -->|public application boundary| EdgeFW["Edge Firewall / public proxy"] + WAN["WAN"] -->|public| 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"] + Service["App-to-app"] -->|allowlist + SSO| InternalProxy["Internal proxy"] + Infra["LAN infra-to-infra"] -->|per-flow rule| HostFW["Host firewall"] ``` Backend services trust proxy headers, not raw client IP, on every path.