digraph PhysicalTopology { graph [rankdir=LR, compound=true, splines=polyline, nodesep=0.7, ranksep=1.2, fontname="Helvetica", concentrate=true]; node [fontname="Helvetica", fontsize=10, style="rounded,filled", fillcolor="#ffffff"]; edge [fontname="Helvetica", fontsize=9, color="#64748b"]; subgraph "cluster_docker" { label="docker host"; style="rounded,filled"; color="#93c5fd"; fillcolor="#eff6ff"; subgraph "cluster_docker_apps" { label="apps"; style="rounded,dashed"; color="#bfdbfe"; fillcolor="#f8fbff"; "svc:crowdsec" [label="crowdsec", shape=box, fillcolor="#dcfce7"]; "svc:docker-update-exporter" [label="docker-update-exporter", shape=box, fillcolor="#dcfce7"]; "svc:error-pages" [label="error-pages", shape=box, fillcolor="#dcfce7"]; "svc:gitea" [label="gitea", shape=box, fillcolor="#dcfce7"]; "svc:gotify" [label="gotify", shape=box, fillcolor="#dcfce7"]; "svc:grampsweb" [label="grampsweb", shape=box, fillcolor="#dcfce7"]; "svc:grampsweb_celery" [label="grampsweb_celery", shape=box, fillcolor="#dcfce7"]; "svc:monitor-kuma" [label="monitor-kuma", shape=box, fillcolor="#dcfce7"]; "svc:mtls-bridge" [label="mtls-bridge", shape=box, fillcolor="#dcfce7"]; "svc:nextcloud-webapp" [label="nextcloud-webapp", shape=box, fillcolor="#dcfce7"]; "svc:node-red" [label="node-red", shape=box, fillcolor="#dcfce7"]; "svc:passbolt-webapp" [label="passbolt-webapp", shape=box, fillcolor="#dcfce7"]; "svc:portainer" [label="portainer", shape=box, fillcolor="#dcfce7"]; "svc:searxng-webapp" [label="searxng-webapp", shape=box, fillcolor="#dcfce7"]; "svc:shift-recorder-web" [label="shift-recorder-web", shape=box, fillcolor="#dcfce7"]; "svc:stockfill" [label="stockfill", shape=box, fillcolor="#dcfce7"]; "svc:telegraf" [label="telegraf", shape=box, fillcolor="#dcfce7"]; } subgraph "cluster_docker_automation" { label="automation"; style="rounded,dashed"; color="#bfdbfe"; fillcolor="#f8fbff"; "svc:gitea-runner" [label="gitea-runner", shape=box, fillcolor="#dcfce7"]; } subgraph "cluster_docker_edge_proxy_auth" { label="edge/proxy/auth"; style="rounded,dashed"; color="#bfdbfe"; fillcolor="#f8fbff"; "svc:authelia" [label="authelia", shape=box, fillcolor="#dcfce7"]; "svc:docker-socket-proxy" [label="docker-socket-proxy", shape=box, fillcolor="#dcfce7"]; "svc:traefik" [label="traefik", shape=box, fillcolor="#dcfce7"]; } subgraph "cluster_docker_monitoring" { label="monitoring"; style="rounded,dashed"; color="#bfdbfe"; fillcolor="#f8fbff"; "svc:grafana" [label="grafana", shape=box, fillcolor="#dcfce7"]; "svc:node-exporter" [label="node-exporter", shape=box, fillcolor="#dcfce7"]; "svc:prometheus" [label="prometheus", shape=box, fillcolor="#dcfce7"]; } subgraph "cluster_docker_storage_database_support" { label="storage/database/support"; style="rounded,dashed"; color="#bfdbfe"; fillcolor="#f8fbff"; "svc:gramps-redis" [label="gramps-redis", shape=box, fillcolor="#dcfce7"]; "svc:influxdb" [label="influxdb", shape=box, fillcolor="#dcfce7"]; "svc:nextcloud-db" [label="nextcloud-db", shape=box, fillcolor="#dcfce7"]; "svc:nextcloud-redis" [label="nextcloud-redis", shape=box, fillcolor="#dcfce7"]; "svc:passbolt-db" [label="passbolt-db", shape=box, fillcolor="#dcfce7"]; } } subgraph "cluster_raspberrypi" { label="raspberrypi host"; style="rounded,filled"; color="#93c5fd"; fillcolor="#eff6ff"; subgraph "cluster_raspberrypi_apps" { label="apps"; style="rounded,dashed"; color="#bfdbfe"; fillcolor="#f8fbff"; "svc:pihole-exporter" [label="pihole-exporter", shape=box, fillcolor="#dcfce7"]; } } subgraph "cluster_legend" { label="Legend"; style="rounded"; color="#d1d5db"; "leg_host" [label="Host cluster", shape=box3d, fillcolor="#eff6ff"]; "leg_cat" [label="Service category", shape=folder, fillcolor="#f8fbff"]; "leg_svc" [label="Container/service", shape=box, fillcolor="#dcfce7"]; "leg_host" -> "leg_cat" [style=dashed]; "leg_cat" -> "leg_svc" [style=dashed]; } }