Merge pull request #72 from beatz174-bit/codex/improve-documentation-with-generated-diagrams

Generate physical and Docker/Traefik/Dynu diagrams; require Graphviz and validate in CI
This commit is contained in:
beatz174-bit
2026-05-13 09:18:29 +10:00
committed by GitHub
18 changed files with 5515 additions and 33 deletions
+14
View File
@@ -29,3 +29,17 @@ jobs:
run: |
test -d docs/public
test -n "$(find docs/public -mindepth 1 -print -quit)"
- name: Install Graphviz and MkDocs
run: |
sudo apt-get update
sudo apt-get install -y graphviz
dot -V
python3 -m pip install --user mkdocs
- name: Validate public docs and diagrams
run: |
test -f docs/public/physical-topology.svg
test -f docs/public/docker-traefik-dynu.svg
! rg -n "Graphviz dot not found" docs/public/*.svg
! rg -n "lan\.ddnsgeek\.com" docs/public/*.svg docs/public/*.md
! rg -n -i "password|token|api_key|secret" docs/public/*.svg
python3 -m mkdocs build -f mkdocs-public.yml --strict
+14 -1
View File
@@ -28,13 +28,26 @@ jobs:
test -d docs/public
test -n "$(find docs/public -mindepth 1 -print -quit)"
- name: Install Graphviz
run: |
sudo apt-get update
sudo apt-get install -y graphviz
dot -V
- name: Validate sanitized diagram artifacts
run: |
test -f docs/public/physical-topology.svg
test -f docs/public/docker-traefik-dynu.svg
! rg -n "Graphviz dot not found" docs/public/*.svg
! rg -n "lan\.ddnsgeek\.com" docs/public/*.svg docs/public/*.md
! rg -n -i "password|token|api_key|secret" docs/public/*.svg
- name: Install MkDocs
run: |
python3 -m pip install --user mkdocs
- name: Build public MkDocs site
run: |
python3 -m mkdocs build -f mkdocs-public.yml --strict
- name: Verify published content excludes internal/generated docs
+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
+1 -1
View File
@@ -1,6 +1,6 @@
digraph Compose {
rankdir=LR;
node [fontname=Helvetica];
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"];
+463 -1
View File
@@ -1 +1,463 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="80"><text x="10" y="40">Graphviz dot not found in environment.</text></svg>
<?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: Compose Pages: 1 -->
<svg width="334pt" height="1610pt"
viewBox="0.00 0.00 334.49 1610.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 1606)">
<title>Compose</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-1606 330.49,-1606 330.49,4 -4,4"/>
<!-- svc:authelia -->
<g id="node1" class="node">
<title>svc:authelia</title>
<polygon fill="#dfefff" stroke="black" points="126,-900 54,-900 54,-864 126,-864 126,-900"/>
<text text-anchor="middle" x="90" y="-878.3" font-family="Helvetica,sans-Serif" font-size="14.00">authelia</text>
</g>
<!-- net:traefik -->
<g id="node35" class="node">
<title>net:traefik</title>
<ellipse fill="#f4f4f4" stroke="black" cx="271.25" cy="-828" rx="40.09" ry="18"/>
<text text-anchor="middle" x="271.25" y="-824.3" font-family="Helvetica,sans-Serif" font-size="14.00">traefik</text>
</g>
<!-- svc:authelia&#45;&gt;net:traefik -->
<g id="edge1" class="edge">
<title>svc:authelia&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M126.41,-871.33C155.5,-862.57 196.8,-850.13 227.69,-840.82"/>
<polygon fill="black" stroke="black" points="228.76,-844.15 237.32,-837.92 226.74,-837.45 228.76,-844.15"/>
</g>
<!-- svc:crowdsec -->
<g id="node2" class="node">
<title>svc:crowdsec</title>
<polygon fill="#dfefff" stroke="black" points="130.5,-846 49.5,-846 49.5,-810 130.5,-810 130.5,-846"/>
<text text-anchor="middle" x="90" y="-824.3" font-family="Helvetica,sans-Serif" font-size="14.00">crowdsec</text>
</g>
<!-- svc:crowdsec&#45;&gt;net:traefik -->
<g id="edge2" class="edge">
<title>svc:crowdsec&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M130.78,-828C157.33,-828 192.43,-828 220.78,-828"/>
<polygon fill="black" stroke="black" points="220.88,-831.5 230.88,-828 220.88,-824.5 220.88,-831.5"/>
</g>
<!-- svc:docker&#45;socket&#45;proxy -->
<g id="node3" class="node">
<title>svc:docker&#45;socket&#45;proxy</title>
<polygon fill="#dfefff" stroke="black" points="167.5,-1116 12.5,-1116 12.5,-1080 167.5,-1080 167.5,-1116"/>
<text text-anchor="middle" x="90" y="-1094.3" font-family="Helvetica,sans-Serif" font-size="14.00">docker&#45;socket&#45;proxy</text>
</g>
<!-- net:monitor -->
<g id="node32" class="node">
<title>net:monitor</title>
<ellipse fill="#f4f4f4" stroke="black" cx="271.25" cy="-1314" rx="46.29" ry="18"/>
<text text-anchor="middle" x="271.25" y="-1310.3" font-family="Helvetica,sans-Serif" font-size="14.00">monitor</text>
</g>
<!-- svc:docker&#45;socket&#45;proxy&#45;&gt;net:monitor -->
<g id="edge3" class="edge">
<title>svc:docker&#45;socket&#45;proxy&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M167.18,-1116.1C171.75,-1118.68 176.08,-1121.63 180,-1125 229.98,-1167.95 254.42,-1244.8 264.44,-1286.04"/>
<polygon fill="black" stroke="black" points="261.07,-1287 266.73,-1295.95 267.88,-1285.42 261.07,-1287"/>
</g>
<!-- svc:docker&#45;socket&#45;proxy&#45;&gt;net:traefik -->
<g id="edge4" class="edge">
<title>svc:docker&#45;socket&#45;proxy&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M167.53,-1080.29C172.02,-1077.62 176.24,-1074.54 180,-1071 242.3,-1012.4 261.83,-906.88 267.77,-856.4"/>
<polygon fill="black" stroke="black" points="271.27,-856.54 268.86,-846.22 264.31,-855.79 271.27,-856.54"/>
</g>
<!-- svc:docker&#45;update&#45;exporter -->
<g id="node4" class="node">
<title>svc:docker&#45;update&#45;exporter</title>
<polygon fill="#dfefff" stroke="black" points="180,-1494 0,-1494 0,-1458 180,-1458 180,-1494"/>
<text text-anchor="middle" x="90" y="-1472.3" font-family="Helvetica,sans-Serif" font-size="14.00">docker&#45;update&#45;exporter</text>
</g>
<!-- svc:docker&#45;update&#45;exporter&#45;&gt;net:monitor -->
<g id="edge5" class="edge">
<title>svc:docker&#45;update&#45;exporter&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M165.31,-1457.9C170.5,-1455.32 175.46,-1452.37 180,-1449 218.01,-1420.82 244.97,-1371.56 259.03,-1340.98"/>
<polygon fill="black" stroke="black" points="262.27,-1342.31 263.14,-1331.76 255.87,-1339.46 262.27,-1342.31"/>
</g>
<!-- svc:error&#45;pages -->
<g id="node5" class="node">
<title>svc:error&#45;pages</title>
<polygon fill="#dfefff" stroke="black" points="137.5,-792 42.5,-792 42.5,-756 137.5,-756 137.5,-792"/>
<text text-anchor="middle" x="90" y="-770.3" font-family="Helvetica,sans-Serif" font-size="14.00">error&#45;pages</text>
</g>
<!-- svc:error&#45;pages&#45;&gt;net:traefik -->
<g id="edge6" class="edge">
<title>svc:error&#45;pages&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M137.63,-788.05C165.53,-796.45 200.71,-807.05 227.83,-815.22"/>
<polygon fill="black" stroke="black" points="226.84,-818.58 237.43,-818.11 228.86,-811.88 226.84,-818.58"/>
</g>
<!-- svc:gitea -->
<g id="node6" class="node">
<title>svc:gitea</title>
<polygon fill="#dfefff" stroke="black" points="117,-738 63,-738 63,-702 117,-702 117,-738"/>
<text text-anchor="middle" x="90" y="-716.3" font-family="Helvetica,sans-Serif" font-size="14.00">gitea</text>
</g>
<!-- svc:gitea&#45;&gt;net:traefik -->
<g id="edge7" class="edge">
<title>svc:gitea&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M117.13,-724.77C135.53,-728.87 160.3,-735.91 180,-747 206.25,-761.78 231.35,-785.35 248.38,-803.26"/>
<polygon fill="black" stroke="black" points="246.24,-806.1 255.62,-811.03 251.37,-801.33 246.24,-806.1"/>
</g>
<!-- svc:gitea&#45;runner -->
<g id="node7" class="node">
<title>svc:gitea&#45;runner</title>
<polygon fill="#dfefff" stroke="black" points="142,-684 38,-684 38,-648 142,-648 142,-684"/>
<text text-anchor="middle" x="90" y="-662.3" font-family="Helvetica,sans-Serif" font-size="14.00">gitea&#45;runner</text>
</g>
<!-- svc:gitea&#45;runner&#45;&gt;net:traefik -->
<g id="edge8" class="edge">
<title>svc:gitea&#45;runner&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M142.32,-675.1C155.46,-679.1 168.98,-684.83 180,-693 218.01,-721.18 244.97,-770.44 259.03,-801.02"/>
<polygon fill="black" stroke="black" points="255.87,-802.54 263.14,-810.24 262.27,-799.69 255.87,-802.54"/>
</g>
<!-- svc:gotify -->
<g id="node8" class="node">
<title>svc:gotify</title>
<polygon fill="#dfefff" stroke="black" points="118,-630 62,-630 62,-594 118,-594 118,-630"/>
<text text-anchor="middle" x="90" y="-608.3" font-family="Helvetica,sans-Serif" font-size="14.00">gotify</text>
</g>
<!-- svc:gotify&#45;&gt;net:traefik -->
<g id="edge9" class="edge">
<title>svc:gotify&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M118.29,-614.47C137.49,-617.48 162.73,-624.16 180,-639 229.98,-681.95 254.42,-758.8 264.44,-800.04"/>
<polygon fill="black" stroke="black" points="261.07,-801 266.73,-809.95 267.88,-799.42 261.07,-801"/>
</g>
<!-- svc:grafana -->
<g id="node9" class="node">
<title>svc:grafana</title>
<polygon fill="#dfefff" stroke="black" points="125.5,-1062 54.5,-1062 54.5,-1026 125.5,-1026 125.5,-1062"/>
<text text-anchor="middle" x="90" y="-1040.3" font-family="Helvetica,sans-Serif" font-size="14.00">grafana</text>
</g>
<!-- svc:grafana&#45;&gt;net:monitor -->
<g id="edge10" class="edge">
<title>svc:grafana&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M125.52,-1047.11C143.74,-1050.41 165.3,-1057.17 180,-1071 242.3,-1129.6 261.83,-1235.12 267.77,-1285.6"/>
<polygon fill="black" stroke="black" points="264.31,-1286.21 268.86,-1295.78 271.27,-1285.46 264.31,-1286.21"/>
</g>
<!-- svc:grafana&#45;&gt;net:traefik -->
<g id="edge11" class="edge">
<title>svc:grafana&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M125.91,-1040.19C143.8,-1036.68 164.94,-1029.94 180,-1017 229.98,-974.05 254.42,-897.2 264.44,-855.96"/>
<polygon fill="black" stroke="black" points="267.88,-856.58 266.73,-846.05 261.07,-855 267.88,-856.58"/>
</g>
<!-- svc:gramps&#45;redis -->
<g id="node10" class="node">
<title>svc:gramps&#45;redis</title>
<polygon fill="#dfefff" stroke="black" points="144.5,-360 35.5,-360 35.5,-324 144.5,-324 144.5,-360"/>
<text text-anchor="middle" x="90" y="-338.3" font-family="Helvetica,sans-Serif" font-size="14.00">gramps&#45;redis</text>
</g>
<!-- net:gramps -->
<g id="node31" class="node">
<title>net:gramps</title>
<ellipse fill="#f4f4f4" stroke="black" cx="271.25" cy="-342" rx="45.49" ry="18"/>
<text text-anchor="middle" x="271.25" y="-338.3" font-family="Helvetica,sans-Serif" font-size="14.00">gramps</text>
</g>
<!-- svc:gramps&#45;redis&#45;&gt;net:gramps -->
<g id="edge12" class="edge">
<title>svc:gramps&#45;redis&#45;&gt;net:gramps</title>
<path fill="none" stroke="black" d="M144.78,-342C167.14,-342 193.05,-342 215.51,-342"/>
<polygon fill="black" stroke="black" points="215.56,-345.5 225.56,-342 215.56,-338.5 215.56,-345.5"/>
</g>
<!-- svc:grampsweb -->
<g id="node11" class="node">
<title>svc:grampsweb</title>
<polygon fill="#dfefff" stroke="black" points="139,-414 41,-414 41,-378 139,-378 139,-414"/>
<text text-anchor="middle" x="90" y="-392.3" font-family="Helvetica,sans-Serif" font-size="14.00">grampsweb</text>
</g>
<!-- svc:grampsweb&#45;&gt;net:gramps -->
<g id="edge13" class="edge">
<title>svc:grampsweb&#45;&gt;net:gramps</title>
<path fill="none" stroke="black" d="M139.03,-381.53C165.7,-373.5 198.68,-363.56 224.9,-355.66"/>
<polygon fill="black" stroke="black" points="226.03,-358.98 234.59,-352.74 224.01,-352.27 226.03,-358.98"/>
</g>
<!-- svc:grampsweb&#45;&gt;net:traefik -->
<g id="edge14" class="edge">
<title>svc:grampsweb&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M139.02,-401.02C153.99,-404.86 169.35,-411.52 180,-423 231.57,-478.6 259.36,-716.7 267.6,-799.49"/>
<polygon fill="black" stroke="black" points="264.14,-800.06 268.59,-809.67 271.1,-799.38 264.14,-800.06"/>
</g>
<!-- svc:grampsweb_celery -->
<g id="node12" class="node">
<title>svc:grampsweb_celery</title>
<polygon fill="#dfefff" stroke="black" points="163.5,-306 16.5,-306 16.5,-270 163.5,-270 163.5,-306"/>
<text text-anchor="middle" x="90" y="-284.3" font-family="Helvetica,sans-Serif" font-size="14.00">grampsweb_celery</text>
</g>
<!-- svc:grampsweb_celery&#45;&gt;net:gramps -->
<g id="edge15" class="edge">
<title>svc:grampsweb_celery&#45;&gt;net:gramps</title>
<path fill="none" stroke="black" d="M151.18,-306.13C175.28,-313.39 202.57,-321.61 224.94,-328.35"/>
<polygon fill="black" stroke="black" points="223.94,-331.71 234.52,-331.24 225.96,-325 223.94,-331.71"/>
</g>
<!-- svc:influxdb -->
<g id="node13" class="node">
<title>svc:influxdb</title>
<polygon fill="#dfefff" stroke="black" points="127,-1386 53,-1386 53,-1350 127,-1350 127,-1386"/>
<text text-anchor="middle" x="90" y="-1364.3" font-family="Helvetica,sans-Serif" font-size="14.00">influxdb</text>
</g>
<!-- svc:influxdb&#45;&gt;net:monitor -->
<g id="edge16" class="edge">
<title>svc:influxdb&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M127.27,-1357.07C155.3,-1348.63 194.28,-1336.88 224.46,-1327.79"/>
<polygon fill="black" stroke="black" points="225.77,-1331.06 234.33,-1324.82 223.75,-1324.35 225.77,-1331.06"/>
</g>
<!-- svc:influxdb&#45;&gt;net:traefik -->
<g id="edge17" class="edge">
<title>svc:influxdb&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M127.44,-1365.74C145.77,-1362.68 166.83,-1355.86 180,-1341 244.76,-1267.93 264.48,-953.16 269.06,-856.4"/>
<polygon fill="black" stroke="black" points="272.57,-856.36 269.53,-846.21 265.58,-856.04 272.57,-856.36"/>
</g>
<!-- svc:monitor&#45;kuma -->
<g id="node14" class="node">
<title>svc:monitor&#45;kuma</title>
<polygon fill="#dfefff" stroke="black" points="146.5,-1332 33.5,-1332 33.5,-1296 146.5,-1296 146.5,-1332"/>
<text text-anchor="middle" x="90" y="-1310.3" font-family="Helvetica,sans-Serif" font-size="14.00">monitor&#45;kuma</text>
</g>
<!-- svc:monitor&#45;kuma&#45;&gt;net:monitor -->
<g id="edge18" class="edge">
<title>svc:monitor&#45;kuma&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M146.73,-1314C168.47,-1314 193.32,-1314 215.01,-1314"/>
<polygon fill="black" stroke="black" points="215.05,-1317.5 225.05,-1314 215.05,-1310.5 215.05,-1317.5"/>
</g>
<!-- svc:monitor&#45;kuma&#45;&gt;net:traefik -->
<g id="edge19" class="edge">
<title>svc:monitor&#45;kuma&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M146.61,-1307C159.1,-1302.97 171.23,-1296.7 180,-1287 238.17,-1222.67 262.1,-946.17 268.43,-856.32"/>
<polygon fill="black" stroke="black" points="271.93,-856.3 269.13,-846.08 264.95,-855.82 271.93,-856.3"/>
</g>
<!-- svc:mtls&#45;bridge -->
<g id="node15" class="node">
<title>svc:mtls&#45;bridge</title>
<polygon fill="#dfefff" stroke="black" points="138.5,-1278 41.5,-1278 41.5,-1242 138.5,-1242 138.5,-1278"/>
<text text-anchor="middle" x="90" y="-1256.3" font-family="Helvetica,sans-Serif" font-size="14.00">mtls&#45;bridge</text>
</g>
<!-- svc:mtls&#45;bridge&#45;&gt;net:monitor -->
<g id="edge20" class="edge">
<title>svc:mtls&#45;bridge&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M138.56,-1274.33C165.14,-1282.34 198.1,-1292.27 224.4,-1300.19"/>
<polygon fill="black" stroke="black" points="223.54,-1303.58 234.12,-1303.12 225.56,-1296.88 223.54,-1303.58"/>
</g>
<!-- svc:mtls&#45;bridge&#45;&gt;net:traefik -->
<g id="edge21" class="edge">
<title>svc:mtls&#45;bridge&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M138.56,-1255.1C153.68,-1251.28 169.24,-1244.6 180,-1233 231.57,-1177.4 259.36,-939.3 267.6,-856.51"/>
<polygon fill="black" stroke="black" points="271.1,-856.62 268.59,-846.33 264.14,-855.94 271.1,-856.62"/>
</g>
<!-- svc:nextcloud&#45;db -->
<g id="node16" class="node">
<title>svc:nextcloud&#45;db</title>
<polygon fill="#dfefff" stroke="black" points="144,-90 36,-90 36,-54 144,-54 144,-90"/>
<text text-anchor="middle" x="90" y="-68.3" font-family="Helvetica,sans-Serif" font-size="14.00">nextcloud&#45;db</text>
</g>
<!-- net:nextcloud -->
<g id="node33" class="node">
<title>net:nextcloud</title>
<ellipse fill="#f4f4f4" stroke="black" cx="271.25" cy="-180" rx="55.49" ry="18"/>
<text text-anchor="middle" x="271.25" y="-176.3" font-family="Helvetica,sans-Serif" font-size="14.00">nextcloud</text>
</g>
<!-- svc:nextcloud&#45;db&#45;&gt;net:nextcloud -->
<g id="edge22" class="edge">
<title>svc:nextcloud&#45;db&#45;&gt;net:nextcloud</title>
<path fill="none" stroke="black" d="M144.33,-84.04C156.48,-87.9 169.03,-92.82 180,-99 206.09,-113.7 231.04,-137.06 248.07,-154.93"/>
<polygon fill="black" stroke="black" points="245.93,-157.77 255.31,-162.7 251.06,-153 245.93,-157.77"/>
</g>
<!-- svc:nextcloud&#45;redis -->
<g id="node17" class="node">
<title>svc:nextcloud&#45;redis</title>
<polygon fill="#dfefff" stroke="black" points="152,-198 28,-198 28,-162 152,-162 152,-198"/>
<text text-anchor="middle" x="90" y="-176.3" font-family="Helvetica,sans-Serif" font-size="14.00">nextcloud&#45;redis</text>
</g>
<!-- svc:nextcloud&#45;redis&#45;&gt;net:nextcloud -->
<g id="edge23" class="edge">
<title>svc:nextcloud&#45;redis&#45;&gt;net:nextcloud</title>
<path fill="none" stroke="black" d="M152.18,-180C169.48,-180 188.35,-180 205.83,-180"/>
<polygon fill="black" stroke="black" points="205.94,-183.5 215.94,-180 205.94,-176.5 205.94,-183.5"/>
</g>
<!-- svc:nextcloud&#45;webapp -->
<g id="node18" class="node">
<title>svc:nextcloud&#45;webapp</title>
<polygon fill="#dfefff" stroke="black" points="162.5,-252 17.5,-252 17.5,-216 162.5,-216 162.5,-252"/>
<text text-anchor="middle" x="90" y="-230.3" font-family="Helvetica,sans-Serif" font-size="14.00">nextcloud&#45;webapp</text>
</g>
<!-- svc:nextcloud&#45;webapp&#45;&gt;net:nextcloud -->
<g id="edge24" class="edge">
<title>svc:nextcloud&#45;webapp&#45;&gt;net:nextcloud</title>
<path fill="none" stroke="black" d="M151.18,-215.87C173.57,-209.12 198.72,-201.55 220.11,-195.1"/>
<polygon fill="black" stroke="black" points="221.4,-198.37 229.97,-192.13 219.38,-191.67 221.4,-198.37"/>
</g>
<!-- svc:nextcloud&#45;webapp&#45;&gt;net:traefik -->
<g id="edge25" class="edge">
<title>svc:nextcloud&#45;webapp&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M162.56,-247.4C169.12,-250.94 175.12,-255.4 180,-261 215.98,-302.27 256.67,-690.32 267.49,-799.53"/>
<polygon fill="black" stroke="black" points="264.03,-800.16 268.49,-809.77 271,-799.47 264.03,-800.16"/>
</g>
<!-- svc:node&#45;exporter -->
<g id="node19" class="node">
<title>svc:node&#45;exporter</title>
<polygon fill="#dfefff" stroke="black" points="148,-1440 32,-1440 32,-1404 148,-1404 148,-1440"/>
<text text-anchor="middle" x="90" y="-1418.3" font-family="Helvetica,sans-Serif" font-size="14.00">node&#45;exporter</text>
</g>
<!-- svc:node&#45;exporter&#45;&gt;net:monitor -->
<g id="edge26" class="edge">
<title>svc:node&#45;exporter&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M148.08,-1408.74C159.04,-1405.08 170.15,-1400.55 180,-1395 206.25,-1380.22 231.35,-1356.65 248.38,-1338.74"/>
<polygon fill="black" stroke="black" points="251.37,-1340.67 255.62,-1330.97 246.24,-1335.9 251.37,-1340.67"/>
</g>
<!-- svc:node&#45;red -->
<g id="node20" class="node">
<title>svc:node&#45;red</title>
<polygon fill="#dfefff" stroke="black" points="129.5,-1224 50.5,-1224 50.5,-1188 129.5,-1188 129.5,-1224"/>
<text text-anchor="middle" x="90" y="-1202.3" font-family="Helvetica,sans-Serif" font-size="14.00">node&#45;red</text>
</g>
<!-- svc:node&#45;red&#45;&gt;net:monitor -->
<g id="edge27" class="edge">
<title>svc:node&#45;red&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M129.72,-1213.82C145.92,-1218.07 164.52,-1224.28 180,-1233 206.25,-1247.78 231.35,-1271.35 248.38,-1289.26"/>
<polygon fill="black" stroke="black" points="246.24,-1292.1 255.62,-1297.03 251.37,-1287.33 246.24,-1292.1"/>
</g>
<!-- svc:node&#45;red&#45;&gt;net:traefik -->
<g id="edge28" class="edge">
<title>svc:node&#45;red&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M129.66,-1202.83C147.22,-1199.45 166.93,-1192.64 180,-1179 225.12,-1131.91 256.34,-930.92 266.59,-856.16"/>
<polygon fill="black" stroke="black" points="270.08,-856.45 267.95,-846.08 263.14,-855.52 270.08,-856.45"/>
</g>
<!-- svc:passbolt&#45;db -->
<g id="node21" class="node">
<title>svc:passbolt&#45;db</title>
<polygon fill="#dfefff" stroke="black" points="139,-36 41,-36 41,0 139,0 139,-36"/>
<text text-anchor="middle" x="90" y="-14.3" font-family="Helvetica,sans-Serif" font-size="14.00">passbolt&#45;db</text>
</g>
<!-- net:passbolt -->
<g id="node34" class="node">
<title>net:passbolt</title>
<ellipse fill="#f4f4f4" stroke="black" cx="271.25" cy="-72" rx="48.99" ry="18"/>
<text text-anchor="middle" x="271.25" y="-68.3" font-family="Helvetica,sans-Serif" font-size="14.00">passbolt</text>
</g>
<!-- svc:passbolt&#45;db&#45;&gt;net:passbolt -->
<g id="edge29" class="edge">
<title>svc:passbolt&#45;db&#45;&gt;net:passbolt</title>
<path fill="none" stroke="black" d="M139.03,-32.47C165.15,-40.34 197.32,-50.03 223.27,-57.85"/>
<polygon fill="black" stroke="black" points="222.3,-61.21 232.88,-60.74 224.32,-54.51 222.3,-61.21"/>
</g>
<!-- svc:passbolt&#45;webapp -->
<g id="node22" class="node">
<title>svc:passbolt&#45;webapp</title>
<polygon fill="#dfefff" stroke="black" points="157.5,-144 22.5,-144 22.5,-108 157.5,-108 157.5,-144"/>
<text text-anchor="middle" x="90" y="-122.3" font-family="Helvetica,sans-Serif" font-size="14.00">passbolt&#45;webapp</text>
</g>
<!-- svc:passbolt&#45;webapp&#45;&gt;net:passbolt -->
<g id="edge30" class="edge">
<title>svc:passbolt&#45;webapp&#45;&gt;net:passbolt</title>
<path fill="none" stroke="black" d="M151.18,-107.87C174.64,-100.8 201.13,-92.82 223.16,-86.19"/>
<polygon fill="black" stroke="black" points="224.37,-89.48 232.94,-83.24 222.35,-82.77 224.37,-89.48"/>
</g>
<!-- svc:passbolt&#45;webapp&#45;&gt;net:traefik -->
<g id="edge31" class="edge">
<title>svc:passbolt&#45;webapp&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M157.92,-136.87C166.32,-140.76 174.04,-145.99 180,-153 190.73,-165.62 251.89,-673.92 266.91,-799.95"/>
<polygon fill="black" stroke="black" points="263.45,-800.46 268.11,-809.97 270.4,-799.63 263.45,-800.46"/>
</g>
<!-- svc:pihole&#45;exporter -->
<g id="node23" class="node">
<title>svc:pihole&#45;exporter</title>
<polygon fill="#dfefff" stroke="black" points="151.5,-1602 28.5,-1602 28.5,-1566 151.5,-1566 151.5,-1602"/>
<text text-anchor="middle" x="90" y="-1580.3" font-family="Helvetica,sans-Serif" font-size="14.00">pihole&#45;exporter</text>
</g>
<!-- svc:pihole&#45;exporter&#45;&gt;net:monitor -->
<g id="edge32" class="edge">
<title>svc:pihole&#45;exporter&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M151.56,-1573.88C161.97,-1569.95 172,-1564.52 180,-1557 242.3,-1498.4 261.83,-1392.88 267.77,-1342.4"/>
<polygon fill="black" stroke="black" points="271.27,-1342.54 268.86,-1332.22 264.31,-1341.79 271.27,-1342.54"/>
</g>
<!-- svc:portainer -->
<g id="node24" class="node">
<title>svc:portainer</title>
<polygon fill="#dfefff" stroke="black" points="130,-576 50,-576 50,-540 130,-540 130,-576"/>
<text text-anchor="middle" x="90" y="-554.3" font-family="Helvetica,sans-Serif" font-size="14.00">portainer</text>
</g>
<!-- svc:portainer&#45;&gt;net:traefik -->
<g id="edge33" class="edge">
<title>svc:portainer&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M130.4,-562.06C147.48,-565.65 166.59,-572.39 180,-585 242.3,-643.6 261.83,-749.12 267.77,-799.6"/>
<polygon fill="black" stroke="black" points="264.31,-800.21 268.86,-809.78 271.27,-799.46 264.31,-800.21"/>
</g>
<!-- svc:prometheus -->
<g id="node25" class="node">
<title>svc:prometheus</title>
<polygon fill="#dfefff" stroke="black" points="140,-1170 40,-1170 40,-1134 140,-1134 140,-1170"/>
<text text-anchor="middle" x="90" y="-1148.3" font-family="Helvetica,sans-Serif" font-size="14.00">prometheus</text>
</g>
<!-- svc:prometheus&#45;&gt;net:monitor -->
<g id="edge34" class="edge">
<title>svc:prometheus&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M140.01,-1160.42C153.86,-1164.44 168.33,-1170.34 180,-1179 218.01,-1207.18 244.97,-1256.44 259.03,-1287.02"/>
<polygon fill="black" stroke="black" points="255.87,-1288.54 263.14,-1296.24 262.27,-1285.69 255.87,-1288.54"/>
</g>
<!-- svc:prometheus&#45;&gt;net:traefik -->
<g id="edge35" class="edge">
<title>svc:prometheus&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M140.38,-1146.01C154.73,-1142.08 169.38,-1135.62 180,-1125 254.99,-1050.04 268.02,-914.87 270.03,-856.31"/>
<polygon fill="black" stroke="black" points="273.53,-856.39 270.29,-846.31 266.53,-856.21 273.53,-856.39"/>
</g>
<!-- svc:searxng&#45;webapp -->
<g id="node26" class="node">
<title>svc:searxng&#45;webapp</title>
<polygon fill="#dfefff" stroke="black" points="156,-522 24,-522 24,-486 156,-486 156,-522"/>
<text text-anchor="middle" x="90" y="-500.3" font-family="Helvetica,sans-Serif" font-size="14.00">searxng&#45;webapp</text>
</g>
<!-- svc:searxng&#45;webapp&#45;&gt;net:traefik -->
<g id="edge36" class="edge">
<title>svc:searxng&#45;webapp&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M156.03,-515.39C164.9,-519.2 173.26,-524.27 180,-531 254.99,-605.96 268.02,-741.13 270.03,-799.69"/>
<polygon fill="black" stroke="black" points="266.53,-799.79 270.29,-809.69 273.53,-799.61 266.53,-799.79"/>
</g>
<!-- svc:shift&#45;recorder&#45;web -->
<g id="node27" class="node">
<title>svc:shift&#45;recorder&#45;web</title>
<polygon fill="#dfefff" stroke="black" points="161,-468 19,-468 19,-432 161,-432 161,-468"/>
<text text-anchor="middle" x="90" y="-446.3" font-family="Helvetica,sans-Serif" font-size="14.00">shift&#45;recorder&#45;web</text>
</g>
<!-- svc:shift&#45;recorder&#45;web&#45;&gt;net:traefik -->
<g id="edge37" class="edge">
<title>svc:shift&#45;recorder&#45;web&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M161.17,-463.42C168.16,-466.96 174.64,-471.4 180,-477 225.12,-524.09 256.34,-725.08 266.59,-799.84"/>
<polygon fill="black" stroke="black" points="263.14,-800.48 267.95,-809.92 270.08,-799.55 263.14,-800.48"/>
</g>
<!-- svc:stockfill -->
<g id="node28" class="node">
<title>svc:stockfill</title>
<polygon fill="#dfefff" stroke="black" points="125,-1008 55,-1008 55,-972 125,-972 125,-1008"/>
<text text-anchor="middle" x="90" y="-986.3" font-family="Helvetica,sans-Serif" font-size="14.00">stockfill</text>
</g>
<!-- svc:stockfill&#45;&gt;net:traefik -->
<g id="edge38" class="edge">
<title>svc:stockfill&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M125.19,-985.29C142.88,-981.52 164.05,-974.83 180,-963 218.01,-934.82 244.97,-885.56 259.03,-854.98"/>
<polygon fill="black" stroke="black" points="262.27,-856.31 263.14,-845.76 255.87,-853.46 262.27,-856.31"/>
</g>
<!-- svc:telegraf -->
<g id="node29" class="node">
<title>svc:telegraf</title>
<polygon fill="#dfefff" stroke="black" points="125.5,-1548 54.5,-1548 54.5,-1512 125.5,-1512 125.5,-1548"/>
<text text-anchor="middle" x="90" y="-1526.3" font-family="Helvetica,sans-Serif" font-size="14.00">telegraf</text>
</g>
<!-- svc:telegraf&#45;&gt;net:monitor -->
<g id="edge39" class="edge">
<title>svc:telegraf&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M125.91,-1526.19C143.8,-1522.68 164.94,-1515.94 180,-1503 229.98,-1460.05 254.42,-1383.2 264.44,-1341.96"/>
<polygon fill="black" stroke="black" points="267.88,-1342.58 266.73,-1332.05 261.07,-1341 267.88,-1342.58"/>
</g>
<!-- svc:traefik -->
<g id="node30" class="node">
<title>svc:traefik</title>
<polygon fill="#dfefff" stroke="black" points="121,-954 59,-954 59,-918 121,-918 121,-954"/>
<text text-anchor="middle" x="90" y="-932.3" font-family="Helvetica,sans-Serif" font-size="14.00">traefik</text>
</g>
<!-- svc:traefik&#45;&gt;net:traefik -->
<g id="edge40" class="edge">
<title>svc:traefik&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M121.17,-930.3C139.05,-926.1 161.71,-919.3 180,-909 206.25,-894.22 231.35,-870.65 248.38,-852.74"/>
<polygon fill="black" stroke="black" points="251.37,-854.67 255.62,-844.97 246.24,-849.9 251.37,-854.67"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 136 B

After

Width:  |  Height:  |  Size: 26 KiB

+260
View File
@@ -0,0 +1,260 @@
digraph DockerTraefikDynu {
graph [rankdir=LR, compound=true, splines=true, 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";
"traefik-service:authelia" [label="service:authelia", shape=component, fillcolor="#fecaca"];
"router:authelia" -> "traefik-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";
"traefik-service:error-pages" [label="service:error-pages", shape=component, fillcolor="#fecaca"];
"router:error-pages-router" -> "traefik-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];
"traefik-service:error-pages-service" [label="service:error-pages-service\nport:8080", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:gitea" [label="service:gitea", shape=component, fillcolor="#fecaca"];
"router:gitea" -> "traefik-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";
"traefik-service:gitea" [label="service:gitea\nport:3000", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:gotify" [label="service:gotify", shape=component, fillcolor="#fecaca"];
"router:gotify" -> "traefik-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";
"traefik-service:gotify" [label="service:gotify\nport:80", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:grafana" [label="service:grafana", shape=component, fillcolor="#fecaca"];
"router:grafana" -> "traefik-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";
"traefik-service:grafana" [label="service:grafana\nport:3000", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:grampsweb" [label="service:grampsweb", shape=component, fillcolor="#fecaca"];
"router:gramps" -> "traefik-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";
"traefik-service:gramps" [label="service:gramps\nport:5000", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:influxdb" [label="service:influxdb", shape=component, fillcolor="#fecaca"];
"router:influxdb" -> "traefik-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];
"traefik-service:influxdb" [label="service:influxdb\nport:8086", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:monitor-kuma" [label="service:monitor-kuma", shape=component, fillcolor="#fecaca"];
"router:monitor" -> "traefik-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";
"traefik-service:monitor" [label="service:monitor\nport:3001", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:mtls-bridge" [label="service:mtls-bridge", shape=component, fillcolor="#fecaca"];
"router:mtls-bridge" -> "traefik-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";
"traefik-service:mtls-bridge" [label="service:mtls-bridge", shape=component, fillcolor="#fecaca"];
"router:mtls-bridge-preflight" -> "traefik-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];
"traefik-service:mtls-bridge" [label="service:mtls-bridge\nport:8080", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:nextcloud-webapp" [label="service:nextcloud-webapp", shape=component, fillcolor="#fecaca"];
"router:nextcloud" -> "traefik-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";
"traefik-service:node-red" [label="service:node-red", shape=component, fillcolor="#fecaca"];
"router:node-red" -> "traefik-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];
"traefik-service:node-red" [label="service:node-red\nport:1880", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:passbolt-webapp" [label="service:passbolt-webapp", shape=component, fillcolor="#fecaca"];
"router:passbolt" -> "traefik-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";
"traefik-service:portainer" [label="service:portainer", shape=component, fillcolor="#fecaca"];
"router:portainer" -> "traefik-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";
"traefik-service:portainer" [label="service:portainer\nport:9000", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:prometheus" [label="service:prometheus", shape=component, fillcolor="#fecaca"];
"router:prometheus" -> "traefik-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];
"traefik-service:prometheus" [label="service:prometheus\nport:9090", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:searxng-webapp" [label="service:searxng-webapp", shape=component, fillcolor="#fecaca"];
"router:searxng" -> "traefik-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";
"traefik-service:searxng" [label="service:searxng\nport:8080", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:shift-recorder-web" [label="service:shift-recorder-web", shape=component, fillcolor="#fecaca"];
"router:shifts" -> "traefik-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";
"traefik-service:shifts" [label="service:shifts\nport:80", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:stockfill" [label="service:stockfill", shape=component, fillcolor="#fecaca"];
"router:stockfill" -> "traefik-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";
"traefik-service:stockfill" [label="service:stockfill\nport:80", shape=component, fillcolor="#fecaca"];
"traefik-service: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";
"traefik-service:api@internal" [label="service:api@internal", shape=component, fillcolor="#fecaca"];
"router:traefik" -> "traefik-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: 122 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)
+463 -1
View File
@@ -1 +1,463 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="80"><text x="10" y="40">Graphviz dot not found in environment.</text></svg>
<?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: Compose Pages: 1 -->
<svg width="334pt" height="1610pt"
viewBox="0.00 0.00 334.49 1610.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 1606)">
<title>Compose</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-1606 330.49,-1606 330.49,4 -4,4"/>
<!-- svc:authelia -->
<g id="node1" class="node">
<title>svc:authelia</title>
<polygon fill="#dfefff" stroke="black" points="126,-900 54,-900 54,-864 126,-864 126,-900"/>
<text text-anchor="middle" x="90" y="-878.3" font-family="Helvetica,sans-Serif" font-size="14.00">authelia</text>
</g>
<!-- net:traefik -->
<g id="node35" class="node">
<title>net:traefik</title>
<ellipse fill="#f4f4f4" stroke="black" cx="271.25" cy="-828" rx="40.09" ry="18"/>
<text text-anchor="middle" x="271.25" y="-824.3" font-family="Helvetica,sans-Serif" font-size="14.00">traefik</text>
</g>
<!-- svc:authelia&#45;&gt;net:traefik -->
<g id="edge1" class="edge">
<title>svc:authelia&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M126.41,-871.33C155.5,-862.57 196.8,-850.13 227.69,-840.82"/>
<polygon fill="black" stroke="black" points="228.76,-844.15 237.32,-837.92 226.74,-837.45 228.76,-844.15"/>
</g>
<!-- svc:crowdsec -->
<g id="node2" class="node">
<title>svc:crowdsec</title>
<polygon fill="#dfefff" stroke="black" points="130.5,-846 49.5,-846 49.5,-810 130.5,-810 130.5,-846"/>
<text text-anchor="middle" x="90" y="-824.3" font-family="Helvetica,sans-Serif" font-size="14.00">crowdsec</text>
</g>
<!-- svc:crowdsec&#45;&gt;net:traefik -->
<g id="edge2" class="edge">
<title>svc:crowdsec&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M130.78,-828C157.33,-828 192.43,-828 220.78,-828"/>
<polygon fill="black" stroke="black" points="220.88,-831.5 230.88,-828 220.88,-824.5 220.88,-831.5"/>
</g>
<!-- svc:docker&#45;socket&#45;proxy -->
<g id="node3" class="node">
<title>svc:docker&#45;socket&#45;proxy</title>
<polygon fill="#dfefff" stroke="black" points="167.5,-1116 12.5,-1116 12.5,-1080 167.5,-1080 167.5,-1116"/>
<text text-anchor="middle" x="90" y="-1094.3" font-family="Helvetica,sans-Serif" font-size="14.00">docker&#45;socket&#45;proxy</text>
</g>
<!-- net:monitor -->
<g id="node32" class="node">
<title>net:monitor</title>
<ellipse fill="#f4f4f4" stroke="black" cx="271.25" cy="-1314" rx="46.29" ry="18"/>
<text text-anchor="middle" x="271.25" y="-1310.3" font-family="Helvetica,sans-Serif" font-size="14.00">monitor</text>
</g>
<!-- svc:docker&#45;socket&#45;proxy&#45;&gt;net:monitor -->
<g id="edge3" class="edge">
<title>svc:docker&#45;socket&#45;proxy&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M167.18,-1116.1C171.75,-1118.68 176.08,-1121.63 180,-1125 229.98,-1167.95 254.42,-1244.8 264.44,-1286.04"/>
<polygon fill="black" stroke="black" points="261.07,-1287 266.73,-1295.95 267.88,-1285.42 261.07,-1287"/>
</g>
<!-- svc:docker&#45;socket&#45;proxy&#45;&gt;net:traefik -->
<g id="edge4" class="edge">
<title>svc:docker&#45;socket&#45;proxy&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M167.53,-1080.29C172.02,-1077.62 176.24,-1074.54 180,-1071 242.3,-1012.4 261.83,-906.88 267.77,-856.4"/>
<polygon fill="black" stroke="black" points="271.27,-856.54 268.86,-846.22 264.31,-855.79 271.27,-856.54"/>
</g>
<!-- svc:docker&#45;update&#45;exporter -->
<g id="node4" class="node">
<title>svc:docker&#45;update&#45;exporter</title>
<polygon fill="#dfefff" stroke="black" points="180,-1494 0,-1494 0,-1458 180,-1458 180,-1494"/>
<text text-anchor="middle" x="90" y="-1472.3" font-family="Helvetica,sans-Serif" font-size="14.00">docker&#45;update&#45;exporter</text>
</g>
<!-- svc:docker&#45;update&#45;exporter&#45;&gt;net:monitor -->
<g id="edge5" class="edge">
<title>svc:docker&#45;update&#45;exporter&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M165.31,-1457.9C170.5,-1455.32 175.46,-1452.37 180,-1449 218.01,-1420.82 244.97,-1371.56 259.03,-1340.98"/>
<polygon fill="black" stroke="black" points="262.27,-1342.31 263.14,-1331.76 255.87,-1339.46 262.27,-1342.31"/>
</g>
<!-- svc:error&#45;pages -->
<g id="node5" class="node">
<title>svc:error&#45;pages</title>
<polygon fill="#dfefff" stroke="black" points="137.5,-792 42.5,-792 42.5,-756 137.5,-756 137.5,-792"/>
<text text-anchor="middle" x="90" y="-770.3" font-family="Helvetica,sans-Serif" font-size="14.00">error&#45;pages</text>
</g>
<!-- svc:error&#45;pages&#45;&gt;net:traefik -->
<g id="edge6" class="edge">
<title>svc:error&#45;pages&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M137.63,-788.05C165.53,-796.45 200.71,-807.05 227.83,-815.22"/>
<polygon fill="black" stroke="black" points="226.84,-818.58 237.43,-818.11 228.86,-811.88 226.84,-818.58"/>
</g>
<!-- svc:gitea -->
<g id="node6" class="node">
<title>svc:gitea</title>
<polygon fill="#dfefff" stroke="black" points="117,-738 63,-738 63,-702 117,-702 117,-738"/>
<text text-anchor="middle" x="90" y="-716.3" font-family="Helvetica,sans-Serif" font-size="14.00">gitea</text>
</g>
<!-- svc:gitea&#45;&gt;net:traefik -->
<g id="edge7" class="edge">
<title>svc:gitea&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M117.13,-724.77C135.53,-728.87 160.3,-735.91 180,-747 206.25,-761.78 231.35,-785.35 248.38,-803.26"/>
<polygon fill="black" stroke="black" points="246.24,-806.1 255.62,-811.03 251.37,-801.33 246.24,-806.1"/>
</g>
<!-- svc:gitea&#45;runner -->
<g id="node7" class="node">
<title>svc:gitea&#45;runner</title>
<polygon fill="#dfefff" stroke="black" points="142,-684 38,-684 38,-648 142,-648 142,-684"/>
<text text-anchor="middle" x="90" y="-662.3" font-family="Helvetica,sans-Serif" font-size="14.00">gitea&#45;runner</text>
</g>
<!-- svc:gitea&#45;runner&#45;&gt;net:traefik -->
<g id="edge8" class="edge">
<title>svc:gitea&#45;runner&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M142.32,-675.1C155.46,-679.1 168.98,-684.83 180,-693 218.01,-721.18 244.97,-770.44 259.03,-801.02"/>
<polygon fill="black" stroke="black" points="255.87,-802.54 263.14,-810.24 262.27,-799.69 255.87,-802.54"/>
</g>
<!-- svc:gotify -->
<g id="node8" class="node">
<title>svc:gotify</title>
<polygon fill="#dfefff" stroke="black" points="118,-630 62,-630 62,-594 118,-594 118,-630"/>
<text text-anchor="middle" x="90" y="-608.3" font-family="Helvetica,sans-Serif" font-size="14.00">gotify</text>
</g>
<!-- svc:gotify&#45;&gt;net:traefik -->
<g id="edge9" class="edge">
<title>svc:gotify&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M118.29,-614.47C137.49,-617.48 162.73,-624.16 180,-639 229.98,-681.95 254.42,-758.8 264.44,-800.04"/>
<polygon fill="black" stroke="black" points="261.07,-801 266.73,-809.95 267.88,-799.42 261.07,-801"/>
</g>
<!-- svc:grafana -->
<g id="node9" class="node">
<title>svc:grafana</title>
<polygon fill="#dfefff" stroke="black" points="125.5,-1062 54.5,-1062 54.5,-1026 125.5,-1026 125.5,-1062"/>
<text text-anchor="middle" x="90" y="-1040.3" font-family="Helvetica,sans-Serif" font-size="14.00">grafana</text>
</g>
<!-- svc:grafana&#45;&gt;net:monitor -->
<g id="edge10" class="edge">
<title>svc:grafana&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M125.52,-1047.11C143.74,-1050.41 165.3,-1057.17 180,-1071 242.3,-1129.6 261.83,-1235.12 267.77,-1285.6"/>
<polygon fill="black" stroke="black" points="264.31,-1286.21 268.86,-1295.78 271.27,-1285.46 264.31,-1286.21"/>
</g>
<!-- svc:grafana&#45;&gt;net:traefik -->
<g id="edge11" class="edge">
<title>svc:grafana&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M125.91,-1040.19C143.8,-1036.68 164.94,-1029.94 180,-1017 229.98,-974.05 254.42,-897.2 264.44,-855.96"/>
<polygon fill="black" stroke="black" points="267.88,-856.58 266.73,-846.05 261.07,-855 267.88,-856.58"/>
</g>
<!-- svc:gramps&#45;redis -->
<g id="node10" class="node">
<title>svc:gramps&#45;redis</title>
<polygon fill="#dfefff" stroke="black" points="144.5,-360 35.5,-360 35.5,-324 144.5,-324 144.5,-360"/>
<text text-anchor="middle" x="90" y="-338.3" font-family="Helvetica,sans-Serif" font-size="14.00">gramps&#45;redis</text>
</g>
<!-- net:gramps -->
<g id="node31" class="node">
<title>net:gramps</title>
<ellipse fill="#f4f4f4" stroke="black" cx="271.25" cy="-342" rx="45.49" ry="18"/>
<text text-anchor="middle" x="271.25" y="-338.3" font-family="Helvetica,sans-Serif" font-size="14.00">gramps</text>
</g>
<!-- svc:gramps&#45;redis&#45;&gt;net:gramps -->
<g id="edge12" class="edge">
<title>svc:gramps&#45;redis&#45;&gt;net:gramps</title>
<path fill="none" stroke="black" d="M144.78,-342C167.14,-342 193.05,-342 215.51,-342"/>
<polygon fill="black" stroke="black" points="215.56,-345.5 225.56,-342 215.56,-338.5 215.56,-345.5"/>
</g>
<!-- svc:grampsweb -->
<g id="node11" class="node">
<title>svc:grampsweb</title>
<polygon fill="#dfefff" stroke="black" points="139,-414 41,-414 41,-378 139,-378 139,-414"/>
<text text-anchor="middle" x="90" y="-392.3" font-family="Helvetica,sans-Serif" font-size="14.00">grampsweb</text>
</g>
<!-- svc:grampsweb&#45;&gt;net:gramps -->
<g id="edge13" class="edge">
<title>svc:grampsweb&#45;&gt;net:gramps</title>
<path fill="none" stroke="black" d="M139.03,-381.53C165.7,-373.5 198.68,-363.56 224.9,-355.66"/>
<polygon fill="black" stroke="black" points="226.03,-358.98 234.59,-352.74 224.01,-352.27 226.03,-358.98"/>
</g>
<!-- svc:grampsweb&#45;&gt;net:traefik -->
<g id="edge14" class="edge">
<title>svc:grampsweb&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M139.02,-401.02C153.99,-404.86 169.35,-411.52 180,-423 231.57,-478.6 259.36,-716.7 267.6,-799.49"/>
<polygon fill="black" stroke="black" points="264.14,-800.06 268.59,-809.67 271.1,-799.38 264.14,-800.06"/>
</g>
<!-- svc:grampsweb_celery -->
<g id="node12" class="node">
<title>svc:grampsweb_celery</title>
<polygon fill="#dfefff" stroke="black" points="163.5,-306 16.5,-306 16.5,-270 163.5,-270 163.5,-306"/>
<text text-anchor="middle" x="90" y="-284.3" font-family="Helvetica,sans-Serif" font-size="14.00">grampsweb_celery</text>
</g>
<!-- svc:grampsweb_celery&#45;&gt;net:gramps -->
<g id="edge15" class="edge">
<title>svc:grampsweb_celery&#45;&gt;net:gramps</title>
<path fill="none" stroke="black" d="M151.18,-306.13C175.28,-313.39 202.57,-321.61 224.94,-328.35"/>
<polygon fill="black" stroke="black" points="223.94,-331.71 234.52,-331.24 225.96,-325 223.94,-331.71"/>
</g>
<!-- svc:influxdb -->
<g id="node13" class="node">
<title>svc:influxdb</title>
<polygon fill="#dfefff" stroke="black" points="127,-1386 53,-1386 53,-1350 127,-1350 127,-1386"/>
<text text-anchor="middle" x="90" y="-1364.3" font-family="Helvetica,sans-Serif" font-size="14.00">influxdb</text>
</g>
<!-- svc:influxdb&#45;&gt;net:monitor -->
<g id="edge16" class="edge">
<title>svc:influxdb&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M127.27,-1357.07C155.3,-1348.63 194.28,-1336.88 224.46,-1327.79"/>
<polygon fill="black" stroke="black" points="225.77,-1331.06 234.33,-1324.82 223.75,-1324.35 225.77,-1331.06"/>
</g>
<!-- svc:influxdb&#45;&gt;net:traefik -->
<g id="edge17" class="edge">
<title>svc:influxdb&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M127.44,-1365.74C145.77,-1362.68 166.83,-1355.86 180,-1341 244.76,-1267.93 264.48,-953.16 269.06,-856.4"/>
<polygon fill="black" stroke="black" points="272.57,-856.36 269.53,-846.21 265.58,-856.04 272.57,-856.36"/>
</g>
<!-- svc:monitor&#45;kuma -->
<g id="node14" class="node">
<title>svc:monitor&#45;kuma</title>
<polygon fill="#dfefff" stroke="black" points="146.5,-1332 33.5,-1332 33.5,-1296 146.5,-1296 146.5,-1332"/>
<text text-anchor="middle" x="90" y="-1310.3" font-family="Helvetica,sans-Serif" font-size="14.00">monitor&#45;kuma</text>
</g>
<!-- svc:monitor&#45;kuma&#45;&gt;net:monitor -->
<g id="edge18" class="edge">
<title>svc:monitor&#45;kuma&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M146.73,-1314C168.47,-1314 193.32,-1314 215.01,-1314"/>
<polygon fill="black" stroke="black" points="215.05,-1317.5 225.05,-1314 215.05,-1310.5 215.05,-1317.5"/>
</g>
<!-- svc:monitor&#45;kuma&#45;&gt;net:traefik -->
<g id="edge19" class="edge">
<title>svc:monitor&#45;kuma&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M146.61,-1307C159.1,-1302.97 171.23,-1296.7 180,-1287 238.17,-1222.67 262.1,-946.17 268.43,-856.32"/>
<polygon fill="black" stroke="black" points="271.93,-856.3 269.13,-846.08 264.95,-855.82 271.93,-856.3"/>
</g>
<!-- svc:mtls&#45;bridge -->
<g id="node15" class="node">
<title>svc:mtls&#45;bridge</title>
<polygon fill="#dfefff" stroke="black" points="138.5,-1278 41.5,-1278 41.5,-1242 138.5,-1242 138.5,-1278"/>
<text text-anchor="middle" x="90" y="-1256.3" font-family="Helvetica,sans-Serif" font-size="14.00">mtls&#45;bridge</text>
</g>
<!-- svc:mtls&#45;bridge&#45;&gt;net:monitor -->
<g id="edge20" class="edge">
<title>svc:mtls&#45;bridge&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M138.56,-1274.33C165.14,-1282.34 198.1,-1292.27 224.4,-1300.19"/>
<polygon fill="black" stroke="black" points="223.54,-1303.58 234.12,-1303.12 225.56,-1296.88 223.54,-1303.58"/>
</g>
<!-- svc:mtls&#45;bridge&#45;&gt;net:traefik -->
<g id="edge21" class="edge">
<title>svc:mtls&#45;bridge&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M138.56,-1255.1C153.68,-1251.28 169.24,-1244.6 180,-1233 231.57,-1177.4 259.36,-939.3 267.6,-856.51"/>
<polygon fill="black" stroke="black" points="271.1,-856.62 268.59,-846.33 264.14,-855.94 271.1,-856.62"/>
</g>
<!-- svc:nextcloud&#45;db -->
<g id="node16" class="node">
<title>svc:nextcloud&#45;db</title>
<polygon fill="#dfefff" stroke="black" points="144,-90 36,-90 36,-54 144,-54 144,-90"/>
<text text-anchor="middle" x="90" y="-68.3" font-family="Helvetica,sans-Serif" font-size="14.00">nextcloud&#45;db</text>
</g>
<!-- net:nextcloud -->
<g id="node33" class="node">
<title>net:nextcloud</title>
<ellipse fill="#f4f4f4" stroke="black" cx="271.25" cy="-180" rx="55.49" ry="18"/>
<text text-anchor="middle" x="271.25" y="-176.3" font-family="Helvetica,sans-Serif" font-size="14.00">nextcloud</text>
</g>
<!-- svc:nextcloud&#45;db&#45;&gt;net:nextcloud -->
<g id="edge22" class="edge">
<title>svc:nextcloud&#45;db&#45;&gt;net:nextcloud</title>
<path fill="none" stroke="black" d="M144.33,-84.04C156.48,-87.9 169.03,-92.82 180,-99 206.09,-113.7 231.04,-137.06 248.07,-154.93"/>
<polygon fill="black" stroke="black" points="245.93,-157.77 255.31,-162.7 251.06,-153 245.93,-157.77"/>
</g>
<!-- svc:nextcloud&#45;redis -->
<g id="node17" class="node">
<title>svc:nextcloud&#45;redis</title>
<polygon fill="#dfefff" stroke="black" points="152,-198 28,-198 28,-162 152,-162 152,-198"/>
<text text-anchor="middle" x="90" y="-176.3" font-family="Helvetica,sans-Serif" font-size="14.00">nextcloud&#45;redis</text>
</g>
<!-- svc:nextcloud&#45;redis&#45;&gt;net:nextcloud -->
<g id="edge23" class="edge">
<title>svc:nextcloud&#45;redis&#45;&gt;net:nextcloud</title>
<path fill="none" stroke="black" d="M152.18,-180C169.48,-180 188.35,-180 205.83,-180"/>
<polygon fill="black" stroke="black" points="205.94,-183.5 215.94,-180 205.94,-176.5 205.94,-183.5"/>
</g>
<!-- svc:nextcloud&#45;webapp -->
<g id="node18" class="node">
<title>svc:nextcloud&#45;webapp</title>
<polygon fill="#dfefff" stroke="black" points="162.5,-252 17.5,-252 17.5,-216 162.5,-216 162.5,-252"/>
<text text-anchor="middle" x="90" y="-230.3" font-family="Helvetica,sans-Serif" font-size="14.00">nextcloud&#45;webapp</text>
</g>
<!-- svc:nextcloud&#45;webapp&#45;&gt;net:nextcloud -->
<g id="edge24" class="edge">
<title>svc:nextcloud&#45;webapp&#45;&gt;net:nextcloud</title>
<path fill="none" stroke="black" d="M151.18,-215.87C173.57,-209.12 198.72,-201.55 220.11,-195.1"/>
<polygon fill="black" stroke="black" points="221.4,-198.37 229.97,-192.13 219.38,-191.67 221.4,-198.37"/>
</g>
<!-- svc:nextcloud&#45;webapp&#45;&gt;net:traefik -->
<g id="edge25" class="edge">
<title>svc:nextcloud&#45;webapp&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M162.56,-247.4C169.12,-250.94 175.12,-255.4 180,-261 215.98,-302.27 256.67,-690.32 267.49,-799.53"/>
<polygon fill="black" stroke="black" points="264.03,-800.16 268.49,-809.77 271,-799.47 264.03,-800.16"/>
</g>
<!-- svc:node&#45;exporter -->
<g id="node19" class="node">
<title>svc:node&#45;exporter</title>
<polygon fill="#dfefff" stroke="black" points="148,-1440 32,-1440 32,-1404 148,-1404 148,-1440"/>
<text text-anchor="middle" x="90" y="-1418.3" font-family="Helvetica,sans-Serif" font-size="14.00">node&#45;exporter</text>
</g>
<!-- svc:node&#45;exporter&#45;&gt;net:monitor -->
<g id="edge26" class="edge">
<title>svc:node&#45;exporter&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M148.08,-1408.74C159.04,-1405.08 170.15,-1400.55 180,-1395 206.25,-1380.22 231.35,-1356.65 248.38,-1338.74"/>
<polygon fill="black" stroke="black" points="251.37,-1340.67 255.62,-1330.97 246.24,-1335.9 251.37,-1340.67"/>
</g>
<!-- svc:node&#45;red -->
<g id="node20" class="node">
<title>svc:node&#45;red</title>
<polygon fill="#dfefff" stroke="black" points="129.5,-1224 50.5,-1224 50.5,-1188 129.5,-1188 129.5,-1224"/>
<text text-anchor="middle" x="90" y="-1202.3" font-family="Helvetica,sans-Serif" font-size="14.00">node&#45;red</text>
</g>
<!-- svc:node&#45;red&#45;&gt;net:monitor -->
<g id="edge27" class="edge">
<title>svc:node&#45;red&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M129.72,-1213.82C145.92,-1218.07 164.52,-1224.28 180,-1233 206.25,-1247.78 231.35,-1271.35 248.38,-1289.26"/>
<polygon fill="black" stroke="black" points="246.24,-1292.1 255.62,-1297.03 251.37,-1287.33 246.24,-1292.1"/>
</g>
<!-- svc:node&#45;red&#45;&gt;net:traefik -->
<g id="edge28" class="edge">
<title>svc:node&#45;red&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M129.66,-1202.83C147.22,-1199.45 166.93,-1192.64 180,-1179 225.12,-1131.91 256.34,-930.92 266.59,-856.16"/>
<polygon fill="black" stroke="black" points="270.08,-856.45 267.95,-846.08 263.14,-855.52 270.08,-856.45"/>
</g>
<!-- svc:passbolt&#45;db -->
<g id="node21" class="node">
<title>svc:passbolt&#45;db</title>
<polygon fill="#dfefff" stroke="black" points="139,-36 41,-36 41,0 139,0 139,-36"/>
<text text-anchor="middle" x="90" y="-14.3" font-family="Helvetica,sans-Serif" font-size="14.00">passbolt&#45;db</text>
</g>
<!-- net:passbolt -->
<g id="node34" class="node">
<title>net:passbolt</title>
<ellipse fill="#f4f4f4" stroke="black" cx="271.25" cy="-72" rx="48.99" ry="18"/>
<text text-anchor="middle" x="271.25" y="-68.3" font-family="Helvetica,sans-Serif" font-size="14.00">passbolt</text>
</g>
<!-- svc:passbolt&#45;db&#45;&gt;net:passbolt -->
<g id="edge29" class="edge">
<title>svc:passbolt&#45;db&#45;&gt;net:passbolt</title>
<path fill="none" stroke="black" d="M139.03,-32.47C165.15,-40.34 197.32,-50.03 223.27,-57.85"/>
<polygon fill="black" stroke="black" points="222.3,-61.21 232.88,-60.74 224.32,-54.51 222.3,-61.21"/>
</g>
<!-- svc:passbolt&#45;webapp -->
<g id="node22" class="node">
<title>svc:passbolt&#45;webapp</title>
<polygon fill="#dfefff" stroke="black" points="157.5,-144 22.5,-144 22.5,-108 157.5,-108 157.5,-144"/>
<text text-anchor="middle" x="90" y="-122.3" font-family="Helvetica,sans-Serif" font-size="14.00">passbolt&#45;webapp</text>
</g>
<!-- svc:passbolt&#45;webapp&#45;&gt;net:passbolt -->
<g id="edge30" class="edge">
<title>svc:passbolt&#45;webapp&#45;&gt;net:passbolt</title>
<path fill="none" stroke="black" d="M151.18,-107.87C174.64,-100.8 201.13,-92.82 223.16,-86.19"/>
<polygon fill="black" stroke="black" points="224.37,-89.48 232.94,-83.24 222.35,-82.77 224.37,-89.48"/>
</g>
<!-- svc:passbolt&#45;webapp&#45;&gt;net:traefik -->
<g id="edge31" class="edge">
<title>svc:passbolt&#45;webapp&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M157.92,-136.87C166.32,-140.76 174.04,-145.99 180,-153 190.73,-165.62 251.89,-673.92 266.91,-799.95"/>
<polygon fill="black" stroke="black" points="263.45,-800.46 268.11,-809.97 270.4,-799.63 263.45,-800.46"/>
</g>
<!-- svc:pihole&#45;exporter -->
<g id="node23" class="node">
<title>svc:pihole&#45;exporter</title>
<polygon fill="#dfefff" stroke="black" points="151.5,-1602 28.5,-1602 28.5,-1566 151.5,-1566 151.5,-1602"/>
<text text-anchor="middle" x="90" y="-1580.3" font-family="Helvetica,sans-Serif" font-size="14.00">pihole&#45;exporter</text>
</g>
<!-- svc:pihole&#45;exporter&#45;&gt;net:monitor -->
<g id="edge32" class="edge">
<title>svc:pihole&#45;exporter&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M151.56,-1573.88C161.97,-1569.95 172,-1564.52 180,-1557 242.3,-1498.4 261.83,-1392.88 267.77,-1342.4"/>
<polygon fill="black" stroke="black" points="271.27,-1342.54 268.86,-1332.22 264.31,-1341.79 271.27,-1342.54"/>
</g>
<!-- svc:portainer -->
<g id="node24" class="node">
<title>svc:portainer</title>
<polygon fill="#dfefff" stroke="black" points="130,-576 50,-576 50,-540 130,-540 130,-576"/>
<text text-anchor="middle" x="90" y="-554.3" font-family="Helvetica,sans-Serif" font-size="14.00">portainer</text>
</g>
<!-- svc:portainer&#45;&gt;net:traefik -->
<g id="edge33" class="edge">
<title>svc:portainer&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M130.4,-562.06C147.48,-565.65 166.59,-572.39 180,-585 242.3,-643.6 261.83,-749.12 267.77,-799.6"/>
<polygon fill="black" stroke="black" points="264.31,-800.21 268.86,-809.78 271.27,-799.46 264.31,-800.21"/>
</g>
<!-- svc:prometheus -->
<g id="node25" class="node">
<title>svc:prometheus</title>
<polygon fill="#dfefff" stroke="black" points="140,-1170 40,-1170 40,-1134 140,-1134 140,-1170"/>
<text text-anchor="middle" x="90" y="-1148.3" font-family="Helvetica,sans-Serif" font-size="14.00">prometheus</text>
</g>
<!-- svc:prometheus&#45;&gt;net:monitor -->
<g id="edge34" class="edge">
<title>svc:prometheus&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M140.01,-1160.42C153.86,-1164.44 168.33,-1170.34 180,-1179 218.01,-1207.18 244.97,-1256.44 259.03,-1287.02"/>
<polygon fill="black" stroke="black" points="255.87,-1288.54 263.14,-1296.24 262.27,-1285.69 255.87,-1288.54"/>
</g>
<!-- svc:prometheus&#45;&gt;net:traefik -->
<g id="edge35" class="edge">
<title>svc:prometheus&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M140.38,-1146.01C154.73,-1142.08 169.38,-1135.62 180,-1125 254.99,-1050.04 268.02,-914.87 270.03,-856.31"/>
<polygon fill="black" stroke="black" points="273.53,-856.39 270.29,-846.31 266.53,-856.21 273.53,-856.39"/>
</g>
<!-- svc:searxng&#45;webapp -->
<g id="node26" class="node">
<title>svc:searxng&#45;webapp</title>
<polygon fill="#dfefff" stroke="black" points="156,-522 24,-522 24,-486 156,-486 156,-522"/>
<text text-anchor="middle" x="90" y="-500.3" font-family="Helvetica,sans-Serif" font-size="14.00">searxng&#45;webapp</text>
</g>
<!-- svc:searxng&#45;webapp&#45;&gt;net:traefik -->
<g id="edge36" class="edge">
<title>svc:searxng&#45;webapp&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M156.03,-515.39C164.9,-519.2 173.26,-524.27 180,-531 254.99,-605.96 268.02,-741.13 270.03,-799.69"/>
<polygon fill="black" stroke="black" points="266.53,-799.79 270.29,-809.69 273.53,-799.61 266.53,-799.79"/>
</g>
<!-- svc:shift&#45;recorder&#45;web -->
<g id="node27" class="node">
<title>svc:shift&#45;recorder&#45;web</title>
<polygon fill="#dfefff" stroke="black" points="161,-468 19,-468 19,-432 161,-432 161,-468"/>
<text text-anchor="middle" x="90" y="-446.3" font-family="Helvetica,sans-Serif" font-size="14.00">shift&#45;recorder&#45;web</text>
</g>
<!-- svc:shift&#45;recorder&#45;web&#45;&gt;net:traefik -->
<g id="edge37" class="edge">
<title>svc:shift&#45;recorder&#45;web&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M161.17,-463.42C168.16,-466.96 174.64,-471.4 180,-477 225.12,-524.09 256.34,-725.08 266.59,-799.84"/>
<polygon fill="black" stroke="black" points="263.14,-800.48 267.95,-809.92 270.08,-799.55 263.14,-800.48"/>
</g>
<!-- svc:stockfill -->
<g id="node28" class="node">
<title>svc:stockfill</title>
<polygon fill="#dfefff" stroke="black" points="125,-1008 55,-1008 55,-972 125,-972 125,-1008"/>
<text text-anchor="middle" x="90" y="-986.3" font-family="Helvetica,sans-Serif" font-size="14.00">stockfill</text>
</g>
<!-- svc:stockfill&#45;&gt;net:traefik -->
<g id="edge38" class="edge">
<title>svc:stockfill&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M125.19,-985.29C142.88,-981.52 164.05,-974.83 180,-963 218.01,-934.82 244.97,-885.56 259.03,-854.98"/>
<polygon fill="black" stroke="black" points="262.27,-856.31 263.14,-845.76 255.87,-853.46 262.27,-856.31"/>
</g>
<!-- svc:telegraf -->
<g id="node29" class="node">
<title>svc:telegraf</title>
<polygon fill="#dfefff" stroke="black" points="125.5,-1548 54.5,-1548 54.5,-1512 125.5,-1512 125.5,-1548"/>
<text text-anchor="middle" x="90" y="-1526.3" font-family="Helvetica,sans-Serif" font-size="14.00">telegraf</text>
</g>
<!-- svc:telegraf&#45;&gt;net:monitor -->
<g id="edge39" class="edge">
<title>svc:telegraf&#45;&gt;net:monitor</title>
<path fill="none" stroke="black" d="M125.91,-1526.19C143.8,-1522.68 164.94,-1515.94 180,-1503 229.98,-1460.05 254.42,-1383.2 264.44,-1341.96"/>
<polygon fill="black" stroke="black" points="267.88,-1342.58 266.73,-1332.05 261.07,-1341 267.88,-1342.58"/>
</g>
<!-- svc:traefik -->
<g id="node30" class="node">
<title>svc:traefik</title>
<polygon fill="#dfefff" stroke="black" points="121,-954 59,-954 59,-918 121,-918 121,-954"/>
<text text-anchor="middle" x="90" y="-932.3" font-family="Helvetica,sans-Serif" font-size="14.00">traefik</text>
</g>
<!-- svc:traefik&#45;&gt;net:traefik -->
<g id="edge40" class="edge">
<title>svc:traefik&#45;&gt;net:traefik</title>
<path fill="none" stroke="black" d="M121.17,-930.3C139.05,-926.1 161.71,-919.3 180,-909 206.25,-894.22 231.35,-870.65 248.38,-852.74"/>
<polygon fill="black" stroke="black" points="251.37,-854.67 255.62,-844.97 246.24,-849.9 251.37,-854.67"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 136 B

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 122 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

+1
View File
@@ -7,6 +7,7 @@ site_dir: site-public
nav:
- Home: index.md
- Diagrams: diagrams.md
- Compose Inventory: compose-inventory.md
- Traefik Routes: traefik-routes.md
- Prometheus Rules: prometheus-rules.md
+1 -1
View File
@@ -8,5 +8,5 @@ python3 scripts/docs/generate-compose-inventory.py docs/generated/docker-compose
python3 scripts/docs/generate-traefik-routes.py docs/generated/docker-compose.resolved.yml docs/generated/traefik-routes.md
python3 scripts/docs/generate-prometheus-rules.py docs/generated/prometheus-rules.md
python3 scripts/docs/generate-docs-index.py docs/generated/index.md
python3 scripts/docs/generate-diagrams.py docs/generated/docker-compose.resolved.yml docs/diagrams/docker-compose.dot docs/diagrams/docker-compose.svg
python3 scripts/docs/generate-diagrams.py --compose docs/generated/docker-compose.resolved.yml --out-dir docs/diagrams
python3 scripts/docs/sanitize-public-docs.py docs/generated docs/diagrams docs/public
+230 -17
View File
@@ -1,18 +1,231 @@
#!/usr/bin/env python3
import sys,yaml,subprocess,shutil
inp,dotf,svgf=sys.argv[1],sys.argv[2],sys.argv[3]
with open(inp) as f:c=yaml.safe_load(f) or {}
svcs=c.get('services') or {}
lines=["digraph Compose {"," rankdir=LR;"," node [fontname=Helvetica];"]
for s in svcs: lines.append(f' "svc:{s}" [label="{s}", shape=box, style=filled, fillcolor="#dfefff"];')
for n in (c.get('networks') or {}).keys(): lines.append(f' "net:{n}" [label="{n}", shape=ellipse, style=filled, fillcolor="#f4f4f4"];')
for s,sv in svcs.items():
ns=sv.get('networks') or []
if isinstance(ns,dict): ns=ns.keys()
for n in ns: lines.append(f' "svc:{s}" -> "net:{n}";')
lines.append("}")
open(dotf,'w').write('\n'.join(lines)+'\n')
if shutil.which('dot'):
subprocess.run(['dot','-Tsvg',dotf,'-o',svgf],check=True)
else:
open(svgf,'w').write('<svg xmlns="http://www.w3.org/2000/svg" width="640" height="80"><text x="10" y="40">Graphviz dot not found in environment.</text></svg>\n')
import argparse
import re
import subprocess
import shutil
from pathlib import Path
import yaml
INTERNAL_DOMAIN_RE = re.compile(r"\b[a-zA-Z0-9.-]+\.lan\.ddnsgeek\.com\b")
HOST_MATCH_RE = re.compile(r"Host\(([^)]*)\)")
TICKED_HOST_RE = re.compile(r"`([^`]+)`")
def require_dot() -> None:
if not shutil.which("dot"):
raise SystemExit(
"Graphviz 'dot' not found in environment. Install graphviz before running docs generation."
)
def load_compose(path: Path) -> dict:
with path.open() as handle:
return yaml.safe_load(handle) or {}
def sanitize_domain(value: str, known: dict[str, str]) -> str:
if value in known:
return known[value]
if INTERNAL_DOMAIN_RE.search(value):
mapped = f"service-{len(known)+1}.<internal-domain>"
known[value] = mapped
return mapped
return value
def parse_labels(service: dict) -> dict[str, str]:
labels = service.get("labels") or {}
if isinstance(labels, list):
mapped = {}
for item in labels:
if "=" in str(item):
k, v = str(item).split("=", 1)
mapped[k] = v
return mapped
if isinstance(labels, dict):
return {str(k): str(v) for k, v in labels.items()}
return {}
def extract_hosts(rule: str) -> list[str]:
hosts: list[str] = []
for m in HOST_MATCH_RE.findall(rule or ""):
for host in TICKED_HOST_RE.findall(m):
hosts.append(host.strip())
return hosts
def render_svg(dot_path: Path, svg_path: Path) -> None:
subprocess.run(["dot", "-Tsvg", str(dot_path), "-o", str(svg_path)], check=True)
def write_dot(path: Path, lines: list[str]) -> None:
path.write_text("\n".join(lines) + "\n")
def infer_host(service_name: str, service: dict) -> str:
labels = parse_labels(service)
for key in ("com.docker.compose.project", "infra.host", "host"):
value = labels.get(key)
if value:
return value.lower()
s = service_name.lower()
if "raspi" in s or "pi" in s:
return "raspberrypi"
if "proxmox" in s:
return "proxmox"
return "docker"
def generate_physical_topology(compose: dict, out_dot: Path, out_svg: Path) -> None:
services = compose.get("services") or {}
hosts: dict[str, list[str]] = {}
for name, svc in services.items():
hosts.setdefault(infer_host(name, svc), []).append(name)
lines = [
"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];",
]
for host, host_services in sorted(hosts.items()):
lines.extend(
[
f' subgraph "cluster_{host}" {{',
f' label="{host}";',
' style="rounded,filled";',
' color="#c7d6f5";',
' fillcolor="#eef3ff";',
f' "host:{host}" [label="{host}", shape=box3d, fillcolor="#d4e3ff"];',
]
)
for service in sorted(host_services):
lines.append(
f' "svc:{service}" [label="{service}", shape=box, fillcolor="#dff2e1"];'
)
lines.append(f' "host:{host}" -> "svc:{service}" [style=dashed, color="#6b7280"];')
lines.append(" }")
lines.append("}")
write_dot(out_dot, lines)
render_svg(out_dot, out_svg)
def generate_docker_traefik_dynu(compose: dict, out_dot: Path, out_svg: Path) -> None:
services = compose.get("services") or {}
networks = compose.get("networks") or {}
known_domains: dict[str, str] = {}
lines = [
"digraph DockerTraefikDynu {",
" graph [rankdir=LR, compound=true, splines=true, 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"];',
]
for net in sorted(networks.keys()):
lines.append(f' "net:{net}" [label="{net}", shape=ellipse, fillcolor="#f3f4f6"];')
for svc_name, svc in sorted(services.items()):
lines.append(f' "svc:{svc_name}" [label="{svc_name}", shape=box, fillcolor="#dcfce7"];')
svc_nets = svc.get("networks") or []
if isinstance(svc_nets, dict):
svc_nets = svc_nets.keys()
for net in svc_nets:
lines.append(f' "svc:{svc_name}" -> "net:{net}" [color="#6b7280"];')
labels = parse_labels(svc)
router_prefix = "traefik.http.routers."
service_prefix = "traefik.http.services."
routers = sorted({k[len(router_prefix):].split(".", 1)[0] for k in labels if k.startswith(router_prefix)})
for router in routers:
rule = labels.get(f"{router_prefix}{router}.rule", "")
router_service = labels.get(f"{router_prefix}{router}.service", svc_name)
middlewares = labels.get(f"{router_prefix}{router}.middlewares", "")
entrypoints = labels.get(f"{router_prefix}{router}.entrypoints", "")
tls = labels.get(f"{router_prefix}{router}.tls", "false")
lines.append(f' "router:{router}" [label="router:{router}\\nentry:{entrypoints} tls:{tls}", shape=diamond, fillcolor="#fbcfe8"];')
lines.append(f' "svc:traefik" -> "router:{router}";')
target_node = f"traefik-service:{router_service}"
lines.append(f' "{target_node}" [label="service:{router_service}", shape=component, fillcolor="#fecaca"];')
lines.append(f' "router:{router}" -> "{target_node}";')
for host in extract_hosts(rule):
clean = sanitize_domain(host, known_domains)
lines.append(f' "dns:{clean}" [label="{clean}", shape=note, fillcolor="#fde68a"];')
lines.append(f' "ext:dynu" -> "dns:{clean}";')
lines.append(f' "dns:{clean}" -> "router:{router}";')
for middleware in [m.strip() for m in middlewares.split(",") if m.strip()]:
lines.append(f' "mw:{middleware}" [label="{middleware}", shape=hexagon, fillcolor="#ddd6fe"];')
lines.append(f' "router:{router}" -> "mw:{middleware}" [style=dashed];')
lb_services = sorted({k[len(service_prefix):].split(".", 1)[0] for k in labels if k.startswith(service_prefix)})
for lb in lb_services:
port = labels.get(f"{service_prefix}{lb}.loadbalancer.server.port", "")
lines.append(f' "traefik-service:{lb}" [label="service:{lb}\\nport:{port}", shape=component, fillcolor="#fecaca"];')
lines.append(f' "traefik-service:{lb}" -> "svc:{svc_name}";')
lines.append("}")
write_dot(out_dot, lines)
render_svg(out_dot, out_svg)
def generate_compose_topology(compose: dict, out_dot: Path, out_svg: Path) -> None:
services = compose.get("services") or {}
networks = compose.get("networks") or {}
lines = [
"digraph Compose {",
" rankdir=LR;",
' node [fontname="Helvetica"];',
]
for service in sorted(services):
lines.append(f' "svc:{service}" [label="{service}", shape=box, style=filled, fillcolor="#dfefff"];')
for net in sorted(networks):
lines.append(f' "net:{net}" [label="{net}", shape=ellipse, style=filled, fillcolor="#f4f4f4"];')
for service, svc in sorted(services.items()):
svc_nets = svc.get("networks") or []
if isinstance(svc_nets, dict):
svc_nets = svc_nets.keys()
for net in svc_nets:
lines.append(f' "svc:{service}" -> "net:{net}";')
lines.append("}")
write_dot(out_dot, lines)
render_svg(out_dot, out_svg)
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("legacy", nargs="*")
parser.add_argument("--compose")
parser.add_argument("--out-dir")
args = parser.parse_args()
require_dot()
if args.compose and args.out_dir:
compose_path = Path(args.compose)
out_dir = Path(args.out_dir)
elif len(args.legacy) == 3:
compose_path = Path(args.legacy[0])
out_dir = Path(args.legacy[1]).parent
else:
raise SystemExit("Usage: generate-diagrams.py --compose <compose.yml> --out-dir <dir>")
out_dir.mkdir(parents=True, exist_ok=True)
compose = load_compose(compose_path)
generate_docker_traefik_dynu(compose, out_dir / "docker-traefik-dynu.dot", out_dir / "docker-traefik-dynu.svg")
generate_physical_topology(compose, out_dir / "physical-topology.dot", out_dir / "physical-topology.svg")
generate_compose_topology(compose, out_dir / "docker-compose.dot", out_dir / "docker-compose.svg")
if __name__ == "__main__":
main()
+29 -6
View File
@@ -20,27 +20,50 @@ def sanitize_text(content: str) -> str:
content = re.sub(r'(?m)^([A-Z0-9_]*(?:PASSWORD|TOKEN|API_KEY|SECRET)[A-Z0-9_]*)\s*[:=]\s*.*$', r'\1=<redacted>', content)
return content
for name in ['compose-inventory.md', 'traefik-routes.md', 'prometheus-rules.md']:
src = src_generated / name
if src.exists():
(out_dir / name).write_text(sanitize_text(src.read_text(errors='ignore')))
svg_src = src_diagrams / 'docker-compose.svg'
if svg_src.exists():
(out_dir / 'docker-compose.svg').write_text(sanitize_text(svg_src.read_text(errors='ignore')))
for svg_name in ['docker-compose.svg', 'physical-topology.svg', 'docker-traefik-dynu.svg']:
src = src_diagrams / svg_name
if src.exists():
(out_dir / svg_name).write_text(sanitize_text(src.read_text(errors='ignore')))
(out_dir / 'index.md').write_text(
"""# 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)
"""
)
(out_dir / 'diagrams.md').write_text(
"""# Infrastructure diagrams
## Physical / virtual topology
![Physical topology](physical-topology.svg)
## Docker, Traefik and Dynu routing
![Docker Traefik Dynu](docker-traefik-dynu.svg)
"""
)