Improve docs pipeline with generated topology diagrams

This commit is contained in:
beatz174-bit
2026-05-13 09:08:47 +10:00
parent 22b3659cdf
commit 9d79f828e4
18 changed files with 7690 additions and 110 deletions
+18 -2
View File
@@ -2,21 +2,37 @@
## Local generation
Install prerequisites:
```bash
sudo apt-get update
sudo apt-get install -y graphviz
```
Then generate and validate public docs:
```bash
chmod +x scripts/docs/*.sh
scripts/docs/generate-all.sh
python3 -m mkdocs build -f mkdocs-public.yml --strict
```
NixOS-friendly alternative:
```bash
nix shell nixpkgs#graphviz nixpkgs#python3 nixpkgs#python3Packages.pyyaml
```
This pipeline only runs `docker compose config` and static parsing. It does **not** start containers.
## CI behaviour
GitHub Actions workflow `.github/workflows/generate-docs.yml` runs on pushes/PRs to `main` and manual dispatch. It generates docs and uploads them as the `generated-documentation` artifact.
GitHub Actions workflow `.github/workflows/generate-docs.yml` validates committed public docs and diagrams and runs a strict public MkDocs build.
## Outputs
- `docs/generated`: resolved compose config and markdown inventories
- `docs/diagrams`: DOT and SVG architecture diagram
- `docs/diagrams`: generated DOT and SVG diagrams
- `docs/public`: sanitized copy for public sharing
## Publication safety
+240 -78
View File
@@ -1,79 +1,241 @@
digraph Compose {
rankdir=LR;
node [fontname=Helvetica];
"svc:authelia" [label="authelia", shape=box, style=filled, fillcolor="#dfefff"];
"svc:crowdsec" [label="crowdsec", shape=box, style=filled, fillcolor="#dfefff"];
"svc:docker-socket-proxy" [label="docker-socket-proxy", shape=box, style=filled, fillcolor="#dfefff"];
"svc:docker-update-exporter" [label="docker-update-exporter", shape=box, style=filled, fillcolor="#dfefff"];
"svc:error-pages" [label="error-pages", shape=box, style=filled, fillcolor="#dfefff"];
"svc:gitea" [label="gitea", shape=box, style=filled, fillcolor="#dfefff"];
"svc:gitea-runner" [label="gitea-runner", shape=box, style=filled, fillcolor="#dfefff"];
"svc:gotify" [label="gotify", shape=box, style=filled, fillcolor="#dfefff"];
"svc:grafana" [label="grafana", shape=box, style=filled, fillcolor="#dfefff"];
"svc:gramps-redis" [label="gramps-redis", shape=box, style=filled, fillcolor="#dfefff"];
"svc:grampsweb" [label="grampsweb", shape=box, style=filled, fillcolor="#dfefff"];
"svc:grampsweb_celery" [label="grampsweb_celery", shape=box, style=filled, fillcolor="#dfefff"];
"svc:influxdb" [label="influxdb", shape=box, style=filled, fillcolor="#dfefff"];
"svc:monitor-kuma" [label="monitor-kuma", shape=box, style=filled, fillcolor="#dfefff"];
"svc:mtls-bridge" [label="mtls-bridge", shape=box, style=filled, fillcolor="#dfefff"];
"svc:nextcloud-db" [label="nextcloud-db", shape=box, style=filled, fillcolor="#dfefff"];
"svc:nextcloud-redis" [label="nextcloud-redis", shape=box, style=filled, fillcolor="#dfefff"];
"svc:nextcloud-webapp" [label="nextcloud-webapp", shape=box, style=filled, fillcolor="#dfefff"];
"svc:node-exporter" [label="node-exporter", shape=box, style=filled, fillcolor="#dfefff"];
"svc:node-red" [label="node-red", shape=box, style=filled, fillcolor="#dfefff"];
"svc:passbolt-db" [label="passbolt-db", shape=box, style=filled, fillcolor="#dfefff"];
"svc:passbolt-webapp" [label="passbolt-webapp", shape=box, style=filled, fillcolor="#dfefff"];
"svc:pihole-exporter" [label="pihole-exporter", shape=box, style=filled, fillcolor="#dfefff"];
"svc:portainer" [label="portainer", shape=box, style=filled, fillcolor="#dfefff"];
"svc:prometheus" [label="prometheus", shape=box, style=filled, fillcolor="#dfefff"];
"svc:searxng-webapp" [label="searxng-webapp", shape=box, style=filled, fillcolor="#dfefff"];
"svc:shift-recorder-web" [label="shift-recorder-web", shape=box, style=filled, fillcolor="#dfefff"];
"svc:stockfill" [label="stockfill", shape=box, style=filled, fillcolor="#dfefff"];
"svc:telegraf" [label="telegraf", shape=box, style=filled, fillcolor="#dfefff"];
"svc:traefik" [label="traefik", shape=box, style=filled, fillcolor="#dfefff"];
"net:gramps" [label="gramps", shape=ellipse, style=filled, fillcolor="#f4f4f4"];
"net:monitor" [label="monitor", shape=ellipse, style=filled, fillcolor="#f4f4f4"];
"net:nextcloud" [label="nextcloud", shape=ellipse, style=filled, fillcolor="#f4f4f4"];
"net:passbolt" [label="passbolt", shape=ellipse, style=filled, fillcolor="#f4f4f4"];
"net:traefik" [label="traefik", shape=ellipse, style=filled, fillcolor="#f4f4f4"];
"svc:authelia" -> "net:traefik";
"svc:crowdsec" -> "net:traefik";
"svc:docker-socket-proxy" -> "net:monitor";
"svc:docker-socket-proxy" -> "net:traefik";
"svc:docker-update-exporter" -> "net:monitor";
"svc:error-pages" -> "net:traefik";
"svc:gitea" -> "net:traefik";
"svc:gitea-runner" -> "net:traefik";
"svc:gotify" -> "net:traefik";
"svc:grafana" -> "net:monitor";
"svc:grafana" -> "net:traefik";
"svc:gramps-redis" -> "net:gramps";
"svc:grampsweb" -> "net:gramps";
"svc:grampsweb" -> "net:traefik";
"svc:grampsweb_celery" -> "net:gramps";
"svc:influxdb" -> "net:monitor";
"svc:influxdb" -> "net:traefik";
"svc:monitor-kuma" -> "net:monitor";
"svc:monitor-kuma" -> "net:traefik";
"svc:mtls-bridge" -> "net:monitor";
"svc:mtls-bridge" -> "net:traefik";
"svc:nextcloud-db" -> "net:nextcloud";
"svc:nextcloud-redis" -> "net:nextcloud";
"svc:nextcloud-webapp" -> "net:nextcloud";
"svc:nextcloud-webapp" -> "net:traefik";
"svc:node-exporter" -> "net:monitor";
"svc:node-red" -> "net:monitor";
"svc:node-red" -> "net:traefik";
"svc:passbolt-db" -> "net:passbolt";
"svc:passbolt-webapp" -> "net:passbolt";
"svc:passbolt-webapp" -> "net:traefik";
"svc:pihole-exporter" -> "net:monitor";
"svc:portainer" -> "net:traefik";
"svc:prometheus" -> "net:monitor";
"svc:prometheus" -> "net:traefik";
"svc:searxng-webapp" -> "net:traefik";
"svc:shift-recorder-web" -> "net:traefik";
"svc:stockfill" -> "net:traefik";
"svc:telegraf" -> "net:monitor";
"svc:traefik" -> "net:traefik";
digraph DockerTraefikDynu {
graph [rankdir=LR, compound=true, splines=ortho, nodesep=0.5, ranksep=1.0, fontname="Helvetica"];
node [fontname="Helvetica", fontsize=10, style="rounded,filled"];
edge [fontname="Helvetica", fontsize=9];
"ext:dynu" [label="Dynu / Public DNS", shape=oval, fillcolor="#fde68a"];
"svc:traefik" [label="traefik", shape=box, fillcolor="#bfdbfe"];
"net:gramps" [label="gramps", shape=ellipse, fillcolor="#f3f4f6"];
"net:monitor" [label="monitor", shape=ellipse, fillcolor="#f3f4f6"];
"net:nextcloud" [label="nextcloud", shape=ellipse, fillcolor="#f3f4f6"];
"net:passbolt" [label="passbolt", shape=ellipse, fillcolor="#f3f4f6"];
"net:traefik" [label="traefik", shape=ellipse, fillcolor="#f3f4f6"];
"svc:authelia" [label="authelia", shape=box, fillcolor="#dcfce7"];
"svc:authelia" -> "net:traefik" [color="#6b7280"];
"router:authelia" [label="router:authelia\nentry:websecure tls:true", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:authelia";
"router:authelia" -> "svc:authelia" [label="service:authelia"];
"dns:service-1.<internal-domain>" [label="service-1.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-1.<internal-domain>";
"dns:service-1.<internal-domain>" -> "router:authelia";
"svc:crowdsec" [label="crowdsec", shape=box, fillcolor="#dcfce7"];
"svc:crowdsec" -> "net:traefik" [color="#6b7280"];
"svc:docker-socket-proxy" [label="docker-socket-proxy", shape=box, fillcolor="#dcfce7"];
"svc:docker-socket-proxy" -> "net:monitor" [color="#6b7280"];
"svc:docker-socket-proxy" -> "net:traefik" [color="#6b7280"];
"svc:docker-update-exporter" [label="docker-update-exporter", shape=box, fillcolor="#dcfce7"];
"svc:docker-update-exporter" -> "net:monitor" [color="#6b7280"];
"svc:error-pages" [label="error-pages", shape=box, fillcolor="#dcfce7"];
"svc:error-pages" -> "net:traefik" [color="#6b7280"];
"router:error-pages-router" [label="router:error-pages-router\nentry:web tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:error-pages-router";
"router:error-pages-router" -> "svc:error-pages" [label="service:error-pages"];
"mw:error-pages-middleware" [label="error-pages-middleware", shape=hexagon, fillcolor="#ddd6fe"];
"router:error-pages-router" -> "mw:error-pages-middleware" [style=dashed];
"lb:error-pages:error-pages-service" [label="lb:error-pages-service\nport:8080", shape=component, fillcolor="#fecaca"];
"lb:error-pages:error-pages-service" -> "svc:error-pages";
"svc:gitea" [label="gitea", shape=box, fillcolor="#dcfce7"];
"svc:gitea" -> "net:traefik" [color="#6b7280"];
"router:gitea" [label="router:gitea\nentry:websecure tls:true", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:gitea";
"router:gitea" -> "svc:gitea" [label="service:gitea"];
"dns:service-2.<internal-domain>" [label="service-2.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-2.<internal-domain>";
"dns:service-2.<internal-domain>" -> "router:gitea";
"lb:gitea:gitea" [label="lb:gitea\nport:3000", shape=component, fillcolor="#fecaca"];
"lb:gitea:gitea" -> "svc:gitea";
"svc:gitea-runner" [label="gitea-runner", shape=box, fillcolor="#dcfce7"];
"svc:gitea-runner" -> "net:traefik" [color="#6b7280"];
"svc:gotify" [label="gotify", shape=box, fillcolor="#dcfce7"];
"svc:gotify" -> "net:traefik" [color="#6b7280"];
"router:gotify" [label="router:gotify\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:gotify";
"router:gotify" -> "svc:gotify" [label="service:gotify"];
"dns:service-3.<internal-domain>" [label="service-3.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-3.<internal-domain>";
"dns:service-3.<internal-domain>" -> "router:gotify";
"lb:gotify:gotify" [label="lb:gotify\nport:80", shape=component, fillcolor="#fecaca"];
"lb:gotify:gotify" -> "svc:gotify";
"svc:grafana" [label="grafana", shape=box, fillcolor="#dcfce7"];
"svc:grafana" -> "net:monitor" [color="#6b7280"];
"svc:grafana" -> "net:traefik" [color="#6b7280"];
"router:grafana" [label="router:grafana\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:grafana";
"router:grafana" -> "svc:grafana" [label="service:grafana"];
"dns:service-4.<internal-domain>" [label="service-4.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-4.<internal-domain>";
"dns:service-4.<internal-domain>" -> "router:grafana";
"lb:grafana:grafana" [label="lb:grafana\nport:3000", shape=component, fillcolor="#fecaca"];
"lb:grafana:grafana" -> "svc:grafana";
"svc:gramps-redis" [label="gramps-redis", shape=box, fillcolor="#dcfce7"];
"svc:gramps-redis" -> "net:gramps" [color="#6b7280"];
"svc:grampsweb" [label="grampsweb", shape=box, fillcolor="#dcfce7"];
"svc:grampsweb" -> "net:gramps" [color="#6b7280"];
"svc:grampsweb" -> "net:traefik" [color="#6b7280"];
"router:gramps" [label="router:gramps\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:gramps";
"router:gramps" -> "svc:grampsweb" [label="service:grampsweb"];
"dns:service-5.<internal-domain>" [label="service-5.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-5.<internal-domain>";
"dns:service-5.<internal-domain>" -> "router:gramps";
"lb:grampsweb:gramps" [label="lb:gramps\nport:5000", shape=component, fillcolor="#fecaca"];
"lb:grampsweb:gramps" -> "svc:grampsweb";
"svc:grampsweb_celery" [label="grampsweb_celery", shape=box, fillcolor="#dcfce7"];
"svc:grampsweb_celery" -> "net:gramps" [color="#6b7280"];
"svc:influxdb" [label="influxdb", shape=box, fillcolor="#dcfce7"];
"svc:influxdb" -> "net:monitor" [color="#6b7280"];
"svc:influxdb" -> "net:traefik" [color="#6b7280"];
"router:influxdb" [label="router:influxdb\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:influxdb";
"router:influxdb" -> "svc:influxdb" [label="service:influxdb"];
"dns:service-6.<internal-domain>" [label="service-6.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-6.<internal-domain>";
"dns:service-6.<internal-domain>" -> "router:influxdb";
"mw:authelia" [label="authelia", shape=hexagon, fillcolor="#ddd6fe"];
"router:influxdb" -> "mw:authelia" [style=dashed];
"lb:influxdb:influxdb" [label="lb:influxdb\nport:8086", shape=component, fillcolor="#fecaca"];
"lb:influxdb:influxdb" -> "svc:influxdb";
"svc:monitor-kuma" [label="monitor-kuma", shape=box, fillcolor="#dcfce7"];
"svc:monitor-kuma" -> "net:monitor" [color="#6b7280"];
"svc:monitor-kuma" -> "net:traefik" [color="#6b7280"];
"router:monitor" [label="router:monitor\nentry:websecure tls:true", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:monitor";
"router:monitor" -> "svc:monitor-kuma" [label="service:monitor-kuma"];
"dns:service-7.<internal-domain>" [label="service-7.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-7.<internal-domain>";
"dns:service-7.<internal-domain>" -> "router:monitor";
"lb:monitor-kuma:monitor" [label="lb:monitor\nport:3001", shape=component, fillcolor="#fecaca"];
"lb:monitor-kuma:monitor" -> "svc:monitor-kuma";
"svc:mtls-bridge" [label="mtls-bridge", shape=box, fillcolor="#dcfce7"];
"svc:mtls-bridge" -> "net:monitor" [color="#6b7280"];
"svc:mtls-bridge" -> "net:traefik" [color="#6b7280"];
"router:mtls-bridge" [label="router:mtls-bridge\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:mtls-bridge";
"router:mtls-bridge" -> "svc:mtls-bridge" [label="service:mtls-bridge"];
"dns:service-8.<internal-domain>" [label="service-8.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-8.<internal-domain>";
"dns:service-8.<internal-domain>" -> "router:mtls-bridge";
"mw:mtls-bridge-auth" [label="mtls-bridge-auth", shape=hexagon, fillcolor="#ddd6fe"];
"router:mtls-bridge" -> "mw:mtls-bridge-auth" [style=dashed];
"mw:mtls-bridge-cors" [label="mtls-bridge-cors", shape=hexagon, fillcolor="#ddd6fe"];
"router:mtls-bridge" -> "mw:mtls-bridge-cors" [style=dashed];
"router:mtls-bridge-preflight" [label="router:mtls-bridge-preflight\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:mtls-bridge-preflight";
"router:mtls-bridge-preflight" -> "svc:mtls-bridge" [label="service:mtls-bridge"];
"dns:service-8.<internal-domain>" [label="service-8.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-8.<internal-domain>";
"dns:service-8.<internal-domain>" -> "router:mtls-bridge-preflight";
"mw:mtls-bridge-cors" [label="mtls-bridge-cors", shape=hexagon, fillcolor="#ddd6fe"];
"router:mtls-bridge-preflight" -> "mw:mtls-bridge-cors" [style=dashed];
"lb:mtls-bridge:mtls-bridge" [label="lb:mtls-bridge\nport:8080", shape=component, fillcolor="#fecaca"];
"lb:mtls-bridge:mtls-bridge" -> "svc:mtls-bridge";
"svc:nextcloud-db" [label="nextcloud-db", shape=box, fillcolor="#dcfce7"];
"svc:nextcloud-db" -> "net:nextcloud" [color="#6b7280"];
"svc:nextcloud-redis" [label="nextcloud-redis", shape=box, fillcolor="#dcfce7"];
"svc:nextcloud-redis" -> "net:nextcloud" [color="#6b7280"];
"svc:nextcloud-webapp" [label="nextcloud-webapp", shape=box, fillcolor="#dcfce7"];
"svc:nextcloud-webapp" -> "net:nextcloud" [color="#6b7280"];
"svc:nextcloud-webapp" -> "net:traefik" [color="#6b7280"];
"router:nextcloud" [label="router:nextcloud\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:nextcloud";
"router:nextcloud" -> "svc:nextcloud-webapp" [label="service:nextcloud-webapp"];
"dns:service-9.<internal-domain>" [label="service-9.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-9.<internal-domain>";
"dns:service-9.<internal-domain>" -> "router:nextcloud";
"mw:nextcloud-dav" [label="nextcloud-dav", shape=hexagon, fillcolor="#ddd6fe"];
"router:nextcloud" -> "mw:nextcloud-dav" [style=dashed];
"mw:nextcloud-webfinger" [label="nextcloud-webfinger", shape=hexagon, fillcolor="#ddd6fe"];
"router:nextcloud" -> "mw:nextcloud-webfinger" [style=dashed];
"svc:node-exporter" [label="node-exporter", shape=box, fillcolor="#dcfce7"];
"svc:node-exporter" -> "net:monitor" [color="#6b7280"];
"svc:node-red" [label="node-red", shape=box, fillcolor="#dcfce7"];
"svc:node-red" -> "net:monitor" [color="#6b7280"];
"svc:node-red" -> "net:traefik" [color="#6b7280"];
"router:node-red" [label="router:node-red\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:node-red";
"router:node-red" -> "svc:node-red" [label="service:node-red"];
"dns:service-10.<internal-domain>" [label="service-10.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-10.<internal-domain>";
"dns:service-10.<internal-domain>" -> "router:node-red";
"mw:authelia" [label="authelia", shape=hexagon, fillcolor="#ddd6fe"];
"router:node-red" -> "mw:authelia" [style=dashed];
"lb:node-red:node-red" [label="lb:node-red\nport:1880", shape=component, fillcolor="#fecaca"];
"lb:node-red:node-red" -> "svc:node-red";
"svc:passbolt-db" [label="passbolt-db", shape=box, fillcolor="#dcfce7"];
"svc:passbolt-db" -> "net:passbolt" [color="#6b7280"];
"svc:passbolt-webapp" [label="passbolt-webapp", shape=box, fillcolor="#dcfce7"];
"svc:passbolt-webapp" -> "net:passbolt" [color="#6b7280"];
"svc:passbolt-webapp" -> "net:traefik" [color="#6b7280"];
"router:passbolt" [label="router:passbolt\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:passbolt";
"router:passbolt" -> "svc:passbolt-webapp" [label="service:passbolt-webapp"];
"dns:service-11.<internal-domain>" [label="service-11.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-11.<internal-domain>";
"dns:service-11.<internal-domain>" -> "router:passbolt";
"svc:pihole-exporter" [label="pihole-exporter", shape=box, fillcolor="#dcfce7"];
"svc:pihole-exporter" -> "net:monitor" [color="#6b7280"];
"svc:portainer" [label="portainer", shape=box, fillcolor="#dcfce7"];
"svc:portainer" -> "net:traefik" [color="#6b7280"];
"router:portainer" [label="router:portainer\nentry:websecure tls:true", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:portainer";
"router:portainer" -> "svc:portainer" [label="service:portainer"];
"dns:service-12.<internal-domain>" [label="service-12.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-12.<internal-domain>";
"dns:service-12.<internal-domain>" -> "router:portainer";
"lb:portainer:portainer" [label="lb:portainer\nport:9000", shape=component, fillcolor="#fecaca"];
"lb:portainer:portainer" -> "svc:portainer";
"svc:prometheus" [label="prometheus", shape=box, fillcolor="#dcfce7"];
"svc:prometheus" -> "net:monitor" [color="#6b7280"];
"svc:prometheus" -> "net:traefik" [color="#6b7280"];
"router:prometheus" [label="router:prometheus\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:prometheus";
"router:prometheus" -> "svc:prometheus" [label="service:prometheus"];
"dns:service-13.<internal-domain>" [label="service-13.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-13.<internal-domain>";
"dns:service-13.<internal-domain>" -> "router:prometheus";
"mw:authelia" [label="authelia", shape=hexagon, fillcolor="#ddd6fe"];
"router:prometheus" -> "mw:authelia" [style=dashed];
"lb:prometheus:prometheus" [label="lb:prometheus\nport:9090", shape=component, fillcolor="#fecaca"];
"lb:prometheus:prometheus" -> "svc:prometheus";
"svc:searxng-webapp" [label="searxng-webapp", shape=box, fillcolor="#dcfce7"];
"svc:searxng-webapp" -> "net:traefik" [color="#6b7280"];
"router:searxng" [label="router:searxng\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:searxng";
"router:searxng" -> "svc:searxng-webapp" [label="service:searxng-webapp"];
"dns:service-14.<internal-domain>" [label="service-14.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-14.<internal-domain>";
"dns:service-14.<internal-domain>" -> "router:searxng";
"lb:searxng-webapp:searxng" [label="lb:searxng\nport:8080", shape=component, fillcolor="#fecaca"];
"lb:searxng-webapp:searxng" -> "svc:searxng-webapp";
"svc:shift-recorder-web" [label="shift-recorder-web", shape=box, fillcolor="#dcfce7"];
"svc:shift-recorder-web" -> "net:traefik" [color="#6b7280"];
"router:shifts" [label="router:shifts\nentry:websecure tls:true", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:shifts";
"router:shifts" -> "svc:shift-recorder-web" [label="service:shift-recorder-web"];
"dns:service-15.<internal-domain>" [label="service-15.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-15.<internal-domain>";
"dns:service-15.<internal-domain>" -> "router:shifts";
"lb:shift-recorder-web:shifts" [label="lb:shifts\nport:80", shape=component, fillcolor="#fecaca"];
"lb:shift-recorder-web:shifts" -> "svc:shift-recorder-web";
"svc:stockfill" [label="stockfill", shape=box, fillcolor="#dcfce7"];
"svc:stockfill" -> "net:traefik" [color="#6b7280"];
"router:stockfill" [label="router:stockfill\nentry:websecure tls:true", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:stockfill";
"router:stockfill" -> "svc:stockfill" [label="service:stockfill"];
"dns:service-16.<internal-domain>" [label="service-16.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-16.<internal-domain>";
"dns:service-16.<internal-domain>" -> "router:stockfill";
"lb:stockfill:stockfill" [label="lb:stockfill\nport:80", shape=component, fillcolor="#fecaca"];
"lb:stockfill:stockfill" -> "svc:stockfill";
"svc:telegraf" [label="telegraf", shape=box, fillcolor="#dcfce7"];
"svc:telegraf" -> "net:monitor" [color="#6b7280"];
"svc:traefik" [label="traefik", shape=box, fillcolor="#dcfce7"];
"svc:traefik" -> "net:traefik" [color="#6b7280"];
"router:traefik" [label="router:traefik\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:traefik";
"router:traefik" -> "svc:traefik" [label="service:api@internal"];
"dns:service-17.<internal-domain>" [label="service-17.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-17.<internal-domain>";
"dns:service-17.<internal-domain>" -> "router:traefik";
"mw:authelia" [label="authelia", shape=hexagon, fillcolor="#ddd6fe"];
"router:traefik" -> "mw:authelia" [style=dashed];
}
File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 136 B

After

Width:  |  Height:  |  Size: 118 KiB

+241
View File
@@ -0,0 +1,241 @@
digraph DockerTraefikDynu {
graph [rankdir=LR, compound=true, splines=ortho, nodesep=0.5, ranksep=1.0, fontname="Helvetica"];
node [fontname="Helvetica", fontsize=10, style="rounded,filled"];
edge [fontname="Helvetica", fontsize=9];
"ext:dynu" [label="Dynu / Public DNS", shape=oval, fillcolor="#fde68a"];
"svc:traefik" [label="traefik", shape=box, fillcolor="#bfdbfe"];
"net:gramps" [label="gramps", shape=ellipse, fillcolor="#f3f4f6"];
"net:monitor" [label="monitor", shape=ellipse, fillcolor="#f3f4f6"];
"net:nextcloud" [label="nextcloud", shape=ellipse, fillcolor="#f3f4f6"];
"net:passbolt" [label="passbolt", shape=ellipse, fillcolor="#f3f4f6"];
"net:traefik" [label="traefik", shape=ellipse, fillcolor="#f3f4f6"];
"svc:authelia" [label="authelia", shape=box, fillcolor="#dcfce7"];
"svc:authelia" -> "net:traefik" [color="#6b7280"];
"router:authelia" [label="router:authelia\nentry:websecure tls:true", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:authelia";
"router:authelia" -> "svc:authelia" [label="service:authelia"];
"dns:service-1.<internal-domain>" [label="service-1.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-1.<internal-domain>";
"dns:service-1.<internal-domain>" -> "router:authelia";
"svc:crowdsec" [label="crowdsec", shape=box, fillcolor="#dcfce7"];
"svc:crowdsec" -> "net:traefik" [color="#6b7280"];
"svc:docker-socket-proxy" [label="docker-socket-proxy", shape=box, fillcolor="#dcfce7"];
"svc:docker-socket-proxy" -> "net:monitor" [color="#6b7280"];
"svc:docker-socket-proxy" -> "net:traefik" [color="#6b7280"];
"svc:docker-update-exporter" [label="docker-update-exporter", shape=box, fillcolor="#dcfce7"];
"svc:docker-update-exporter" -> "net:monitor" [color="#6b7280"];
"svc:error-pages" [label="error-pages", shape=box, fillcolor="#dcfce7"];
"svc:error-pages" -> "net:traefik" [color="#6b7280"];
"router:error-pages-router" [label="router:error-pages-router\nentry:web tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:error-pages-router";
"router:error-pages-router" -> "svc:error-pages" [label="service:error-pages"];
"mw:error-pages-middleware" [label="error-pages-middleware", shape=hexagon, fillcolor="#ddd6fe"];
"router:error-pages-router" -> "mw:error-pages-middleware" [style=dashed];
"lb:error-pages:error-pages-service" [label="lb:error-pages-service\nport:8080", shape=component, fillcolor="#fecaca"];
"lb:error-pages:error-pages-service" -> "svc:error-pages";
"svc:gitea" [label="gitea", shape=box, fillcolor="#dcfce7"];
"svc:gitea" -> "net:traefik" [color="#6b7280"];
"router:gitea" [label="router:gitea\nentry:websecure tls:true", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:gitea";
"router:gitea" -> "svc:gitea" [label="service:gitea"];
"dns:service-2.<internal-domain>" [label="service-2.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-2.<internal-domain>";
"dns:service-2.<internal-domain>" -> "router:gitea";
"lb:gitea:gitea" [label="lb:gitea\nport:3000", shape=component, fillcolor="#fecaca"];
"lb:gitea:gitea" -> "svc:gitea";
"svc:gitea-runner" [label="gitea-runner", shape=box, fillcolor="#dcfce7"];
"svc:gitea-runner" -> "net:traefik" [color="#6b7280"];
"svc:gotify" [label="gotify", shape=box, fillcolor="#dcfce7"];
"svc:gotify" -> "net:traefik" [color="#6b7280"];
"router:gotify" [label="router:gotify\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:gotify";
"router:gotify" -> "svc:gotify" [label="service:gotify"];
"dns:service-3.<internal-domain>" [label="service-3.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-3.<internal-domain>";
"dns:service-3.<internal-domain>" -> "router:gotify";
"lb:gotify:gotify" [label="lb:gotify\nport:80", shape=component, fillcolor="#fecaca"];
"lb:gotify:gotify" -> "svc:gotify";
"svc:grafana" [label="grafana", shape=box, fillcolor="#dcfce7"];
"svc:grafana" -> "net:monitor" [color="#6b7280"];
"svc:grafana" -> "net:traefik" [color="#6b7280"];
"router:grafana" [label="router:grafana\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:grafana";
"router:grafana" -> "svc:grafana" [label="service:grafana"];
"dns:service-4.<internal-domain>" [label="service-4.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-4.<internal-domain>";
"dns:service-4.<internal-domain>" -> "router:grafana";
"lb:grafana:grafana" [label="lb:grafana\nport:3000", shape=component, fillcolor="#fecaca"];
"lb:grafana:grafana" -> "svc:grafana";
"svc:gramps-redis" [label="gramps-redis", shape=box, fillcolor="#dcfce7"];
"svc:gramps-redis" -> "net:gramps" [color="#6b7280"];
"svc:grampsweb" [label="grampsweb", shape=box, fillcolor="#dcfce7"];
"svc:grampsweb" -> "net:gramps" [color="#6b7280"];
"svc:grampsweb" -> "net:traefik" [color="#6b7280"];
"router:gramps" [label="router:gramps\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:gramps";
"router:gramps" -> "svc:grampsweb" [label="service:grampsweb"];
"dns:service-5.<internal-domain>" [label="service-5.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-5.<internal-domain>";
"dns:service-5.<internal-domain>" -> "router:gramps";
"lb:grampsweb:gramps" [label="lb:gramps\nport:5000", shape=component, fillcolor="#fecaca"];
"lb:grampsweb:gramps" -> "svc:grampsweb";
"svc:grampsweb_celery" [label="grampsweb_celery", shape=box, fillcolor="#dcfce7"];
"svc:grampsweb_celery" -> "net:gramps" [color="#6b7280"];
"svc:influxdb" [label="influxdb", shape=box, fillcolor="#dcfce7"];
"svc:influxdb" -> "net:monitor" [color="#6b7280"];
"svc:influxdb" -> "net:traefik" [color="#6b7280"];
"router:influxdb" [label="router:influxdb\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:influxdb";
"router:influxdb" -> "svc:influxdb" [label="service:influxdb"];
"dns:service-6.<internal-domain>" [label="service-6.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-6.<internal-domain>";
"dns:service-6.<internal-domain>" -> "router:influxdb";
"mw:authelia" [label="authelia", shape=hexagon, fillcolor="#ddd6fe"];
"router:influxdb" -> "mw:authelia" [style=dashed];
"lb:influxdb:influxdb" [label="lb:influxdb\nport:8086", shape=component, fillcolor="#fecaca"];
"lb:influxdb:influxdb" -> "svc:influxdb";
"svc:monitor-kuma" [label="monitor-kuma", shape=box, fillcolor="#dcfce7"];
"svc:monitor-kuma" -> "net:monitor" [color="#6b7280"];
"svc:monitor-kuma" -> "net:traefik" [color="#6b7280"];
"router:monitor" [label="router:monitor\nentry:websecure tls:true", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:monitor";
"router:monitor" -> "svc:monitor-kuma" [label="service:monitor-kuma"];
"dns:service-7.<internal-domain>" [label="service-7.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-7.<internal-domain>";
"dns:service-7.<internal-domain>" -> "router:monitor";
"lb:monitor-kuma:monitor" [label="lb:monitor\nport:3001", shape=component, fillcolor="#fecaca"];
"lb:monitor-kuma:monitor" -> "svc:monitor-kuma";
"svc:mtls-bridge" [label="mtls-bridge", shape=box, fillcolor="#dcfce7"];
"svc:mtls-bridge" -> "net:monitor" [color="#6b7280"];
"svc:mtls-bridge" -> "net:traefik" [color="#6b7280"];
"router:mtls-bridge" [label="router:mtls-bridge\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:mtls-bridge";
"router:mtls-bridge" -> "svc:mtls-bridge" [label="service:mtls-bridge"];
"dns:service-8.<internal-domain>" [label="service-8.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-8.<internal-domain>";
"dns:service-8.<internal-domain>" -> "router:mtls-bridge";
"mw:mtls-bridge-auth" [label="mtls-bridge-auth", shape=hexagon, fillcolor="#ddd6fe"];
"router:mtls-bridge" -> "mw:mtls-bridge-auth" [style=dashed];
"mw:mtls-bridge-cors" [label="mtls-bridge-cors", shape=hexagon, fillcolor="#ddd6fe"];
"router:mtls-bridge" -> "mw:mtls-bridge-cors" [style=dashed];
"router:mtls-bridge-preflight" [label="router:mtls-bridge-preflight\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:mtls-bridge-preflight";
"router:mtls-bridge-preflight" -> "svc:mtls-bridge" [label="service:mtls-bridge"];
"dns:service-8.<internal-domain>" [label="service-8.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-8.<internal-domain>";
"dns:service-8.<internal-domain>" -> "router:mtls-bridge-preflight";
"mw:mtls-bridge-cors" [label="mtls-bridge-cors", shape=hexagon, fillcolor="#ddd6fe"];
"router:mtls-bridge-preflight" -> "mw:mtls-bridge-cors" [style=dashed];
"lb:mtls-bridge:mtls-bridge" [label="lb:mtls-bridge\nport:8080", shape=component, fillcolor="#fecaca"];
"lb:mtls-bridge:mtls-bridge" -> "svc:mtls-bridge";
"svc:nextcloud-db" [label="nextcloud-db", shape=box, fillcolor="#dcfce7"];
"svc:nextcloud-db" -> "net:nextcloud" [color="#6b7280"];
"svc:nextcloud-redis" [label="nextcloud-redis", shape=box, fillcolor="#dcfce7"];
"svc:nextcloud-redis" -> "net:nextcloud" [color="#6b7280"];
"svc:nextcloud-webapp" [label="nextcloud-webapp", shape=box, fillcolor="#dcfce7"];
"svc:nextcloud-webapp" -> "net:nextcloud" [color="#6b7280"];
"svc:nextcloud-webapp" -> "net:traefik" [color="#6b7280"];
"router:nextcloud" [label="router:nextcloud\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:nextcloud";
"router:nextcloud" -> "svc:nextcloud-webapp" [label="service:nextcloud-webapp"];
"dns:service-9.<internal-domain>" [label="service-9.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-9.<internal-domain>";
"dns:service-9.<internal-domain>" -> "router:nextcloud";
"mw:nextcloud-dav" [label="nextcloud-dav", shape=hexagon, fillcolor="#ddd6fe"];
"router:nextcloud" -> "mw:nextcloud-dav" [style=dashed];
"mw:nextcloud-webfinger" [label="nextcloud-webfinger", shape=hexagon, fillcolor="#ddd6fe"];
"router:nextcloud" -> "mw:nextcloud-webfinger" [style=dashed];
"svc:node-exporter" [label="node-exporter", shape=box, fillcolor="#dcfce7"];
"svc:node-exporter" -> "net:monitor" [color="#6b7280"];
"svc:node-red" [label="node-red", shape=box, fillcolor="#dcfce7"];
"svc:node-red" -> "net:monitor" [color="#6b7280"];
"svc:node-red" -> "net:traefik" [color="#6b7280"];
"router:node-red" [label="router:node-red\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:node-red";
"router:node-red" -> "svc:node-red" [label="service:node-red"];
"dns:service-10.<internal-domain>" [label="service-10.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-10.<internal-domain>";
"dns:service-10.<internal-domain>" -> "router:node-red";
"mw:authelia" [label="authelia", shape=hexagon, fillcolor="#ddd6fe"];
"router:node-red" -> "mw:authelia" [style=dashed];
"lb:node-red:node-red" [label="lb:node-red\nport:1880", shape=component, fillcolor="#fecaca"];
"lb:node-red:node-red" -> "svc:node-red";
"svc:passbolt-db" [label="passbolt-db", shape=box, fillcolor="#dcfce7"];
"svc:passbolt-db" -> "net:passbolt" [color="#6b7280"];
"svc:passbolt-webapp" [label="passbolt-webapp", shape=box, fillcolor="#dcfce7"];
"svc:passbolt-webapp" -> "net:passbolt" [color="#6b7280"];
"svc:passbolt-webapp" -> "net:traefik" [color="#6b7280"];
"router:passbolt" [label="router:passbolt\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:passbolt";
"router:passbolt" -> "svc:passbolt-webapp" [label="service:passbolt-webapp"];
"dns:service-11.<internal-domain>" [label="service-11.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-11.<internal-domain>";
"dns:service-11.<internal-domain>" -> "router:passbolt";
"svc:pihole-exporter" [label="pihole-exporter", shape=box, fillcolor="#dcfce7"];
"svc:pihole-exporter" -> "net:monitor" [color="#6b7280"];
"svc:portainer" [label="portainer", shape=box, fillcolor="#dcfce7"];
"svc:portainer" -> "net:traefik" [color="#6b7280"];
"router:portainer" [label="router:portainer\nentry:websecure tls:true", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:portainer";
"router:portainer" -> "svc:portainer" [label="service:portainer"];
"dns:service-12.<internal-domain>" [label="service-12.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-12.<internal-domain>";
"dns:service-12.<internal-domain>" -> "router:portainer";
"lb:portainer:portainer" [label="lb:portainer\nport:9000", shape=component, fillcolor="#fecaca"];
"lb:portainer:portainer" -> "svc:portainer";
"svc:prometheus" [label="prometheus", shape=box, fillcolor="#dcfce7"];
"svc:prometheus" -> "net:monitor" [color="#6b7280"];
"svc:prometheus" -> "net:traefik" [color="#6b7280"];
"router:prometheus" [label="router:prometheus\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:prometheus";
"router:prometheus" -> "svc:prometheus" [label="service:prometheus"];
"dns:service-13.<internal-domain>" [label="service-13.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-13.<internal-domain>";
"dns:service-13.<internal-domain>" -> "router:prometheus";
"mw:authelia" [label="authelia", shape=hexagon, fillcolor="#ddd6fe"];
"router:prometheus" -> "mw:authelia" [style=dashed];
"lb:prometheus:prometheus" [label="lb:prometheus\nport:9090", shape=component, fillcolor="#fecaca"];
"lb:prometheus:prometheus" -> "svc:prometheus";
"svc:searxng-webapp" [label="searxng-webapp", shape=box, fillcolor="#dcfce7"];
"svc:searxng-webapp" -> "net:traefik" [color="#6b7280"];
"router:searxng" [label="router:searxng\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:searxng";
"router:searxng" -> "svc:searxng-webapp" [label="service:searxng-webapp"];
"dns:service-14.<internal-domain>" [label="service-14.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-14.<internal-domain>";
"dns:service-14.<internal-domain>" -> "router:searxng";
"lb:searxng-webapp:searxng" [label="lb:searxng\nport:8080", shape=component, fillcolor="#fecaca"];
"lb:searxng-webapp:searxng" -> "svc:searxng-webapp";
"svc:shift-recorder-web" [label="shift-recorder-web", shape=box, fillcolor="#dcfce7"];
"svc:shift-recorder-web" -> "net:traefik" [color="#6b7280"];
"router:shifts" [label="router:shifts\nentry:websecure tls:true", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:shifts";
"router:shifts" -> "svc:shift-recorder-web" [label="service:shift-recorder-web"];
"dns:service-15.<internal-domain>" [label="service-15.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-15.<internal-domain>";
"dns:service-15.<internal-domain>" -> "router:shifts";
"lb:shift-recorder-web:shifts" [label="lb:shifts\nport:80", shape=component, fillcolor="#fecaca"];
"lb:shift-recorder-web:shifts" -> "svc:shift-recorder-web";
"svc:stockfill" [label="stockfill", shape=box, fillcolor="#dcfce7"];
"svc:stockfill" -> "net:traefik" [color="#6b7280"];
"router:stockfill" [label="router:stockfill\nentry:websecure tls:true", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:stockfill";
"router:stockfill" -> "svc:stockfill" [label="service:stockfill"];
"dns:service-16.<internal-domain>" [label="service-16.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-16.<internal-domain>";
"dns:service-16.<internal-domain>" -> "router:stockfill";
"lb:stockfill:stockfill" [label="lb:stockfill\nport:80", shape=component, fillcolor="#fecaca"];
"lb:stockfill:stockfill" -> "svc:stockfill";
"svc:telegraf" [label="telegraf", shape=box, fillcolor="#dcfce7"];
"svc:telegraf" -> "net:monitor" [color="#6b7280"];
"svc:traefik" [label="traefik", shape=box, fillcolor="#dcfce7"];
"svc:traefik" -> "net:traefik" [color="#6b7280"];
"router:traefik" [label="router:traefik\nentry:websecure tls:false", shape=diamond, fillcolor="#fbcfe8"];
"svc:traefik" -> "router:traefik";
"router:traefik" -> "svc:traefik" [label="service:api@internal"];
"dns:service-17.<internal-domain>" [label="service-17.<internal-domain>", shape=note, fillcolor="#fde68a"];
"ext:dynu" -> "dns:service-17.<internal-domain>";
"dns:service-17.<internal-domain>" -> "router:traefik";
"mw:authelia" [label="authelia", shape=hexagon, fillcolor="#ddd6fe"];
"router:traefik" -> "mw:authelia" [style=dashed];
}
File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 118 KiB

+79
View File
@@ -0,0 +1,79 @@
digraph PhysicalTopology {
graph [rankdir=LR, compound=true, splines=ortho, nodesep=0.45, ranksep=0.75, fontname="Helvetica"];
node [fontname="Helvetica", fontsize=10, style="rounded,filled", fillcolor="#ffffff"];
edge [fontname="Helvetica", fontsize=9];
subgraph "cluster_docker" {
label="docker";
style="rounded,filled";
color="#c7d6f5";
fillcolor="#eef3ff";
"host:docker" [label="docker", shape=box3d, fillcolor="#d4e3ff"];
"svc:authelia" [label="authelia", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:authelia" [style=dashed, color="#6b7280"];
"svc:crowdsec" [label="crowdsec", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:crowdsec" [style=dashed, color="#6b7280"];
"svc:docker-socket-proxy" [label="docker-socket-proxy", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:docker-socket-proxy" [style=dashed, color="#6b7280"];
"svc:docker-update-exporter" [label="docker-update-exporter", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:docker-update-exporter" [style=dashed, color="#6b7280"];
"svc:error-pages" [label="error-pages", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:error-pages" [style=dashed, color="#6b7280"];
"svc:gitea" [label="gitea", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:gitea" [style=dashed, color="#6b7280"];
"svc:gitea-runner" [label="gitea-runner", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:gitea-runner" [style=dashed, color="#6b7280"];
"svc:gotify" [label="gotify", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:gotify" [style=dashed, color="#6b7280"];
"svc:grafana" [label="grafana", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:grafana" [style=dashed, color="#6b7280"];
"svc:gramps-redis" [label="gramps-redis", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:gramps-redis" [style=dashed, color="#6b7280"];
"svc:grampsweb" [label="grampsweb", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:grampsweb" [style=dashed, color="#6b7280"];
"svc:grampsweb_celery" [label="grampsweb_celery", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:grampsweb_celery" [style=dashed, color="#6b7280"];
"svc:influxdb" [label="influxdb", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:influxdb" [style=dashed, color="#6b7280"];
"svc:monitor-kuma" [label="monitor-kuma", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:monitor-kuma" [style=dashed, color="#6b7280"];
"svc:mtls-bridge" [label="mtls-bridge", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:mtls-bridge" [style=dashed, color="#6b7280"];
"svc:nextcloud-db" [label="nextcloud-db", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:nextcloud-db" [style=dashed, color="#6b7280"];
"svc:nextcloud-redis" [label="nextcloud-redis", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:nextcloud-redis" [style=dashed, color="#6b7280"];
"svc:nextcloud-webapp" [label="nextcloud-webapp", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:nextcloud-webapp" [style=dashed, color="#6b7280"];
"svc:node-exporter" [label="node-exporter", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:node-exporter" [style=dashed, color="#6b7280"];
"svc:node-red" [label="node-red", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:node-red" [style=dashed, color="#6b7280"];
"svc:passbolt-db" [label="passbolt-db", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:passbolt-db" [style=dashed, color="#6b7280"];
"svc:passbolt-webapp" [label="passbolt-webapp", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:passbolt-webapp" [style=dashed, color="#6b7280"];
"svc:portainer" [label="portainer", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:portainer" [style=dashed, color="#6b7280"];
"svc:prometheus" [label="prometheus", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:prometheus" [style=dashed, color="#6b7280"];
"svc:searxng-webapp" [label="searxng-webapp", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:searxng-webapp" [style=dashed, color="#6b7280"];
"svc:shift-recorder-web" [label="shift-recorder-web", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:shift-recorder-web" [style=dashed, color="#6b7280"];
"svc:stockfill" [label="stockfill", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:stockfill" [style=dashed, color="#6b7280"];
"svc:telegraf" [label="telegraf", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:telegraf" [style=dashed, color="#6b7280"];
"svc:traefik" [label="traefik", shape=box, fillcolor="#dff2e1"];
"host:docker" -> "svc:traefik" [style=dashed, color="#6b7280"];
}
subgraph "cluster_raspberrypi" {
label="raspberrypi";
style="rounded,filled";
color="#c7d6f5";
fillcolor="#eef3ff";
"host:raspberrypi" [label="raspberrypi", shape=box3d, fillcolor="#d4e3ff"];
"svc:pihole-exporter" [label="pihole-exporter", shape=box, fillcolor="#dff2e1"];
"host:raspberrypi" -> "svc:pihole-exporter" [style=dashed, color="#6b7280"];
}
}
+401
View File
@@ -0,0 +1,401 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: PhysicalTopology Pages: 1 -->
<svg width="297pt" height="2086pt"
viewBox="0.00 0.00 297.00 2086.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 2082)">
<title>PhysicalTopology</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-2082 293,-2082 293,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_docker</title>
<path fill="#eef3ff" stroke="#c7d6f5" d="M29,-8C29,-8 269,-8 269,-8 275,-8 281,-14 281,-20 281,-20 281,-1975 281,-1975 281,-1981 275,-1987 269,-1987 269,-1987 29,-1987 29,-1987 23,-1987 17,-1981 17,-1975 17,-1975 17,-20 17,-20 17,-14 23,-8 29,-8"/>
<text text-anchor="middle" x="149" y="-1971.8" font-family="Helvetica,sans-Serif" font-size="14.00">docker</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_raspberrypi</title>
<path fill="#eef3ff" stroke="#c7d6f5" d="M20,-1995C20,-1995 249.5,-1995 249.5,-1995 255.5,-1995 261.5,-2001 261.5,-2007 261.5,-2007 261.5,-2058 261.5,-2058 261.5,-2064 255.5,-2070 249.5,-2070 249.5,-2070 20,-2070 20,-2070 14,-2070 8,-2064 8,-2058 8,-2058 8,-2007 8,-2007 8,-2001 14,-1995 20,-1995"/>
<text text-anchor="middle" x="134.75" y="-2054.8" font-family="Helvetica,sans-Serif" font-size="14.00">raspberrypi</text>
</g>
<!-- host:docker -->
<g id="node1" class="node">
<title>host:docker</title>
<polygon fill="#d4e3ff" stroke="black" points="79,-1004 29,-1004 25,-1000 25,-968 75,-968 79,-972 79,-1004"/>
<polyline fill="none" stroke="black" points="75,-1000 25,-1000 "/>
<polyline fill="none" stroke="black" points="75,-1000 75,-968 "/>
<polyline fill="none" stroke="black" points="75,-1000 79,-1004 "/>
<text text-anchor="middle" x="52" y="-983.5" font-family="Helvetica,sans-Serif" font-size="10.00">docker</text>
</g>
<!-- svc:authelia -->
<g id="node2" class="node">
<title>svc:authelia</title>
<path fill="#dff2e1" stroke="black" d="M223.5,-52C223.5,-52 191.5,-52 191.5,-52 185.5,-52 179.5,-46 179.5,-40 179.5,-40 179.5,-28 179.5,-28 179.5,-22 185.5,-16 191.5,-16 191.5,-16 223.5,-16 223.5,-16 229.5,-16 235.5,-22 235.5,-28 235.5,-28 235.5,-40 235.5,-40 235.5,-46 229.5,-52 223.5,-52"/>
<text text-anchor="middle" x="207.5" y="-31.5" font-family="Helvetica,sans-Serif" font-size="10.00">authelia</text>
</g>
<!-- host:docker&#45;&gt;svc:authelia -->
<g id="edge1" class="edge">
<title>host:docker&#45;&gt;svc:authelia</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M30,-967.83C30,-836.22 30,-34 30,-34 30,-34 169.37,-34 169.37,-34"/>
<polygon fill="#6b7280" stroke="#6b7280" points="169.37,-37.5 179.37,-34 169.37,-30.5 169.37,-37.5"/>
</g>
<!-- svc:crowdsec -->
<g id="node3" class="node">
<title>svc:crowdsec</title>
<path fill="#dff2e1" stroke="black" d="M226.5,-120C226.5,-120 188.5,-120 188.5,-120 182.5,-120 176.5,-114 176.5,-108 176.5,-108 176.5,-96 176.5,-96 176.5,-90 182.5,-84 188.5,-84 188.5,-84 226.5,-84 226.5,-84 232.5,-84 238.5,-90 238.5,-96 238.5,-96 238.5,-108 238.5,-108 238.5,-114 232.5,-120 226.5,-120"/>
<text text-anchor="middle" x="207.5" y="-99.5" font-family="Helvetica,sans-Serif" font-size="10.00">crowdsec</text>
</g>
<!-- host:docker&#45;&gt;svc:crowdsec -->
<g id="edge2" class="edge">
<title>host:docker&#45;&gt;svc:crowdsec</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M34,-967.94C34,-842.17 34,-102 34,-102 34,-102 166.48,-102 166.48,-102"/>
<polygon fill="#6b7280" stroke="#6b7280" points="166.48,-105.5 176.48,-102 166.48,-98.5 166.48,-105.5"/>
</g>
<!-- svc:docker&#45;socket&#45;proxy -->
<g id="node4" class="node">
<title>svc:docker&#45;socket&#45;proxy</title>
<path fill="#dff2e1" stroke="black" d="M253.5,-188C253.5,-188 161.5,-188 161.5,-188 155.5,-188 149.5,-182 149.5,-176 149.5,-176 149.5,-164 149.5,-164 149.5,-158 155.5,-152 161.5,-152 161.5,-152 253.5,-152 253.5,-152 259.5,-152 265.5,-158 265.5,-164 265.5,-164 265.5,-176 265.5,-176 265.5,-182 259.5,-188 253.5,-188"/>
<text text-anchor="middle" x="207.5" y="-167.5" font-family="Helvetica,sans-Serif" font-size="10.00">docker&#45;socket&#45;proxy</text>
</g>
<!-- host:docker&#45;&gt;svc:docker&#45;socket&#45;proxy -->
<g id="edge3" class="edge">
<title>host:docker&#45;&gt;svc:docker&#45;socket&#45;proxy</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M38,-967.81C38,-847.41 38,-170 38,-170 38,-170 139.17,-170 139.17,-170"/>
<polygon fill="#6b7280" stroke="#6b7280" points="139.17,-173.5 149.17,-170 139.17,-166.5 139.17,-173.5"/>
</g>
<!-- svc:docker&#45;update&#45;exporter -->
<g id="node5" class="node">
<title>svc:docker&#45;update&#45;exporter</title>
<path fill="#dff2e1" stroke="black" d="M261,-256C261,-256 154,-256 154,-256 148,-256 142,-250 142,-244 142,-244 142,-232 142,-232 142,-226 148,-220 154,-220 154,-220 261,-220 261,-220 267,-220 273,-226 273,-232 273,-232 273,-244 273,-244 273,-250 267,-256 261,-256"/>
<text text-anchor="middle" x="207.5" y="-235.5" font-family="Helvetica,sans-Serif" font-size="10.00">docker&#45;update&#45;exporter</text>
</g>
<!-- host:docker&#45;&gt;svc:docker&#45;update&#45;exporter -->
<g id="edge4" class="edge">
<title>host:docker&#45;&gt;svc:docker&#45;update&#45;exporter</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M79.25,-975.2C107.63,-975.2 148,-975.2 148,-975.2 148,-975.2 148,-266.22 148,-266.22"/>
<polygon fill="#6b7280" stroke="#6b7280" points="151.5,-266.22 148,-256.22 144.5,-266.22 151.5,-266.22"/>
</g>
<!-- svc:error&#45;pages -->
<g id="node6" class="node">
<title>svc:error&#45;pages</title>
<path fill="#dff2e1" stroke="black" d="M232,-324C232,-324 183,-324 183,-324 177,-324 171,-318 171,-312 171,-312 171,-300 171,-300 171,-294 177,-288 183,-288 183,-288 232,-288 232,-288 238,-288 244,-294 244,-300 244,-300 244,-312 244,-312 244,-318 238,-324 232,-324"/>
<text text-anchor="middle" x="207.5" y="-303.5" font-family="Helvetica,sans-Serif" font-size="10.00">error&#45;pages</text>
</g>
<!-- host:docker&#45;&gt;svc:error&#45;pages -->
<g id="edge5" class="edge">
<title>host:docker&#45;&gt;svc:error&#45;pages</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M42,-967.81C42,-859.67 42,-306 42,-306 42,-306 160.77,-306 160.77,-306"/>
<polygon fill="#6b7280" stroke="#6b7280" points="160.77,-309.5 170.77,-306 160.77,-302.5 160.77,-309.5"/>
</g>
<!-- svc:gitea -->
<g id="node7" class="node">
<title>svc:gitea</title>
<path fill="#dff2e1" stroke="black" d="M222.5,-392C222.5,-392 192.5,-392 192.5,-392 186.5,-392 180.5,-386 180.5,-380 180.5,-380 180.5,-368 180.5,-368 180.5,-362 186.5,-356 192.5,-356 192.5,-356 222.5,-356 222.5,-356 228.5,-356 234.5,-362 234.5,-368 234.5,-368 234.5,-380 234.5,-380 234.5,-386 228.5,-392 222.5,-392"/>
<text text-anchor="middle" x="207.5" y="-371.5" font-family="Helvetica,sans-Serif" font-size="10.00">gitea</text>
</g>
<!-- host:docker&#45;&gt;svc:gitea -->
<g id="edge6" class="edge">
<title>host:docker&#45;&gt;svc:gitea</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M46,-967.68C46,-865.85 46,-374 46,-374 46,-374 170.47,-374 170.47,-374"/>
<polygon fill="#6b7280" stroke="#6b7280" points="170.47,-377.5 180.47,-374 170.47,-370.5 170.47,-377.5"/>
</g>
<!-- svc:gitea&#45;runner -->
<g id="node8" class="node">
<title>svc:gitea&#45;runner</title>
<path fill="#dff2e1" stroke="black" d="M234,-460C234,-460 181,-460 181,-460 175,-460 169,-454 169,-448 169,-448 169,-436 169,-436 169,-430 175,-424 181,-424 181,-424 234,-424 234,-424 240,-424 246,-430 246,-436 246,-436 246,-448 246,-448 246,-454 240,-460 234,-460"/>
<text text-anchor="middle" x="207.5" y="-439.5" font-family="Helvetica,sans-Serif" font-size="10.00">gitea&#45;runner</text>
</g>
<!-- host:docker&#45;&gt;svc:gitea&#45;runner -->
<g id="edge7" class="edge">
<title>host:docker&#45;&gt;svc:gitea&#45;runner</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M50,-967.9C50,-873.51 50,-442 50,-442 50,-442 158.97,-442 158.97,-442"/>
<polygon fill="#6b7280" stroke="#6b7280" points="158.97,-445.5 168.97,-442 158.97,-438.5 158.97,-445.5"/>
</g>
<!-- svc:gotify -->
<g id="node9" class="node">
<title>svc:gotify</title>
<path fill="#dff2e1" stroke="black" d="M222.5,-528C222.5,-528 192.5,-528 192.5,-528 186.5,-528 180.5,-522 180.5,-516 180.5,-516 180.5,-504 180.5,-504 180.5,-498 186.5,-492 192.5,-492 192.5,-492 222.5,-492 222.5,-492 228.5,-492 234.5,-498 234.5,-504 234.5,-504 234.5,-516 234.5,-516 234.5,-522 228.5,-528 222.5,-528"/>
<text text-anchor="middle" x="207.5" y="-507.5" font-family="Helvetica,sans-Serif" font-size="10.00">gotify</text>
</g>
<!-- host:docker&#45;&gt;svc:gotify -->
<g id="edge8" class="edge">
<title>host:docker&#45;&gt;svc:gotify</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M55,-967.92C55,-880.97 55,-510 55,-510 55,-510 170.24,-510 170.24,-510"/>
<polygon fill="#6b7280" stroke="#6b7280" points="170.24,-513.5 180.24,-510 170.24,-506.5 170.24,-513.5"/>
</g>
<!-- svc:grafana -->
<g id="node10" class="node">
<title>svc:grafana</title>
<path fill="#dff2e1" stroke="black" d="M222.5,-596C222.5,-596 192.5,-596 192.5,-596 186.5,-596 180.5,-590 180.5,-584 180.5,-584 180.5,-572 180.5,-572 180.5,-566 186.5,-560 192.5,-560 192.5,-560 222.5,-560 222.5,-560 228.5,-560 234.5,-566 234.5,-572 234.5,-572 234.5,-584 234.5,-584 234.5,-590 228.5,-596 222.5,-596"/>
<text text-anchor="middle" x="207.5" y="-575.5" font-family="Helvetica,sans-Serif" font-size="10.00">grafana</text>
</g>
<!-- host:docker&#45;&gt;svc:grafana -->
<g id="edge9" class="edge">
<title>host:docker&#45;&gt;svc:grafana</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M59,-967.94C59,-888.98 59,-578 59,-578 59,-578 170.26,-578 170.26,-578"/>
<polygon fill="#6b7280" stroke="#6b7280" points="170.26,-581.5 180.26,-578 170.26,-574.5 170.26,-581.5"/>
</g>
<!-- svc:gramps&#45;redis -->
<g id="node11" class="node">
<title>svc:gramps&#45;redis</title>
<path fill="#dff2e1" stroke="black" d="M236,-664C236,-664 179,-664 179,-664 173,-664 167,-658 167,-652 167,-652 167,-640 167,-640 167,-634 173,-628 179,-628 179,-628 236,-628 236,-628 242,-628 248,-634 248,-640 248,-640 248,-652 248,-652 248,-658 242,-664 236,-664"/>
<text text-anchor="middle" x="207.5" y="-643.5" font-family="Helvetica,sans-Serif" font-size="10.00">gramps&#45;redis</text>
</g>
<!-- host:docker&#45;&gt;svc:gramps&#45;redis -->
<g id="edge10" class="edge">
<title>host:docker&#45;&gt;svc:gramps&#45;redis</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M63,-967.72C63,-897.1 63,-646 63,-646 63,-646 156.86,-646 156.86,-646"/>
<polygon fill="#6b7280" stroke="#6b7280" points="156.86,-649.5 166.86,-646 156.86,-642.5 156.86,-649.5"/>
</g>
<!-- svc:grampsweb -->
<g id="node12" class="node">
<title>svc:grampsweb</title>
<path fill="#dff2e1" stroke="black" d="M232.5,-732C232.5,-732 182.5,-732 182.5,-732 176.5,-732 170.5,-726 170.5,-720 170.5,-720 170.5,-708 170.5,-708 170.5,-702 176.5,-696 182.5,-696 182.5,-696 232.5,-696 232.5,-696 238.5,-696 244.5,-702 244.5,-708 244.5,-708 244.5,-720 244.5,-720 244.5,-726 238.5,-732 232.5,-732"/>
<text text-anchor="middle" x="207.5" y="-711.5" font-family="Helvetica,sans-Serif" font-size="10.00">grampsweb</text>
</g>
<!-- host:docker&#45;&gt;svc:grampsweb -->
<g id="edge11" class="edge">
<title>host:docker&#45;&gt;svc:grampsweb</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M67,-967.73C67,-906.75 67,-714 67,-714 67,-714 160.22,-714 160.22,-714"/>
<polygon fill="#6b7280" stroke="#6b7280" points="160.22,-717.5 170.22,-714 160.22,-710.5 160.22,-717.5"/>
</g>
<!-- svc:grampsweb_celery -->
<g id="node13" class="node">
<title>svc:grampsweb_celery</title>
<path fill="#dff2e1" stroke="black" d="M250,-800C250,-800 165,-800 165,-800 159,-800 153,-794 153,-788 153,-788 153,-776 153,-776 153,-770 159,-764 165,-764 165,-764 250,-764 250,-764 256,-764 262,-770 262,-776 262,-776 262,-788 262,-788 262,-794 256,-800 250,-800"/>
<text text-anchor="middle" x="207.5" y="-779.5" font-family="Helvetica,sans-Serif" font-size="10.00">grampsweb_celery</text>
</g>
<!-- host:docker&#45;&gt;svc:grampsweb_celery -->
<g id="edge12" class="edge">
<title>host:docker&#45;&gt;svc:grampsweb_celery</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M79,-982.4C110.7,-982.4 159,-982.4 159,-982.4 159,-982.4 159,-810.14 159,-810.14"/>
<polygon fill="#6b7280" stroke="#6b7280" points="162.5,-810.14 159,-800.14 155.5,-810.14 162.5,-810.14"/>
</g>
<!-- svc:influxdb -->
<g id="node14" class="node">
<title>svc:influxdb</title>
<path fill="#dff2e1" stroke="black" d="M223.5,-868C223.5,-868 191.5,-868 191.5,-868 185.5,-868 179.5,-862 179.5,-856 179.5,-856 179.5,-844 179.5,-844 179.5,-838 185.5,-832 191.5,-832 191.5,-832 223.5,-832 223.5,-832 229.5,-832 235.5,-838 235.5,-844 235.5,-844 235.5,-856 235.5,-856 235.5,-862 229.5,-868 223.5,-868"/>
<text text-anchor="middle" x="207.5" y="-847.5" font-family="Helvetica,sans-Serif" font-size="10.00">influxdb</text>
</g>
<!-- host:docker&#45;&gt;svc:influxdb -->
<g id="edge13" class="edge">
<title>host:docker&#45;&gt;svc:influxdb</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M71,-967.94C71,-930.95 71,-850 71,-850 71,-850 169.22,-850 169.22,-850"/>
<polygon fill="#6b7280" stroke="#6b7280" points="169.22,-853.5 179.22,-850 169.22,-846.5 169.22,-853.5"/>
</g>
<!-- svc:monitor&#45;kuma -->
<g id="node15" class="node">
<title>svc:monitor&#45;kuma</title>
<path fill="#dff2e1" stroke="black" d="M238.5,-936C238.5,-936 176.5,-936 176.5,-936 170.5,-936 164.5,-930 164.5,-924 164.5,-924 164.5,-912 164.5,-912 164.5,-906 170.5,-900 176.5,-900 176.5,-900 238.5,-900 238.5,-900 244.5,-900 250.5,-906 250.5,-912 250.5,-912 250.5,-924 250.5,-924 250.5,-930 244.5,-936 238.5,-936"/>
<text text-anchor="middle" x="207.5" y="-915.5" font-family="Helvetica,sans-Serif" font-size="10.00">monitor&#45;kuma</text>
</g>
<!-- host:docker&#45;&gt;svc:monitor&#45;kuma -->
<g id="edge14" class="edge">
<title>host:docker&#45;&gt;svc:monitor&#45;kuma</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M75,-967.78C75,-947.63 75,-918 75,-918 75,-918 154.48,-918 154.48,-918"/>
<polygon fill="#6b7280" stroke="#6b7280" points="154.48,-921.5 164.48,-918 154.48,-914.5 154.48,-921.5"/>
</g>
<!-- svc:mtls&#45;bridge -->
<g id="node16" class="node">
<title>svc:mtls&#45;bridge</title>
<path fill="#dff2e1" stroke="black" d="M232,-1004C232,-1004 183,-1004 183,-1004 177,-1004 171,-998 171,-992 171,-992 171,-980 171,-980 171,-974 177,-968 183,-968 183,-968 232,-968 232,-968 238,-968 244,-974 244,-980 244,-980 244,-992 244,-992 244,-998 238,-1004 232,-1004"/>
<text text-anchor="middle" x="207.5" y="-983.5" font-family="Helvetica,sans-Serif" font-size="10.00">mtls&#45;bridge</text>
</g>
<!-- host:docker&#45;&gt;svc:mtls&#45;bridge -->
<g id="edge15" class="edge">
<title>host:docker&#45;&gt;svc:mtls&#45;bridge</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M79.09,-989.6C79.09,-989.6 160.82,-989.6 160.82,-989.6"/>
<polygon fill="#6b7280" stroke="#6b7280" points="160.82,-993.1 170.82,-989.6 160.82,-986.1 160.82,-993.1"/>
</g>
<!-- svc:nextcloud&#45;db -->
<g id="node17" class="node">
<title>svc:nextcloud&#45;db</title>
<path fill="#dff2e1" stroke="black" d="M235.5,-1072C235.5,-1072 179.5,-1072 179.5,-1072 173.5,-1072 167.5,-1066 167.5,-1060 167.5,-1060 167.5,-1048 167.5,-1048 167.5,-1042 173.5,-1036 179.5,-1036 179.5,-1036 235.5,-1036 235.5,-1036 241.5,-1036 247.5,-1042 247.5,-1048 247.5,-1048 247.5,-1060 247.5,-1060 247.5,-1066 241.5,-1072 235.5,-1072"/>
<text text-anchor="middle" x="207.5" y="-1051.5" font-family="Helvetica,sans-Serif" font-size="10.00">nextcloud&#45;db</text>
</g>
<!-- host:docker&#45;&gt;svc:nextcloud&#45;db -->
<g id="edge16" class="edge">
<title>host:docker&#45;&gt;svc:nextcloud&#45;db</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M76,-1004.22C76,-1024.37 76,-1054 76,-1054 76,-1054 157.33,-1054 157.33,-1054"/>
<polygon fill="#6b7280" stroke="#6b7280" points="157.33,-1057.5 167.33,-1054 157.33,-1050.5 157.33,-1057.5"/>
</g>
<!-- svc:nextcloud&#45;redis -->
<g id="node18" class="node">
<title>svc:nextcloud&#45;redis</title>
<path fill="#dff2e1" stroke="black" d="M241.5,-1140C241.5,-1140 173.5,-1140 173.5,-1140 167.5,-1140 161.5,-1134 161.5,-1128 161.5,-1128 161.5,-1116 161.5,-1116 161.5,-1110 167.5,-1104 173.5,-1104 173.5,-1104 241.5,-1104 241.5,-1104 247.5,-1104 253.5,-1110 253.5,-1116 253.5,-1116 253.5,-1128 253.5,-1128 253.5,-1134 247.5,-1140 241.5,-1140"/>
<text text-anchor="middle" x="207.5" y="-1119.5" font-family="Helvetica,sans-Serif" font-size="10.00">nextcloud&#45;redis</text>
</g>
<!-- host:docker&#45;&gt;svc:nextcloud&#45;redis -->
<g id="edge17" class="edge">
<title>host:docker&#45;&gt;svc:nextcloud&#45;redis</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M72,-1004.06C72,-1041.05 72,-1122 72,-1122 72,-1122 151.25,-1122 151.25,-1122"/>
<polygon fill="#6b7280" stroke="#6b7280" points="151.25,-1125.5 161.25,-1122 151.25,-1118.5 151.25,-1125.5"/>
</g>
<!-- svc:nextcloud&#45;webapp -->
<g id="node19" class="node">
<title>svc:nextcloud&#45;webapp</title>
<path fill="#dff2e1" stroke="black" d="M249,-1208C249,-1208 166,-1208 166,-1208 160,-1208 154,-1202 154,-1196 154,-1196 154,-1184 154,-1184 154,-1178 160,-1172 166,-1172 166,-1172 249,-1172 249,-1172 255,-1172 261,-1178 261,-1184 261,-1184 261,-1196 261,-1196 261,-1202 255,-1208 249,-1208"/>
<text text-anchor="middle" x="207.5" y="-1187.5" font-family="Helvetica,sans-Serif" font-size="10.00">nextcloud&#45;webapp</text>
</g>
<!-- host:docker&#45;&gt;svc:nextcloud&#45;webapp -->
<g id="edge18" class="edge">
<title>host:docker&#45;&gt;svc:nextcloud&#45;webapp</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M79.04,-996.8C110.15,-996.8 157,-996.8 157,-996.8 157,-996.8 157,-1161.82 157,-1161.82"/>
<polygon fill="#6b7280" stroke="#6b7280" points="153.5,-1161.82 157,-1171.82 160.5,-1161.82 153.5,-1161.82"/>
</g>
<!-- svc:node&#45;exporter -->
<g id="node20" class="node">
<title>svc:node&#45;exporter</title>
<path fill="#dff2e1" stroke="black" d="M238.5,-1276C238.5,-1276 176.5,-1276 176.5,-1276 170.5,-1276 164.5,-1270 164.5,-1264 164.5,-1264 164.5,-1252 164.5,-1252 164.5,-1246 170.5,-1240 176.5,-1240 176.5,-1240 238.5,-1240 238.5,-1240 244.5,-1240 250.5,-1246 250.5,-1252 250.5,-1252 250.5,-1264 250.5,-1264 250.5,-1270 244.5,-1276 238.5,-1276"/>
<text text-anchor="middle" x="207.5" y="-1255.5" font-family="Helvetica,sans-Serif" font-size="10.00">node&#45;exporter</text>
</g>
<!-- host:docker&#45;&gt;svc:node&#45;exporter -->
<g id="edge19" class="edge">
<title>host:docker&#45;&gt;svc:node&#45;exporter</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M68,-1004.27C68,-1065.25 68,-1258 68,-1258 68,-1258 154.13,-1258 154.13,-1258"/>
<polygon fill="#6b7280" stroke="#6b7280" points="154.13,-1261.5 164.13,-1258 154.13,-1254.5 154.13,-1261.5"/>
</g>
<!-- svc:node&#45;red -->
<g id="node21" class="node">
<title>svc:node&#45;red</title>
<path fill="#dff2e1" stroke="black" d="M225.5,-1344C225.5,-1344 189.5,-1344 189.5,-1344 183.5,-1344 177.5,-1338 177.5,-1332 177.5,-1332 177.5,-1320 177.5,-1320 177.5,-1314 183.5,-1308 189.5,-1308 189.5,-1308 225.5,-1308 225.5,-1308 231.5,-1308 237.5,-1314 237.5,-1320 237.5,-1320 237.5,-1332 237.5,-1332 237.5,-1338 231.5,-1344 225.5,-1344"/>
<text text-anchor="middle" x="207.5" y="-1323.5" font-family="Helvetica,sans-Serif" font-size="10.00">node&#45;red</text>
</g>
<!-- host:docker&#45;&gt;svc:node&#45;red -->
<g id="edge20" class="edge">
<title>host:docker&#45;&gt;svc:node&#45;red</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M64,-1004.28C64,-1074.9 64,-1326 64,-1326 64,-1326 167.42,-1326 167.42,-1326"/>
<polygon fill="#6b7280" stroke="#6b7280" points="167.42,-1329.5 177.42,-1326 167.42,-1322.5 167.42,-1329.5"/>
</g>
<!-- svc:passbolt&#45;db -->
<g id="node22" class="node">
<title>svc:passbolt&#45;db</title>
<path fill="#dff2e1" stroke="black" d="M232.5,-1412C232.5,-1412 182.5,-1412 182.5,-1412 176.5,-1412 170.5,-1406 170.5,-1400 170.5,-1400 170.5,-1388 170.5,-1388 170.5,-1382 176.5,-1376 182.5,-1376 182.5,-1376 232.5,-1376 232.5,-1376 238.5,-1376 244.5,-1382 244.5,-1388 244.5,-1388 244.5,-1400 244.5,-1400 244.5,-1406 238.5,-1412 232.5,-1412"/>
<text text-anchor="middle" x="207.5" y="-1391.5" font-family="Helvetica,sans-Serif" font-size="10.00">passbolt&#45;db</text>
</g>
<!-- host:docker&#45;&gt;svc:passbolt&#45;db -->
<g id="edge21" class="edge">
<title>host:docker&#45;&gt;svc:passbolt&#45;db</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M60,-1004.06C60,-1083.02 60,-1394 60,-1394 60,-1394 160.28,-1394 160.28,-1394"/>
<polygon fill="#6b7280" stroke="#6b7280" points="160.28,-1397.5 170.28,-1394 160.28,-1390.5 160.28,-1397.5"/>
</g>
<!-- svc:passbolt&#45;webapp -->
<g id="node23" class="node">
<title>svc:passbolt&#45;webapp</title>
<path fill="#dff2e1" stroke="black" d="M245.5,-1480C245.5,-1480 169.5,-1480 169.5,-1480 163.5,-1480 157.5,-1474 157.5,-1468 157.5,-1468 157.5,-1456 157.5,-1456 157.5,-1450 163.5,-1444 169.5,-1444 169.5,-1444 245.5,-1444 245.5,-1444 251.5,-1444 257.5,-1450 257.5,-1456 257.5,-1456 257.5,-1468 257.5,-1468 257.5,-1474 251.5,-1480 245.5,-1480"/>
<text text-anchor="middle" x="207.5" y="-1459.5" font-family="Helvetica,sans-Serif" font-size="10.00">passbolt&#45;webapp</text>
</g>
<!-- host:docker&#45;&gt;svc:passbolt&#45;webapp -->
<g id="edge22" class="edge">
<title>host:docker&#45;&gt;svc:passbolt&#45;webapp</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M56,-1004.08C56,-1091.03 56,-1462 56,-1462 56,-1462 147.47,-1462 147.47,-1462"/>
<polygon fill="#6b7280" stroke="#6b7280" points="147.47,-1465.5 157.47,-1462 147.47,-1458.5 147.47,-1465.5"/>
</g>
<!-- svc:portainer -->
<g id="node24" class="node">
<title>svc:portainer</title>
<path fill="#dff2e1" stroke="black" d="M226,-1548C226,-1548 189,-1548 189,-1548 183,-1548 177,-1542 177,-1536 177,-1536 177,-1524 177,-1524 177,-1518 183,-1512 189,-1512 189,-1512 226,-1512 226,-1512 232,-1512 238,-1518 238,-1524 238,-1524 238,-1536 238,-1536 238,-1542 232,-1548 226,-1548"/>
<text text-anchor="middle" x="207.5" y="-1527.5" font-family="Helvetica,sans-Serif" font-size="10.00">portainer</text>
</g>
<!-- host:docker&#45;&gt;svc:portainer -->
<g id="edge23" class="edge">
<title>host:docker&#45;&gt;svc:portainer</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M52,-1004.1C52,-1098.49 52,-1530 52,-1530 52,-1530 166.78,-1530 166.78,-1530"/>
<polygon fill="#6b7280" stroke="#6b7280" points="166.78,-1533.5 176.78,-1530 166.78,-1526.5 166.78,-1533.5"/>
</g>
<!-- svc:prometheus -->
<g id="node25" class="node">
<title>svc:prometheus</title>
<path fill="#dff2e1" stroke="black" d="M233,-1616C233,-1616 182,-1616 182,-1616 176,-1616 170,-1610 170,-1604 170,-1604 170,-1592 170,-1592 170,-1586 176,-1580 182,-1580 182,-1580 233,-1580 233,-1580 239,-1580 245,-1586 245,-1592 245,-1592 245,-1604 245,-1604 245,-1610 239,-1616 233,-1616"/>
<text text-anchor="middle" x="207.5" y="-1595.5" font-family="Helvetica,sans-Serif" font-size="10.00">prometheus</text>
</g>
<!-- host:docker&#45;&gt;svc:prometheus -->
<g id="edge24" class="edge">
<title>host:docker&#45;&gt;svc:prometheus</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M49,-1004.32C49,-1106.15 49,-1598 49,-1598 49,-1598 159.94,-1598 159.94,-1598"/>
<polygon fill="#6b7280" stroke="#6b7280" points="159.94,-1601.5 169.94,-1598 159.94,-1594.5 159.94,-1601.5"/>
</g>
<!-- svc:searxng&#45;webapp -->
<g id="node26" class="node">
<title>svc:searxng&#45;webapp</title>
<path fill="#dff2e1" stroke="black" d="M244.5,-1684C244.5,-1684 170.5,-1684 170.5,-1684 164.5,-1684 158.5,-1678 158.5,-1672 158.5,-1672 158.5,-1660 158.5,-1660 158.5,-1654 164.5,-1648 170.5,-1648 170.5,-1648 244.5,-1648 244.5,-1648 250.5,-1648 256.5,-1654 256.5,-1660 256.5,-1660 256.5,-1672 256.5,-1672 256.5,-1678 250.5,-1684 244.5,-1684"/>
<text text-anchor="middle" x="207.5" y="-1663.5" font-family="Helvetica,sans-Serif" font-size="10.00">searxng&#45;webapp</text>
</g>
<!-- host:docker&#45;&gt;svc:searxng&#45;webapp -->
<g id="edge25" class="edge">
<title>host:docker&#45;&gt;svc:searxng&#45;webapp</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M45,-1004.19C45,-1112.33 45,-1666 45,-1666 45,-1666 148.3,-1666 148.3,-1666"/>
<polygon fill="#6b7280" stroke="#6b7280" points="148.3,-1669.5 158.3,-1666 148.3,-1662.5 148.3,-1669.5"/>
</g>
<!-- svc:shift&#45;recorder&#45;web -->
<g id="node27" class="node">
<title>svc:shift&#45;recorder&#45;web</title>
<path fill="#dff2e1" stroke="black" d="M248.5,-1752C248.5,-1752 166.5,-1752 166.5,-1752 160.5,-1752 154.5,-1746 154.5,-1740 154.5,-1740 154.5,-1728 154.5,-1728 154.5,-1722 160.5,-1716 166.5,-1716 166.5,-1716 248.5,-1716 248.5,-1716 254.5,-1716 260.5,-1722 260.5,-1728 260.5,-1728 260.5,-1740 260.5,-1740 260.5,-1746 254.5,-1752 248.5,-1752"/>
<text text-anchor="middle" x="207.5" y="-1731.5" font-family="Helvetica,sans-Serif" font-size="10.00">shift&#45;recorder&#45;web</text>
</g>
<!-- host:docker&#45;&gt;svc:shift&#45;recorder&#45;web -->
<g id="edge26" class="edge">
<title>host:docker&#45;&gt;svc:shift&#45;recorder&#45;web</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M41,-1004.12C41,-1118.35 41,-1734 41,-1734 41,-1734 144.36,-1734 144.36,-1734"/>
<polygon fill="#6b7280" stroke="#6b7280" points="144.36,-1737.5 154.36,-1734 144.36,-1730.5 144.36,-1737.5"/>
</g>
<!-- svc:stockfill -->
<g id="node28" class="node">
<title>svc:stockfill</title>
<path fill="#dff2e1" stroke="black" d="M223,-1820C223,-1820 192,-1820 192,-1820 186,-1820 180,-1814 180,-1808 180,-1808 180,-1796 180,-1796 180,-1790 186,-1784 192,-1784 192,-1784 223,-1784 223,-1784 229,-1784 235,-1790 235,-1796 235,-1796 235,-1808 235,-1808 235,-1814 229,-1820 223,-1820"/>
<text text-anchor="middle" x="207.5" y="-1799.5" font-family="Helvetica,sans-Serif" font-size="10.00">stockfill</text>
</g>
<!-- host:docker&#45;&gt;svc:stockfill -->
<g id="edge27" class="edge">
<title>host:docker&#45;&gt;svc:stockfill</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M37,-1004.19C37,-1124.59 37,-1802 37,-1802 37,-1802 169.73,-1802 169.73,-1802"/>
<polygon fill="#6b7280" stroke="#6b7280" points="169.73,-1805.5 179.73,-1802 169.73,-1798.5 169.73,-1805.5"/>
</g>
<!-- svc:telegraf -->
<g id="node29" class="node">
<title>svc:telegraf</title>
<path fill="#dff2e1" stroke="black" d="M223,-1888C223,-1888 192,-1888 192,-1888 186,-1888 180,-1882 180,-1876 180,-1876 180,-1864 180,-1864 180,-1858 186,-1852 192,-1852 192,-1852 223,-1852 223,-1852 229,-1852 235,-1858 235,-1864 235,-1864 235,-1876 235,-1876 235,-1882 229,-1888 223,-1888"/>
<text text-anchor="middle" x="207.5" y="-1867.5" font-family="Helvetica,sans-Serif" font-size="10.00">telegraf</text>
</g>
<!-- host:docker&#45;&gt;svc:telegraf -->
<g id="edge28" class="edge">
<title>host:docker&#45;&gt;svc:telegraf</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M33,-1004.06C33,-1129.83 33,-1870 33,-1870 33,-1870 169.85,-1870 169.85,-1870"/>
<polygon fill="#6b7280" stroke="#6b7280" points="169.85,-1873.5 179.85,-1870 169.85,-1866.5 169.85,-1873.5"/>
</g>
<!-- svc:traefik -->
<g id="node30" class="node">
<title>svc:traefik</title>
<path fill="#dff2e1" stroke="black" d="M222.5,-1956C222.5,-1956 192.5,-1956 192.5,-1956 186.5,-1956 180.5,-1950 180.5,-1944 180.5,-1944 180.5,-1932 180.5,-1932 180.5,-1926 186.5,-1920 192.5,-1920 192.5,-1920 222.5,-1920 222.5,-1920 228.5,-1920 234.5,-1926 234.5,-1932 234.5,-1932 234.5,-1944 234.5,-1944 234.5,-1950 228.5,-1956 222.5,-1956"/>
<text text-anchor="middle" x="207.5" y="-1935.5" font-family="Helvetica,sans-Serif" font-size="10.00">traefik</text>
</g>
<!-- host:docker&#45;&gt;svc:traefik -->
<g id="edge29" class="edge">
<title>host:docker&#45;&gt;svc:traefik</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M29,-1004.17C29,-1135.78 29,-1938 29,-1938 29,-1938 170.39,-1938 170.39,-1938"/>
<polygon fill="#6b7280" stroke="#6b7280" points="170.39,-1941.5 180.39,-1938 170.39,-1934.5 170.39,-1941.5"/>
</g>
<!-- host:raspberrypi -->
<g id="node31" class="node">
<title>host:raspberrypi</title>
<polygon fill="#d4e3ff" stroke="black" points="88,-2039 20,-2039 16,-2035 16,-2003 84,-2003 88,-2007 88,-2039"/>
<polyline fill="none" stroke="black" points="84,-2035 16,-2035 "/>
<polyline fill="none" stroke="black" points="84,-2035 84,-2003 "/>
<polyline fill="none" stroke="black" points="84,-2035 88,-2039 "/>
<text text-anchor="middle" x="52" y="-2018.5" font-family="Helvetica,sans-Serif" font-size="10.00">raspberrypi</text>
</g>
<!-- svc:pihole&#45;exporter -->
<g id="node32" class="node">
<title>svc:pihole&#45;exporter</title>
<path fill="#dff2e1" stroke="black" d="M241.5,-2039C241.5,-2039 173.5,-2039 173.5,-2039 167.5,-2039 161.5,-2033 161.5,-2027 161.5,-2027 161.5,-2015 161.5,-2015 161.5,-2009 167.5,-2003 173.5,-2003 173.5,-2003 241.5,-2003 241.5,-2003 247.5,-2003 253.5,-2009 253.5,-2015 253.5,-2015 253.5,-2027 253.5,-2027 253.5,-2033 247.5,-2039 241.5,-2039"/>
<text text-anchor="middle" x="207.5" y="-2018.5" font-family="Helvetica,sans-Serif" font-size="10.00">pihole&#45;exporter</text>
</g>
<!-- host:raspberrypi&#45;&gt;svc:pihole&#45;exporter -->
<g id="edge30" class="edge">
<title>host:raspberrypi&#45;&gt;svc:pihole&#45;exporter</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M88.07,-2021C88.07,-2021 151.29,-2021 151.29,-2021"/>
<polygon fill="#6b7280" stroke="#6b7280" points="151.29,-2024.5 161.29,-2021 151.29,-2017.5 151.29,-2024.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 29 KiB

+9
View File
@@ -0,0 +1,9 @@
# Infrastructure diagrams
## Physical / virtual topology
![Physical topology](physical-topology.svg)
## Docker, Traefik and Dynu routing
![Docker Traefik Dynu](docker-traefik-dynu.svg)
File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 136 B

After

Width:  |  Height:  |  Size: 118 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 118 KiB

+11 -3
View File
@@ -1,12 +1,20 @@
# Public Infrastructure Summary
This folder contains sanitized documentation generated from the infrastructure repository.
This documentation is generated from the infrastructure repository. Sensitive values are redacted.
Sensitive values such as internal domain names, private IP addresses, tokens, passwords, and secrets are redacted.
## Infrastructure diagrams
### Physical / virtual topology
![Physical topology](physical-topology.svg)
### Docker, Traefik and Dynu routing
![Docker Traefik Dynu](docker-traefik-dynu.svg)
## Documents
- [Diagrams](diagrams.md)
- [Compose Inventory](compose-inventory.md)
- [Traefik Routes](traefik-routes.md)
- [Prometheus Rules](prometheus-rules.md)
- [Docker Compose Diagram](docker-compose.svg)
+401
View File
@@ -0,0 +1,401 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: PhysicalTopology Pages: 1 -->
<svg width="297pt" height="2086pt"
viewBox="0.00 0.00 297.00 2086.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 2082)">
<title>PhysicalTopology</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-2082 293,-2082 293,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_docker</title>
<path fill="#eef3ff" stroke="#c7d6f5" d="M29,-8C29,-8 269,-8 269,-8 275,-8 281,-14 281,-20 281,-20 281,-1975 281,-1975 281,-1981 275,-1987 269,-1987 269,-1987 29,-1987 29,-1987 23,-1987 17,-1981 17,-1975 17,-1975 17,-20 17,-20 17,-14 23,-8 29,-8"/>
<text text-anchor="middle" x="149" y="-1971.8" font-family="Helvetica,sans-Serif" font-size="14.00">docker</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_raspberrypi</title>
<path fill="#eef3ff" stroke="#c7d6f5" d="M20,-1995C20,-1995 249.5,-1995 249.5,-1995 255.5,-1995 261.5,-2001 261.5,-2007 261.5,-2007 261.5,-2058 261.5,-2058 261.5,-2064 255.5,-2070 249.5,-2070 249.5,-2070 20,-2070 20,-2070 14,-2070 8,-2064 8,-2058 8,-2058 8,-2007 8,-2007 8,-2001 14,-1995 20,-1995"/>
<text text-anchor="middle" x="134.75" y="-2054.8" font-family="Helvetica,sans-Serif" font-size="14.00">raspberrypi</text>
</g>
<!-- host:docker -->
<g id="node1" class="node">
<title>host:docker</title>
<polygon fill="#d4e3ff" stroke="black" points="79,-1004 29,-1004 25,-1000 25,-968 75,-968 79,-972 79,-1004"/>
<polyline fill="none" stroke="black" points="75,-1000 25,-1000 "/>
<polyline fill="none" stroke="black" points="75,-1000 75,-968 "/>
<polyline fill="none" stroke="black" points="75,-1000 79,-1004 "/>
<text text-anchor="middle" x="52" y="-983.5" font-family="Helvetica,sans-Serif" font-size="10.00">docker</text>
</g>
<!-- svc:authelia -->
<g id="node2" class="node">
<title>svc:authelia</title>
<path fill="#dff2e1" stroke="black" d="M223.5,-52C223.5,-52 191.5,-52 191.5,-52 185.5,-52 179.5,-46 179.5,-40 179.5,-40 179.5,-28 179.5,-28 179.5,-22 185.5,-16 191.5,-16 191.5,-16 223.5,-16 223.5,-16 229.5,-16 235.5,-22 235.5,-28 235.5,-28 235.5,-40 235.5,-40 235.5,-46 229.5,-52 223.5,-52"/>
<text text-anchor="middle" x="207.5" y="-31.5" font-family="Helvetica,sans-Serif" font-size="10.00">authelia</text>
</g>
<!-- host:docker&#45;&gt;svc:authelia -->
<g id="edge1" class="edge">
<title>host:docker&#45;&gt;svc:authelia</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M30,-967.83C30,-836.22 30,-34 30,-34 30,-34 169.37,-34 169.37,-34"/>
<polygon fill="#6b7280" stroke="#6b7280" points="169.37,-37.5 179.37,-34 169.37,-30.5 169.37,-37.5"/>
</g>
<!-- svc:crowdsec -->
<g id="node3" class="node">
<title>svc:crowdsec</title>
<path fill="#dff2e1" stroke="black" d="M226.5,-120C226.5,-120 188.5,-120 188.5,-120 182.5,-120 176.5,-114 176.5,-108 176.5,-108 176.5,-96 176.5,-96 176.5,-90 182.5,-84 188.5,-84 188.5,-84 226.5,-84 226.5,-84 232.5,-84 238.5,-90 238.5,-96 238.5,-96 238.5,-108 238.5,-108 238.5,-114 232.5,-120 226.5,-120"/>
<text text-anchor="middle" x="207.5" y="-99.5" font-family="Helvetica,sans-Serif" font-size="10.00">crowdsec</text>
</g>
<!-- host:docker&#45;&gt;svc:crowdsec -->
<g id="edge2" class="edge">
<title>host:docker&#45;&gt;svc:crowdsec</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M34,-967.94C34,-842.17 34,-102 34,-102 34,-102 166.48,-102 166.48,-102"/>
<polygon fill="#6b7280" stroke="#6b7280" points="166.48,-105.5 176.48,-102 166.48,-98.5 166.48,-105.5"/>
</g>
<!-- svc:docker&#45;socket&#45;proxy -->
<g id="node4" class="node">
<title>svc:docker&#45;socket&#45;proxy</title>
<path fill="#dff2e1" stroke="black" d="M253.5,-188C253.5,-188 161.5,-188 161.5,-188 155.5,-188 149.5,-182 149.5,-176 149.5,-176 149.5,-164 149.5,-164 149.5,-158 155.5,-152 161.5,-152 161.5,-152 253.5,-152 253.5,-152 259.5,-152 265.5,-158 265.5,-164 265.5,-164 265.5,-176 265.5,-176 265.5,-182 259.5,-188 253.5,-188"/>
<text text-anchor="middle" x="207.5" y="-167.5" font-family="Helvetica,sans-Serif" font-size="10.00">docker&#45;socket&#45;proxy</text>
</g>
<!-- host:docker&#45;&gt;svc:docker&#45;socket&#45;proxy -->
<g id="edge3" class="edge">
<title>host:docker&#45;&gt;svc:docker&#45;socket&#45;proxy</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M38,-967.81C38,-847.41 38,-170 38,-170 38,-170 139.17,-170 139.17,-170"/>
<polygon fill="#6b7280" stroke="#6b7280" points="139.17,-173.5 149.17,-170 139.17,-166.5 139.17,-173.5"/>
</g>
<!-- svc:docker&#45;update&#45;exporter -->
<g id="node5" class="node">
<title>svc:docker&#45;update&#45;exporter</title>
<path fill="#dff2e1" stroke="black" d="M261,-256C261,-256 154,-256 154,-256 148,-256 142,-250 142,-244 142,-244 142,-232 142,-232 142,-226 148,-220 154,-220 154,-220 261,-220 261,-220 267,-220 273,-226 273,-232 273,-232 273,-244 273,-244 273,-250 267,-256 261,-256"/>
<text text-anchor="middle" x="207.5" y="-235.5" font-family="Helvetica,sans-Serif" font-size="10.00">docker&#45;update&#45;exporter</text>
</g>
<!-- host:docker&#45;&gt;svc:docker&#45;update&#45;exporter -->
<g id="edge4" class="edge">
<title>host:docker&#45;&gt;svc:docker&#45;update&#45;exporter</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M79.25,-975.2C107.63,-975.2 148,-975.2 148,-975.2 148,-975.2 148,-266.22 148,-266.22"/>
<polygon fill="#6b7280" stroke="#6b7280" points="151.5,-266.22 148,-256.22 144.5,-266.22 151.5,-266.22"/>
</g>
<!-- svc:error&#45;pages -->
<g id="node6" class="node">
<title>svc:error&#45;pages</title>
<path fill="#dff2e1" stroke="black" d="M232,-324C232,-324 183,-324 183,-324 177,-324 171,-318 171,-312 171,-312 171,-300 171,-300 171,-294 177,-288 183,-288 183,-288 232,-288 232,-288 238,-288 244,-294 244,-300 244,-300 244,-312 244,-312 244,-318 238,-324 232,-324"/>
<text text-anchor="middle" x="207.5" y="-303.5" font-family="Helvetica,sans-Serif" font-size="10.00">error&#45;pages</text>
</g>
<!-- host:docker&#45;&gt;svc:error&#45;pages -->
<g id="edge5" class="edge">
<title>host:docker&#45;&gt;svc:error&#45;pages</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M42,-967.81C42,-859.67 42,-306 42,-306 42,-306 160.77,-306 160.77,-306"/>
<polygon fill="#6b7280" stroke="#6b7280" points="160.77,-309.5 170.77,-306 160.77,-302.5 160.77,-309.5"/>
</g>
<!-- svc:gitea -->
<g id="node7" class="node">
<title>svc:gitea</title>
<path fill="#dff2e1" stroke="black" d="M222.5,-392C222.5,-392 192.5,-392 192.5,-392 186.5,-392 180.5,-386 180.5,-380 180.5,-380 180.5,-368 180.5,-368 180.5,-362 186.5,-356 192.5,-356 192.5,-356 222.5,-356 222.5,-356 228.5,-356 234.5,-362 234.5,-368 234.5,-368 234.5,-380 234.5,-380 234.5,-386 228.5,-392 222.5,-392"/>
<text text-anchor="middle" x="207.5" y="-371.5" font-family="Helvetica,sans-Serif" font-size="10.00">gitea</text>
</g>
<!-- host:docker&#45;&gt;svc:gitea -->
<g id="edge6" class="edge">
<title>host:docker&#45;&gt;svc:gitea</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M46,-967.68C46,-865.85 46,-374 46,-374 46,-374 170.47,-374 170.47,-374"/>
<polygon fill="#6b7280" stroke="#6b7280" points="170.47,-377.5 180.47,-374 170.47,-370.5 170.47,-377.5"/>
</g>
<!-- svc:gitea&#45;runner -->
<g id="node8" class="node">
<title>svc:gitea&#45;runner</title>
<path fill="#dff2e1" stroke="black" d="M234,-460C234,-460 181,-460 181,-460 175,-460 169,-454 169,-448 169,-448 169,-436 169,-436 169,-430 175,-424 181,-424 181,-424 234,-424 234,-424 240,-424 246,-430 246,-436 246,-436 246,-448 246,-448 246,-454 240,-460 234,-460"/>
<text text-anchor="middle" x="207.5" y="-439.5" font-family="Helvetica,sans-Serif" font-size="10.00">gitea&#45;runner</text>
</g>
<!-- host:docker&#45;&gt;svc:gitea&#45;runner -->
<g id="edge7" class="edge">
<title>host:docker&#45;&gt;svc:gitea&#45;runner</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M50,-967.9C50,-873.51 50,-442 50,-442 50,-442 158.97,-442 158.97,-442"/>
<polygon fill="#6b7280" stroke="#6b7280" points="158.97,-445.5 168.97,-442 158.97,-438.5 158.97,-445.5"/>
</g>
<!-- svc:gotify -->
<g id="node9" class="node">
<title>svc:gotify</title>
<path fill="#dff2e1" stroke="black" d="M222.5,-528C222.5,-528 192.5,-528 192.5,-528 186.5,-528 180.5,-522 180.5,-516 180.5,-516 180.5,-504 180.5,-504 180.5,-498 186.5,-492 192.5,-492 192.5,-492 222.5,-492 222.5,-492 228.5,-492 234.5,-498 234.5,-504 234.5,-504 234.5,-516 234.5,-516 234.5,-522 228.5,-528 222.5,-528"/>
<text text-anchor="middle" x="207.5" y="-507.5" font-family="Helvetica,sans-Serif" font-size="10.00">gotify</text>
</g>
<!-- host:docker&#45;&gt;svc:gotify -->
<g id="edge8" class="edge">
<title>host:docker&#45;&gt;svc:gotify</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M55,-967.92C55,-880.97 55,-510 55,-510 55,-510 170.24,-510 170.24,-510"/>
<polygon fill="#6b7280" stroke="#6b7280" points="170.24,-513.5 180.24,-510 170.24,-506.5 170.24,-513.5"/>
</g>
<!-- svc:grafana -->
<g id="node10" class="node">
<title>svc:grafana</title>
<path fill="#dff2e1" stroke="black" d="M222.5,-596C222.5,-596 192.5,-596 192.5,-596 186.5,-596 180.5,-590 180.5,-584 180.5,-584 180.5,-572 180.5,-572 180.5,-566 186.5,-560 192.5,-560 192.5,-560 222.5,-560 222.5,-560 228.5,-560 234.5,-566 234.5,-572 234.5,-572 234.5,-584 234.5,-584 234.5,-590 228.5,-596 222.5,-596"/>
<text text-anchor="middle" x="207.5" y="-575.5" font-family="Helvetica,sans-Serif" font-size="10.00">grafana</text>
</g>
<!-- host:docker&#45;&gt;svc:grafana -->
<g id="edge9" class="edge">
<title>host:docker&#45;&gt;svc:grafana</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M59,-967.94C59,-888.98 59,-578 59,-578 59,-578 170.26,-578 170.26,-578"/>
<polygon fill="#6b7280" stroke="#6b7280" points="170.26,-581.5 180.26,-578 170.26,-574.5 170.26,-581.5"/>
</g>
<!-- svc:gramps&#45;redis -->
<g id="node11" class="node">
<title>svc:gramps&#45;redis</title>
<path fill="#dff2e1" stroke="black" d="M236,-664C236,-664 179,-664 179,-664 173,-664 167,-658 167,-652 167,-652 167,-640 167,-640 167,-634 173,-628 179,-628 179,-628 236,-628 236,-628 242,-628 248,-634 248,-640 248,-640 248,-652 248,-652 248,-658 242,-664 236,-664"/>
<text text-anchor="middle" x="207.5" y="-643.5" font-family="Helvetica,sans-Serif" font-size="10.00">gramps&#45;redis</text>
</g>
<!-- host:docker&#45;&gt;svc:gramps&#45;redis -->
<g id="edge10" class="edge">
<title>host:docker&#45;&gt;svc:gramps&#45;redis</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M63,-967.72C63,-897.1 63,-646 63,-646 63,-646 156.86,-646 156.86,-646"/>
<polygon fill="#6b7280" stroke="#6b7280" points="156.86,-649.5 166.86,-646 156.86,-642.5 156.86,-649.5"/>
</g>
<!-- svc:grampsweb -->
<g id="node12" class="node">
<title>svc:grampsweb</title>
<path fill="#dff2e1" stroke="black" d="M232.5,-732C232.5,-732 182.5,-732 182.5,-732 176.5,-732 170.5,-726 170.5,-720 170.5,-720 170.5,-708 170.5,-708 170.5,-702 176.5,-696 182.5,-696 182.5,-696 232.5,-696 232.5,-696 238.5,-696 244.5,-702 244.5,-708 244.5,-708 244.5,-720 244.5,-720 244.5,-726 238.5,-732 232.5,-732"/>
<text text-anchor="middle" x="207.5" y="-711.5" font-family="Helvetica,sans-Serif" font-size="10.00">grampsweb</text>
</g>
<!-- host:docker&#45;&gt;svc:grampsweb -->
<g id="edge11" class="edge">
<title>host:docker&#45;&gt;svc:grampsweb</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M67,-967.73C67,-906.75 67,-714 67,-714 67,-714 160.22,-714 160.22,-714"/>
<polygon fill="#6b7280" stroke="#6b7280" points="160.22,-717.5 170.22,-714 160.22,-710.5 160.22,-717.5"/>
</g>
<!-- svc:grampsweb_celery -->
<g id="node13" class="node">
<title>svc:grampsweb_celery</title>
<path fill="#dff2e1" stroke="black" d="M250,-800C250,-800 165,-800 165,-800 159,-800 153,-794 153,-788 153,-788 153,-776 153,-776 153,-770 159,-764 165,-764 165,-764 250,-764 250,-764 256,-764 262,-770 262,-776 262,-776 262,-788 262,-788 262,-794 256,-800 250,-800"/>
<text text-anchor="middle" x="207.5" y="-779.5" font-family="Helvetica,sans-Serif" font-size="10.00">grampsweb_celery</text>
</g>
<!-- host:docker&#45;&gt;svc:grampsweb_celery -->
<g id="edge12" class="edge">
<title>host:docker&#45;&gt;svc:grampsweb_celery</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M79,-982.4C110.7,-982.4 159,-982.4 159,-982.4 159,-982.4 159,-810.14 159,-810.14"/>
<polygon fill="#6b7280" stroke="#6b7280" points="162.5,-810.14 159,-800.14 155.5,-810.14 162.5,-810.14"/>
</g>
<!-- svc:influxdb -->
<g id="node14" class="node">
<title>svc:influxdb</title>
<path fill="#dff2e1" stroke="black" d="M223.5,-868C223.5,-868 191.5,-868 191.5,-868 185.5,-868 179.5,-862 179.5,-856 179.5,-856 179.5,-844 179.5,-844 179.5,-838 185.5,-832 191.5,-832 191.5,-832 223.5,-832 223.5,-832 229.5,-832 235.5,-838 235.5,-844 235.5,-844 235.5,-856 235.5,-856 235.5,-862 229.5,-868 223.5,-868"/>
<text text-anchor="middle" x="207.5" y="-847.5" font-family="Helvetica,sans-Serif" font-size="10.00">influxdb</text>
</g>
<!-- host:docker&#45;&gt;svc:influxdb -->
<g id="edge13" class="edge">
<title>host:docker&#45;&gt;svc:influxdb</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M71,-967.94C71,-930.95 71,-850 71,-850 71,-850 169.22,-850 169.22,-850"/>
<polygon fill="#6b7280" stroke="#6b7280" points="169.22,-853.5 179.22,-850 169.22,-846.5 169.22,-853.5"/>
</g>
<!-- svc:monitor&#45;kuma -->
<g id="node15" class="node">
<title>svc:monitor&#45;kuma</title>
<path fill="#dff2e1" stroke="black" d="M238.5,-936C238.5,-936 176.5,-936 176.5,-936 170.5,-936 164.5,-930 164.5,-924 164.5,-924 164.5,-912 164.5,-912 164.5,-906 170.5,-900 176.5,-900 176.5,-900 238.5,-900 238.5,-900 244.5,-900 250.5,-906 250.5,-912 250.5,-912 250.5,-924 250.5,-924 250.5,-930 244.5,-936 238.5,-936"/>
<text text-anchor="middle" x="207.5" y="-915.5" font-family="Helvetica,sans-Serif" font-size="10.00">monitor&#45;kuma</text>
</g>
<!-- host:docker&#45;&gt;svc:monitor&#45;kuma -->
<g id="edge14" class="edge">
<title>host:docker&#45;&gt;svc:monitor&#45;kuma</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M75,-967.78C75,-947.63 75,-918 75,-918 75,-918 154.48,-918 154.48,-918"/>
<polygon fill="#6b7280" stroke="#6b7280" points="154.48,-921.5 164.48,-918 154.48,-914.5 154.48,-921.5"/>
</g>
<!-- svc:mtls&#45;bridge -->
<g id="node16" class="node">
<title>svc:mtls&#45;bridge</title>
<path fill="#dff2e1" stroke="black" d="M232,-1004C232,-1004 183,-1004 183,-1004 177,-1004 171,-998 171,-992 171,-992 171,-980 171,-980 171,-974 177,-968 183,-968 183,-968 232,-968 232,-968 238,-968 244,-974 244,-980 244,-980 244,-992 244,-992 244,-998 238,-1004 232,-1004"/>
<text text-anchor="middle" x="207.5" y="-983.5" font-family="Helvetica,sans-Serif" font-size="10.00">mtls&#45;bridge</text>
</g>
<!-- host:docker&#45;&gt;svc:mtls&#45;bridge -->
<g id="edge15" class="edge">
<title>host:docker&#45;&gt;svc:mtls&#45;bridge</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M79.09,-989.6C79.09,-989.6 160.82,-989.6 160.82,-989.6"/>
<polygon fill="#6b7280" stroke="#6b7280" points="160.82,-993.1 170.82,-989.6 160.82,-986.1 160.82,-993.1"/>
</g>
<!-- svc:nextcloud&#45;db -->
<g id="node17" class="node">
<title>svc:nextcloud&#45;db</title>
<path fill="#dff2e1" stroke="black" d="M235.5,-1072C235.5,-1072 179.5,-1072 179.5,-1072 173.5,-1072 167.5,-1066 167.5,-1060 167.5,-1060 167.5,-1048 167.5,-1048 167.5,-1042 173.5,-1036 179.5,-1036 179.5,-1036 235.5,-1036 235.5,-1036 241.5,-1036 247.5,-1042 247.5,-1048 247.5,-1048 247.5,-1060 247.5,-1060 247.5,-1066 241.5,-1072 235.5,-1072"/>
<text text-anchor="middle" x="207.5" y="-1051.5" font-family="Helvetica,sans-Serif" font-size="10.00">nextcloud&#45;db</text>
</g>
<!-- host:docker&#45;&gt;svc:nextcloud&#45;db -->
<g id="edge16" class="edge">
<title>host:docker&#45;&gt;svc:nextcloud&#45;db</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M76,-1004.22C76,-1024.37 76,-1054 76,-1054 76,-1054 157.33,-1054 157.33,-1054"/>
<polygon fill="#6b7280" stroke="#6b7280" points="157.33,-1057.5 167.33,-1054 157.33,-1050.5 157.33,-1057.5"/>
</g>
<!-- svc:nextcloud&#45;redis -->
<g id="node18" class="node">
<title>svc:nextcloud&#45;redis</title>
<path fill="#dff2e1" stroke="black" d="M241.5,-1140C241.5,-1140 173.5,-1140 173.5,-1140 167.5,-1140 161.5,-1134 161.5,-1128 161.5,-1128 161.5,-1116 161.5,-1116 161.5,-1110 167.5,-1104 173.5,-1104 173.5,-1104 241.5,-1104 241.5,-1104 247.5,-1104 253.5,-1110 253.5,-1116 253.5,-1116 253.5,-1128 253.5,-1128 253.5,-1134 247.5,-1140 241.5,-1140"/>
<text text-anchor="middle" x="207.5" y="-1119.5" font-family="Helvetica,sans-Serif" font-size="10.00">nextcloud&#45;redis</text>
</g>
<!-- host:docker&#45;&gt;svc:nextcloud&#45;redis -->
<g id="edge17" class="edge">
<title>host:docker&#45;&gt;svc:nextcloud&#45;redis</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M72,-1004.06C72,-1041.05 72,-1122 72,-1122 72,-1122 151.25,-1122 151.25,-1122"/>
<polygon fill="#6b7280" stroke="#6b7280" points="151.25,-1125.5 161.25,-1122 151.25,-1118.5 151.25,-1125.5"/>
</g>
<!-- svc:nextcloud&#45;webapp -->
<g id="node19" class="node">
<title>svc:nextcloud&#45;webapp</title>
<path fill="#dff2e1" stroke="black" d="M249,-1208C249,-1208 166,-1208 166,-1208 160,-1208 154,-1202 154,-1196 154,-1196 154,-1184 154,-1184 154,-1178 160,-1172 166,-1172 166,-1172 249,-1172 249,-1172 255,-1172 261,-1178 261,-1184 261,-1184 261,-1196 261,-1196 261,-1202 255,-1208 249,-1208"/>
<text text-anchor="middle" x="207.5" y="-1187.5" font-family="Helvetica,sans-Serif" font-size="10.00">nextcloud&#45;webapp</text>
</g>
<!-- host:docker&#45;&gt;svc:nextcloud&#45;webapp -->
<g id="edge18" class="edge">
<title>host:docker&#45;&gt;svc:nextcloud&#45;webapp</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M79.04,-996.8C110.15,-996.8 157,-996.8 157,-996.8 157,-996.8 157,-1161.82 157,-1161.82"/>
<polygon fill="#6b7280" stroke="#6b7280" points="153.5,-1161.82 157,-1171.82 160.5,-1161.82 153.5,-1161.82"/>
</g>
<!-- svc:node&#45;exporter -->
<g id="node20" class="node">
<title>svc:node&#45;exporter</title>
<path fill="#dff2e1" stroke="black" d="M238.5,-1276C238.5,-1276 176.5,-1276 176.5,-1276 170.5,-1276 164.5,-1270 164.5,-1264 164.5,-1264 164.5,-1252 164.5,-1252 164.5,-1246 170.5,-1240 176.5,-1240 176.5,-1240 238.5,-1240 238.5,-1240 244.5,-1240 250.5,-1246 250.5,-1252 250.5,-1252 250.5,-1264 250.5,-1264 250.5,-1270 244.5,-1276 238.5,-1276"/>
<text text-anchor="middle" x="207.5" y="-1255.5" font-family="Helvetica,sans-Serif" font-size="10.00">node&#45;exporter</text>
</g>
<!-- host:docker&#45;&gt;svc:node&#45;exporter -->
<g id="edge19" class="edge">
<title>host:docker&#45;&gt;svc:node&#45;exporter</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M68,-1004.27C68,-1065.25 68,-1258 68,-1258 68,-1258 154.13,-1258 154.13,-1258"/>
<polygon fill="#6b7280" stroke="#6b7280" points="154.13,-1261.5 164.13,-1258 154.13,-1254.5 154.13,-1261.5"/>
</g>
<!-- svc:node&#45;red -->
<g id="node21" class="node">
<title>svc:node&#45;red</title>
<path fill="#dff2e1" stroke="black" d="M225.5,-1344C225.5,-1344 189.5,-1344 189.5,-1344 183.5,-1344 177.5,-1338 177.5,-1332 177.5,-1332 177.5,-1320 177.5,-1320 177.5,-1314 183.5,-1308 189.5,-1308 189.5,-1308 225.5,-1308 225.5,-1308 231.5,-1308 237.5,-1314 237.5,-1320 237.5,-1320 237.5,-1332 237.5,-1332 237.5,-1338 231.5,-1344 225.5,-1344"/>
<text text-anchor="middle" x="207.5" y="-1323.5" font-family="Helvetica,sans-Serif" font-size="10.00">node&#45;red</text>
</g>
<!-- host:docker&#45;&gt;svc:node&#45;red -->
<g id="edge20" class="edge">
<title>host:docker&#45;&gt;svc:node&#45;red</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M64,-1004.28C64,-1074.9 64,-1326 64,-1326 64,-1326 167.42,-1326 167.42,-1326"/>
<polygon fill="#6b7280" stroke="#6b7280" points="167.42,-1329.5 177.42,-1326 167.42,-1322.5 167.42,-1329.5"/>
</g>
<!-- svc:passbolt&#45;db -->
<g id="node22" class="node">
<title>svc:passbolt&#45;db</title>
<path fill="#dff2e1" stroke="black" d="M232.5,-1412C232.5,-1412 182.5,-1412 182.5,-1412 176.5,-1412 170.5,-1406 170.5,-1400 170.5,-1400 170.5,-1388 170.5,-1388 170.5,-1382 176.5,-1376 182.5,-1376 182.5,-1376 232.5,-1376 232.5,-1376 238.5,-1376 244.5,-1382 244.5,-1388 244.5,-1388 244.5,-1400 244.5,-1400 244.5,-1406 238.5,-1412 232.5,-1412"/>
<text text-anchor="middle" x="207.5" y="-1391.5" font-family="Helvetica,sans-Serif" font-size="10.00">passbolt&#45;db</text>
</g>
<!-- host:docker&#45;&gt;svc:passbolt&#45;db -->
<g id="edge21" class="edge">
<title>host:docker&#45;&gt;svc:passbolt&#45;db</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M60,-1004.06C60,-1083.02 60,-1394 60,-1394 60,-1394 160.28,-1394 160.28,-1394"/>
<polygon fill="#6b7280" stroke="#6b7280" points="160.28,-1397.5 170.28,-1394 160.28,-1390.5 160.28,-1397.5"/>
</g>
<!-- svc:passbolt&#45;webapp -->
<g id="node23" class="node">
<title>svc:passbolt&#45;webapp</title>
<path fill="#dff2e1" stroke="black" d="M245.5,-1480C245.5,-1480 169.5,-1480 169.5,-1480 163.5,-1480 157.5,-1474 157.5,-1468 157.5,-1468 157.5,-1456 157.5,-1456 157.5,-1450 163.5,-1444 169.5,-1444 169.5,-1444 245.5,-1444 245.5,-1444 251.5,-1444 257.5,-1450 257.5,-1456 257.5,-1456 257.5,-1468 257.5,-1468 257.5,-1474 251.5,-1480 245.5,-1480"/>
<text text-anchor="middle" x="207.5" y="-1459.5" font-family="Helvetica,sans-Serif" font-size="10.00">passbolt&#45;webapp</text>
</g>
<!-- host:docker&#45;&gt;svc:passbolt&#45;webapp -->
<g id="edge22" class="edge">
<title>host:docker&#45;&gt;svc:passbolt&#45;webapp</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M56,-1004.08C56,-1091.03 56,-1462 56,-1462 56,-1462 147.47,-1462 147.47,-1462"/>
<polygon fill="#6b7280" stroke="#6b7280" points="147.47,-1465.5 157.47,-1462 147.47,-1458.5 147.47,-1465.5"/>
</g>
<!-- svc:portainer -->
<g id="node24" class="node">
<title>svc:portainer</title>
<path fill="#dff2e1" stroke="black" d="M226,-1548C226,-1548 189,-1548 189,-1548 183,-1548 177,-1542 177,-1536 177,-1536 177,-1524 177,-1524 177,-1518 183,-1512 189,-1512 189,-1512 226,-1512 226,-1512 232,-1512 238,-1518 238,-1524 238,-1524 238,-1536 238,-1536 238,-1542 232,-1548 226,-1548"/>
<text text-anchor="middle" x="207.5" y="-1527.5" font-family="Helvetica,sans-Serif" font-size="10.00">portainer</text>
</g>
<!-- host:docker&#45;&gt;svc:portainer -->
<g id="edge23" class="edge">
<title>host:docker&#45;&gt;svc:portainer</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M52,-1004.1C52,-1098.49 52,-1530 52,-1530 52,-1530 166.78,-1530 166.78,-1530"/>
<polygon fill="#6b7280" stroke="#6b7280" points="166.78,-1533.5 176.78,-1530 166.78,-1526.5 166.78,-1533.5"/>
</g>
<!-- svc:prometheus -->
<g id="node25" class="node">
<title>svc:prometheus</title>
<path fill="#dff2e1" stroke="black" d="M233,-1616C233,-1616 182,-1616 182,-1616 176,-1616 170,-1610 170,-1604 170,-1604 170,-1592 170,-1592 170,-1586 176,-1580 182,-1580 182,-1580 233,-1580 233,-1580 239,-1580 245,-1586 245,-1592 245,-1592 245,-1604 245,-1604 245,-1610 239,-1616 233,-1616"/>
<text text-anchor="middle" x="207.5" y="-1595.5" font-family="Helvetica,sans-Serif" font-size="10.00">prometheus</text>
</g>
<!-- host:docker&#45;&gt;svc:prometheus -->
<g id="edge24" class="edge">
<title>host:docker&#45;&gt;svc:prometheus</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M49,-1004.32C49,-1106.15 49,-1598 49,-1598 49,-1598 159.94,-1598 159.94,-1598"/>
<polygon fill="#6b7280" stroke="#6b7280" points="159.94,-1601.5 169.94,-1598 159.94,-1594.5 159.94,-1601.5"/>
</g>
<!-- svc:searxng&#45;webapp -->
<g id="node26" class="node">
<title>svc:searxng&#45;webapp</title>
<path fill="#dff2e1" stroke="black" d="M244.5,-1684C244.5,-1684 170.5,-1684 170.5,-1684 164.5,-1684 158.5,-1678 158.5,-1672 158.5,-1672 158.5,-1660 158.5,-1660 158.5,-1654 164.5,-1648 170.5,-1648 170.5,-1648 244.5,-1648 244.5,-1648 250.5,-1648 256.5,-1654 256.5,-1660 256.5,-1660 256.5,-1672 256.5,-1672 256.5,-1678 250.5,-1684 244.5,-1684"/>
<text text-anchor="middle" x="207.5" y="-1663.5" font-family="Helvetica,sans-Serif" font-size="10.00">searxng&#45;webapp</text>
</g>
<!-- host:docker&#45;&gt;svc:searxng&#45;webapp -->
<g id="edge25" class="edge">
<title>host:docker&#45;&gt;svc:searxng&#45;webapp</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M45,-1004.19C45,-1112.33 45,-1666 45,-1666 45,-1666 148.3,-1666 148.3,-1666"/>
<polygon fill="#6b7280" stroke="#6b7280" points="148.3,-1669.5 158.3,-1666 148.3,-1662.5 148.3,-1669.5"/>
</g>
<!-- svc:shift&#45;recorder&#45;web -->
<g id="node27" class="node">
<title>svc:shift&#45;recorder&#45;web</title>
<path fill="#dff2e1" stroke="black" d="M248.5,-1752C248.5,-1752 166.5,-1752 166.5,-1752 160.5,-1752 154.5,-1746 154.5,-1740 154.5,-1740 154.5,-1728 154.5,-1728 154.5,-1722 160.5,-1716 166.5,-1716 166.5,-1716 248.5,-1716 248.5,-1716 254.5,-1716 260.5,-1722 260.5,-1728 260.5,-1728 260.5,-1740 260.5,-1740 260.5,-1746 254.5,-1752 248.5,-1752"/>
<text text-anchor="middle" x="207.5" y="-1731.5" font-family="Helvetica,sans-Serif" font-size="10.00">shift&#45;recorder&#45;web</text>
</g>
<!-- host:docker&#45;&gt;svc:shift&#45;recorder&#45;web -->
<g id="edge26" class="edge">
<title>host:docker&#45;&gt;svc:shift&#45;recorder&#45;web</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M41,-1004.12C41,-1118.35 41,-1734 41,-1734 41,-1734 144.36,-1734 144.36,-1734"/>
<polygon fill="#6b7280" stroke="#6b7280" points="144.36,-1737.5 154.36,-1734 144.36,-1730.5 144.36,-1737.5"/>
</g>
<!-- svc:stockfill -->
<g id="node28" class="node">
<title>svc:stockfill</title>
<path fill="#dff2e1" stroke="black" d="M223,-1820C223,-1820 192,-1820 192,-1820 186,-1820 180,-1814 180,-1808 180,-1808 180,-1796 180,-1796 180,-1790 186,-1784 192,-1784 192,-1784 223,-1784 223,-1784 229,-1784 235,-1790 235,-1796 235,-1796 235,-1808 235,-1808 235,-1814 229,-1820 223,-1820"/>
<text text-anchor="middle" x="207.5" y="-1799.5" font-family="Helvetica,sans-Serif" font-size="10.00">stockfill</text>
</g>
<!-- host:docker&#45;&gt;svc:stockfill -->
<g id="edge27" class="edge">
<title>host:docker&#45;&gt;svc:stockfill</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M37,-1004.19C37,-1124.59 37,-1802 37,-1802 37,-1802 169.73,-1802 169.73,-1802"/>
<polygon fill="#6b7280" stroke="#6b7280" points="169.73,-1805.5 179.73,-1802 169.73,-1798.5 169.73,-1805.5"/>
</g>
<!-- svc:telegraf -->
<g id="node29" class="node">
<title>svc:telegraf</title>
<path fill="#dff2e1" stroke="black" d="M223,-1888C223,-1888 192,-1888 192,-1888 186,-1888 180,-1882 180,-1876 180,-1876 180,-1864 180,-1864 180,-1858 186,-1852 192,-1852 192,-1852 223,-1852 223,-1852 229,-1852 235,-1858 235,-1864 235,-1864 235,-1876 235,-1876 235,-1882 229,-1888 223,-1888"/>
<text text-anchor="middle" x="207.5" y="-1867.5" font-family="Helvetica,sans-Serif" font-size="10.00">telegraf</text>
</g>
<!-- host:docker&#45;&gt;svc:telegraf -->
<g id="edge28" class="edge">
<title>host:docker&#45;&gt;svc:telegraf</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M33,-1004.06C33,-1129.83 33,-1870 33,-1870 33,-1870 169.85,-1870 169.85,-1870"/>
<polygon fill="#6b7280" stroke="#6b7280" points="169.85,-1873.5 179.85,-1870 169.85,-1866.5 169.85,-1873.5"/>
</g>
<!-- svc:traefik -->
<g id="node30" class="node">
<title>svc:traefik</title>
<path fill="#dff2e1" stroke="black" d="M222.5,-1956C222.5,-1956 192.5,-1956 192.5,-1956 186.5,-1956 180.5,-1950 180.5,-1944 180.5,-1944 180.5,-1932 180.5,-1932 180.5,-1926 186.5,-1920 192.5,-1920 192.5,-1920 222.5,-1920 222.5,-1920 228.5,-1920 234.5,-1926 234.5,-1932 234.5,-1932 234.5,-1944 234.5,-1944 234.5,-1950 228.5,-1956 222.5,-1956"/>
<text text-anchor="middle" x="207.5" y="-1935.5" font-family="Helvetica,sans-Serif" font-size="10.00">traefik</text>
</g>
<!-- host:docker&#45;&gt;svc:traefik -->
<g id="edge29" class="edge">
<title>host:docker&#45;&gt;svc:traefik</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M29,-1004.17C29,-1135.78 29,-1938 29,-1938 29,-1938 170.39,-1938 170.39,-1938"/>
<polygon fill="#6b7280" stroke="#6b7280" points="170.39,-1941.5 180.39,-1938 170.39,-1934.5 170.39,-1941.5"/>
</g>
<!-- host:raspberrypi -->
<g id="node31" class="node">
<title>host:raspberrypi</title>
<polygon fill="#d4e3ff" stroke="black" points="88,-2039 20,-2039 16,-2035 16,-2003 84,-2003 88,-2007 88,-2039"/>
<polyline fill="none" stroke="black" points="84,-2035 16,-2035 "/>
<polyline fill="none" stroke="black" points="84,-2035 84,-2003 "/>
<polyline fill="none" stroke="black" points="84,-2035 88,-2039 "/>
<text text-anchor="middle" x="52" y="-2018.5" font-family="Helvetica,sans-Serif" font-size="10.00">raspberrypi</text>
</g>
<!-- svc:pihole&#45;exporter -->
<g id="node32" class="node">
<title>svc:pihole&#45;exporter</title>
<path fill="#dff2e1" stroke="black" d="M241.5,-2039C241.5,-2039 173.5,-2039 173.5,-2039 167.5,-2039 161.5,-2033 161.5,-2027 161.5,-2027 161.5,-2015 161.5,-2015 161.5,-2009 167.5,-2003 173.5,-2003 173.5,-2003 241.5,-2003 241.5,-2003 247.5,-2003 253.5,-2009 253.5,-2015 253.5,-2015 253.5,-2027 253.5,-2027 253.5,-2033 247.5,-2039 241.5,-2039"/>
<text text-anchor="middle" x="207.5" y="-2018.5" font-family="Helvetica,sans-Serif" font-size="10.00">pihole&#45;exporter</text>
</g>
<!-- host:raspberrypi&#45;&gt;svc:pihole&#45;exporter -->
<g id="edge30" class="edge">
<title>host:raspberrypi&#45;&gt;svc:pihole&#45;exporter</title>
<path fill="none" stroke="#6b7280" stroke-dasharray="5,2" d="M88.07,-2021C88.07,-2021 151.29,-2021 151.29,-2021"/>
<polygon fill="#6b7280" stroke="#6b7280" points="151.29,-2024.5 161.29,-2021 151.29,-2017.5 151.29,-2024.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 29 KiB