The Edge Stack
The edge stack is the shared foundation every project plugs into. It boots independently of
any project and runs as its own compose project named multi-docker-edge on the external
docker network of the same name. Every project container joins that network so a single
Traefik can route to all of them.
The four services
Section titled “The four services”| Service | Image | Host ports | Role |
|---|---|---|---|
traefik |
traefik:v3.5 |
127.0.0.1:80, 127.0.0.1:443 |
TLS-terminated reverse proxy. Discovers containers via the docker provider (through docker-proxy). Dashboard at https://traefik.<base-domain>. |
mailcatcher |
dockage/mailcatcher:0.9.0 |
none | SMTP catch-all at mailcatcher:1025. Web UI at https://mail.<base-domain>. |
dns |
4km3/dnsmasq:2.90-r3 |
127.0.0.1:53/udp+tcp |
Answers *.<base-domain> with 127.0.0.1, paired with the macOS resolver. |
docker-proxy |
nginx:1.30-alpine |
none | Strips the /v1.24/ version prefix from Docker-API requests so Traefik 3 can talk to OrbStack. |
All four use restart: unless-stopped, and every host port binds to loopback only —
nothing on the edge stack is exposed to your LAN.
How a request flows
Section titled “How a request flows”- Your browser resolves
aurora.coding9.testto127.0.0.1(via dnsmasq + the macOS resolver). - It connects to Traefik on
127.0.0.1:443, which terminates TLS with the mkcert wildcard certificate. - Traefik matches the
Host(...)rule from the labels that the generated override attached to your container. - It forwards the request over the
multi-docker-edgenetwork to the container’s internal port.
Traefik discovery rules
Section titled “Traefik discovery rules”Traefik runs default-deny (exposedByDefault: false), so a container is only routed when
its override sets:
traefik.enable=true— opt-in per container.traefik.docker.network=multi-docker-edge— tells Traefik which network to use when a container is on several.- A router rule from the
{{hosts_rule}}substitution.
You never write these labels by hand — the profile render engine generates them.
Mail catching
Section titled “Mail catching”Projects should point their SMTP at mailcatcher:1025 (the container hostname on the edge
network). The shopware-dockware profile wires this automatically via MAILER_DSN and
friends; other stacks set it themselves. All captured mail shows up at
https://mail.<base-domain>. See Catching Outgoing Mail.
Multiple base domains
Section titled “Multiple base domains”engine/render-edge.sh regenerates ~/.config/multi-docker/edge.override.yml before every
edge command, adding one --address=/<bd>/127.0.0.1 argument to dnsmasq per configured
base domain — so every domain in BASE_DOMAINS resolves. See
Multiple Base Domains.
Stopping the edge stops everything
Section titled “Stopping the edge stops everything”Recreating after a runtime update
Section titled “Recreating after a runtime update”If edge up recreates the edge network on a subnet mismatch, attached project containers
get detached — and a plain restart won’t fix it (no re-render, no re-attach). Use
mdocker cycle for the robust sequence: stop running projects → edge down + up →
up <name> --auto-remap-ports so everything re-attaches to the fresh network.
Cookie settings
We only use statistics tools if you allow it. Necessary storage keeps this site working; everything else is off until you decide.
Stores your choice from this dialog in your browser (localStorage). No cookie, no transfer to third parties.
Google Analytics 4 via Google Tag Manager, to measure how the site is used. Loaded only after you allow it.