# Topology data for the generated inventory in documents/TOPOLOGY.md.
# Run from docker/ repo root: python3 scripts/build-topology.py --in-place
# to regenerate the prose around the Archify diagram (requires PyYAML).
#
# When adding a new stack: add it to the appropriate app_categories[].stacks list
# (or to infra if it is infrastructure/monitoring). Keep stack names in
# alphabetical order within each category. Update the category description
# if the new stack changes what the category represents.
ingress:
- id: tunnel
label: "cloudflare-tunnel
(optional)"
- id: caddy
label: "caddy
Reverse proxy
:80 / :443"
vpn:
- id: headscale
label: "headscale
Mesh VPN (Tailscale)"
- id: wireguard
label: "wireguard
Remote access VPN"
- id: gluetun
label: "gluetun
Container egress VPN"
- id: netbird
label: "netbird
WireGuard mesh VPN"
# Application categories. Order here defines order in the diagram (alphabetical by id).
app_categories:
- id: apps_acquisition
name: "Media acquisition & *arr"
descriptor: "torrents, *arr, Usenet"
stacks:
- bazarr
- explo
- flaresolverr
- librarr
- lidarr
- metube
- mylar3
- nzbget
- nzbhydra2
- qbittorrent
- prowlarr
- radarr
- readarr
- rtorrent-flood
- seerr
- sonarr
- soulseek
- whisparr
description: "download clients and *arr automation (torrents, Usenet, Sonarr/Radarr/Lidarr/Readarr, Bazarr, Explo, Librarr, MeTube, Mylar3, Soulseek)"
- id: apps_ai
name: "AI & LLM"
descriptor: "local models, chat UIs"
stacks:
- anything-llm
- kokoro-tts
- litellm
- openai-oauth
- ollama
- open-webui
- librechat
- open-notebook
- paperclip
- vane
- whisper-asr
description: "local models and chat UIs (Ollama, Open WebUI, LibreChat, Open Notebook, Paperclip, Vane, Anything LLM, LiteLLM, Kokoro TTS, Whisper ASR)"
- id: apps_dev
name: "Developer & IT utilities"
descriptor: "it-tools, ConvertX, CUPS, Dozzle, Gitea, Kasm, CI, dashboard, PDF, NetBox, PostHog, Snipe-IT"
stacks:
- baserow
- beszel
- code-server
- convertx
- cups
- dozzle
- gitea
- harbor
- homarr
- it-tools
- kasm
- mattermost
- netbox
- nodepad
- gotify
- changedetection
- posthog
- snipe-it
- stirling-pdf
- terminus
- termix
- komodo
- woodpecker-ci
description: "it-tools, ConvertX, CUPS print server, Dozzle, Gitea, Harbor, Woodpecker CI, Homarr dashboard, Baserow, Stirling-PDF, Gotify, Changedetection.io, NetBox, PostHog, Snipe-IT, code-server, Beszel, Mattermost, Terminus, NodePad, Asking-NG"
- id: apps_gaming
name: "Gaming"
descriptor: "ROMs, Steam, in-browser emulation"
stacks:
- archisteamfarm
- romm
- twitch-drops-miner
description: "Steam automation (ArchiSteamFarm), ROM manager and in-browser emulation (RomM), Twitch drops mining"
- id: apps_home
name: "Home automation & IoT"
descriptor: "Home Assistant, MQTT, Zigbee"
stacks:
- home-assistant
- music-assistant
- mosquitto
- zigbee2mqtt
description: "Home Assistant, Mosquitto (MQTT), Zigbee2MQTT"
- id: apps_links
name: "Links, shorteners & presence"
descriptor: "YOURLS, Shlink, Linkstack, Stoat, homepage"
stacks:
- glance
- homepage
- linkstack
- shlink
- stoat
- yourls
description: "YOURLS, Shlink, Linkstack, Stoat, Glance, static homepage/landing"
- id: apps_media
name: "Media & personal data"
descriptor: "photos, docs, music, RSS, notes"
stacks:
- affine
- appflowy
- actual-budget
- dawarich
- homebox
- lubelogger
- wallos
- archivebox
- audiobookshelf
- tubearchivist
- zimi
- bookstack
- calibre-web
- cryptpad
- docuseal
- emby
- firefly-iii
- freshrss
- hedgedoc
- immich
- jellyfin
- jellystat
- joplin-server
- logseq-sync
- kavita
- komga
- lanraragi
- linkding
- linkwarden
- mealie
- navidrome
- nextcloud
- oasis
- outline
- paperless-ai-next
- paperless-gpt
- paperless-ngx
- picard
- plex
- seafile
- slink
- super-productivity
- syncthing
- trilium
- vikunja
description: "consumption and personal content (photos, docs, music, tagging/organization, recipes, bookmarks, RSS, comics, eBooks, tasks, wiki, notes, budgeting, Affine, Appflowy, CryptPad, Trilium, Oasis, Paperless AI)"
- id: apps_osint
name: "OSINT & recon"
descriptor: "homelab-user/email/phone recon"
stacks:
- social-hunt
- maigret
- spiderfoot
- phoneinfoga
- theharvester
- holehe
- blackbird
- ghunt
- metagoofil
- reconftw
- sublist3r
- ail
- web-check
description: "homelab-user/email/phone recon, breach lookups, subdomain enumeration, AIL"
- id: apps_privacy
name: "Privacy & opt-out"
descriptor: "data broker deletion"
stacks:
- naisho
- privotron
description: "data broker deletion (Naisho, Privotron)"
- id: apps_search
name: "Search"
descriptor: "SearXNG metasearch, Meilisearch"
stacks:
- meilisearch
- searx-ng
description: "SearXNG, Meilisearch"
- id: apps_sec_tooling
name: "Security & compliance tooling"
descriptor: "SBOM, threat model, scanner, forensics"
stacks:
- acquire
- dependency-track
- docker-forensics-toolkit
- plaso
- threat-dragon
- zap
- zed-attack-proxy
description: "SBOM/vuln tracking (Dependency-Track), threat modeling (Threat Dragon), web scanner (ZAP/ZAP GUI), digital forensics (Acquire, Plaso, Docker Forensics Toolkit)"
- id: apps_security
name: "Security & identity"
descriptor: "passwords, secrets, aliases, IdP"
stacks:
- authentik
- enclosed
- guacamole
- infisical
- keycloak
- password-pusher
- privatebin
- rustdesk
- simplelogin
- vaultwarden
description: "passwords, secrets, aliases, remote desktop, secure sharing, IdP (Keycloak, authentik, Enclosed, RustDesk)"
- id: apps_tor
name: "Tor / dark web"
descriptor: "OnionScan, OnionProbe, TorBot"
stacks:
- onionprobe
- onionscan
- torbot
description: "OnionScan, OnionProbe, TorBot"
- id: apps_workflow
name: "Workflow automation"
descriptor: "n8n, Node-RED"
stacks:
- calcom
- n8n
- node-red
description: "n8n, Node-RED, Cal.com"
# Infrastructure & monitoring. Order is alphabetical by id.
infra:
- id: adguard-home
label: "adguard-home
DNS / ad blocking"
- id: alertmanager
label: "alertmanager
Alert routing"
- id: blackbox-exporter
label: "blackbox-exporter
Probes"
- id: cadvisor
label: "cAdvisor
Container metrics"
- id: crowdsec
label: "crowdsec
Security engine"
- id: ddns-updater
label: "ddns-updater
Dynamic DNS"
- id: diun
label: "diun
Image update notifier"
- id: dockergc
label: "docker-gc
Docker GC job"
- id: grafana
label: "grafana
Dashboards"
- id: kuma
label: "uptime-kuma
Monitoring"
- id: loki
label: "loki
Log aggregation"
- id: mailpit
label: "mailpit
SMTP catcher"
- id: minio
label: "minio
S3 object storage"
- id: node-exporter
label: "node-exporter
Host metrics"
- id: nut-server
label: "nut-server
UPS monitor"
- id: ntopng
label: "ntopng
Traffic analytics"
- id: pihole
label: "pihole
DNS sinkhole"
- id: portainer
label: "portainer
Docker UI"
- id: postfix
label: "postfix
SMTP relay"
- id: prometheus
label: "prometheus
Metrics"
- id: backrest
label: "Backrest
Backup browser"
- id: restic
label: "restic
Backups (cron)"
- id: scrutiny
label: "scrutiny
SMART disk health"
- id: snowflake-relay
label: "snowflake-relay
Tor bridge relay"
- id: umami
label: "umami
Web analytics"
- id: unbound
label: "unbound
DNS resolver"
- id: vector
label: "vector
Log shipper"
- id: watchtower
label: "watchtower
Auto-updates"
# App category IDs that use Gluetun for egress (dashed edge to gluetun).
gluetun_egress:
- apps_acquisition
# App category IDs that use Postfix for SMTP (dashed edge to postfix).
smtp_clients:
- apps_privacy
- apps_workflow
# Relations: from → to (label) for diagram and short description for prose.
relations:
- from: users
to: tunnel
description: "Clients use optional Cloudflare Tunnel to reach Caddy."
- from: users
to: caddy
description: "Clients reach Caddy directly (local DNS or tunnel)."
- from: tunnel
to: caddy
description: "Tunnel forwards to Caddy by hostname."
- from: users
to: wireguard
description: "Clients connect via WireGuard for remote access."
- from: users
to: headscale
description: "Clients join mesh via Headscale (Tailscale)."
- from: caddy
to: apps
description: "Caddy routes HTTP(S) to all application stacks by hostname."
- from: caddy
to: infra
description: "Caddy is managed and monitored by infra services."
- from: wireguard
to: caddy
label: VPN
description: "VPN clients reach Caddy and apps."
- from: headscale
to: caddy
label: mesh
description: "Mesh clients reach Caddy and apps."
- from: apps_acquisition
to: gluetun
label: VPN egress
description: "Media acquisition stacks send traffic through Gluetun (VPN)."
- from: gluetun
to: outbound
label: egress
description: "Gluetun egresses via VPN provider to internet."
- from: apps_privacy
to: postfix
label: mail
description: "Privacy/opt-out apps send mail via Postfix."
- from: apps_workflow
to: postfix
label: mail
description: "Workflow apps (e.g. n8n) send mail via Postfix."
- from: postfix
to: mailpit
label: relay (internal-only)
description: "When RELAYHOST=mailpit:1025, Postfix relays to Mailpit; no external delivery."
- from: caddy
to: crowdsec
label: logs
description: "Caddy logs feed CrowdSec security engine."
- from: kuma
to: caddy
label: health
description: "Uptime Kuma monitors Caddy and app health."
- from: prometheus
to: cadvisor
label: scrapes
description: "Prometheus scrapes cAdvisor for container metrics."
- from: grafana
to: prometheus
label: queries
description: "Grafana queries Prometheus for dashboards."
- from: watchtower
to: apps
label: updates
description: "Watchtower updates container images for app stacks."
- from: dockergc
to: apps
label: cleanup
description: "Docker GC cleans stopped containers and unused images."
- from: diun
to: users
label: notify
description: "Diun notifies users of new image tags."
- from: portainer
to: apps
label: manage
description: "Portainer manages Docker stacks and containers."