from diagrams import Diagram, Cluster, Edge from diagrams.onprem.network import Internet from diagrams.onprem.compute import Server from diagrams.onprem.iac import Ansible from diagrams.generic.network import Router, Switch from diagrams.generic.device import Mobile, Tablet from diagrams.generic.blank import Blank from diagrams.onprem.client import Users from diagrams.onprem.container import Docker from diagrams.custom import Custom # Tip: run this in a venv: # pip install diagrams graphviz with Diagram("Home Lab / Auction Stack Architecture", show=False, filename="home_lab_architecture", direction="LR"): internet = Internet("Internet / Cloud") dev = Users("Dev laptop(s)\nWindows / WSL") # -------------------- LAN 192.168.1.x -------------------- with Cluster("LAN 192.168.1.0/24"): router = Router("hub.lan\n192.168.1.1\nRouter / Gateway") # -------- Core server / desktop (Tour / hephaestus / dokku / ollama) -------- with Cluster("Core server / desktop\nTour / hephaestus / dokku.lan / ollama.lan\n192.168.1.159"): core_os = Server("Ubuntu host") traefik = Docker("Traefik\nReverse Proxy") gitea = Docker("Gitea\n git.appmodel.nl") dokku = Docker("Dokku\nPaaS / app hosting") auction_fe = Docker("Auction Frontend\n auction.appmodel.nl") aupi_be = Docker("Aupi API Backend\n aupi.appmodel.nl") mi50 = Server("MI50 GPU / Ollama\nAI workloads") # -------- Infra & DNS (odroid / dns.lan) -------- with Cluster("Infra & DNS\nodroid / dns.lan\n192.168.1.163"): dns_host = Server("Odroid host") adguard = Docker("AdGuard Home\nDNS / *.lan / *.appmodel.nl") artifactory = Docker("Artifactory (future)") runner = Docker("CI / Build runner (future)") # -------- Home Assistant -------- with Cluster("Home Automation\nha.lan\n192.168.1.193"): ha_host = Server("HomeAssistant host") hass = Docker("Home Assistant") # -------- Extra node / worker -------- atlas = Server("atlas.lan\n192.168.1.100\n(extra node / worker)") # -------- IoT / devices -------- with Cluster("IoT / Clients"): iot_hof = Tablet("hof-E402NA\n192.168.1.214") iot_s380 = Tablet("S380HB\n192.168.1.59") iot_ecb5 = Tablet("ecb5faa56c90\n192.168.1.49") iot_unknown = Tablet("Unknown\n192.168.1.240") # -------------------- Tether subnet 192.168.137.x -------------------- with Cluster("Tether subnet 192.168.137.0/24"): hermes = Server("hermes.lan\n192.168.137.239\nworker / node") plato = Server("plato.lan\n192.168.137.163\nworker / node") # -------------------- Edges / flows -------------------- # Internet naar router + DNS host internet >> router internet >> dns_host # Dev naar Gitea / Traefik / Dokku dev >> Edge(label="git / HTTPS") >> traefik dev >> Edge(label="SSH / HTTPS") >> gitea dev >> Edge(label="Dokku deploys") >> dokku # Router naar alle LAN-nodes router >> core_os router >> dns_host router >> ha_host router >> atlas router >> iot_hof router >> iot_s380 router >> iot_ecb5 router >> iot_unknown # Core server services core_os >> traefik core_os >> gitea core_os >> dokku core_os >> auction_fe core_os >> aupi_be core_os >> mi50 # Infra/DNS services dns_host >> adguard dns_host >> artifactory dns_host >> runner # Home Assistant ha_host >> hass # DNS-queries core_os >> Edge(label="DNS") >> adguard ha_host >> Edge(label="DNS") >> adguard atlas >> Edge(label="DNS") >> adguard hermes >> Edge(label="DNS") >> adguard plato >> Edge(label="DNS") >> adguard # Web traffic / reverse proxy flows internet >> Edge(label="HTTP/HTTPS") >> traefik traefik >> Edge(label="git.appmodel.nl") >> gitea traefik >> Edge(label="auction.appmodel.nl") >> auction_fe traefik >> Edge(label="aupi.appmodel.nl") >> aupi_be traefik >> Edge(label="dokku.lan / apps") >> dokku # App-level flow auction_fe >> Edge(label="REST API") >> aupi_be # AI workloads dev >> Edge(label="LLM / Tuning / Inference") >> mi50 # Tether workers verbonden met core (bv. jobs / agents) core_os >> Edge(label="jobs / ssh") >> hermes core_os >> Edge(label="jobs / ssh") >> plato