# ----------------------------------------------------------------- # Traefik node (the gateway for all HTTP traffic) # ----------------------------------------------------------------- node traefik Traefik { name = "traefik" traefik_name = "traefik" icon = "traefik-proxy" } # ----------------------------------------------------------------- # Networks – they automatically become intra‑network edges # ----------------------------------------------------------------- network app1 { member = [ "api", "cache", "postgresql" ] } network wordpress { member = [ "wordpress", "mysql", "cache2" ] } network open-webui { member = [ "open-webui", "ollama" ] } network forgejo { member = [ "forgejo" ] } network app2 { member = [ "api2", "cache3", "postgresql2" ] } network qbittorrent { member = [ "qbittorrent" ] } network homepage { member = [ "homepage" ] } network invidious { member = [ "invidious", "postgresql3" ] } network app3 { member = [ "python", "elastic-search" ] } # ----------------------------------------------------------------- # Containers – you only need a name and (optionally) an image # ----------------------------------------------------------------- node "api" Container { name = "api" image = "my-api" icon = "nginx" } node "cache" Container { name = "cache" image = "my-cache" icon = "redis" } node "postgresql" Container { name = "postgresql" image = "posgres:latest" icon = "postgresql" } node "wordpress" Container { name = "wordpress" image = "wordpress:latest" icon = "wordpress" } node "mysql" Container { name = "mysql" image = "mysql:latest" icon = "mysql" } node "cache2" Container { name = "cache2" image = "my-cache" icon = "redis" } node "open-webui" Container { name = "open-webui" image = "open-webui" icon = "open-webui" } node "ollama" Container { name = "ollama" image = "ollama" icon = "ollama" } node "forgejo" Container { name = "forgejo" image = "forgejo" icon = "forgejo" } node "api2" Container { name = "api2" image = "nginx" icon = "nginx" } node "cache3" Container { name = "cache2" image = "my-cache" icon = "redis" } node "postgresql2" Container { name = "postgresql2" image = "posgres:latest" icon = "postgresql" } node "qbittorrent" Container { name = "qbittorrent" image = "qbittorrent:latest" icon = "qbittorrent" } node "homepage" Container { name = "homepage" image = "homepage:latest" icon = "homepage" } node "invidious" Container { name = "invidious" image = "invidious:latest" icon = "invidious" } node "postgresql3" Container { name = "postgresql3" image = "postgres:latest" icon = "postgresql" } node "python" Container { name = "python" image = "python" icon = "python" } node "elastic-search" Container { name = "elastic-search" image = "elastic-search" icon = "elasticsearch" } # ----------------------------------------------------------------- # Explicit Traefik → container ingress rules # ----------------------------------------------------------------- ingress traefik -> "api" { kind = "TraefikIngress" rule = "Host(`api.example.com`)" } ingress traefik -> "wordpress" { kind = "TraefikIngress" rule = "Host(`blog.example.com`)" } ingress traefik -> "open-webui" { kind = "TraefikIngress" rule = "Host(`open-webui.example.com`)" } ingress traefik -> "forgejo" { kind = "TraefikIngress" rule = "Host(`git.example.com`)" }