Skip to main content

Using Traefik instead of Goma

Miabi ships with Goma Gateway as its default edge proxy. Goma is deeply integrated: Miabi configures routes, TLS, and middlewares for you automatically from the domains and apps you define (see Routing & Middlewares).

You can instead run Miabi behind Traefik, which routes by reading Docker labels off your containers. This is a supported deployment, but because Miabi's proxy integration is Goma-native today, a few features work differently — or require Goma. Read this page before choosing Traefik.

Deployment

Use the Traefik compose variant shipped in the repository:

cp .env.example .env    # set MIABI_DOMAIN + secrets
docker compose -f compose.traefik.yaml up -d

It replaces the gateway (Goma) service with Traefik, which terminates TLS via Let's Encrypt and routes by Docker labels on the shared miabi network. The Miabi panel itself is routed by labels on its own service; your apps get their labels from you (next section).

Routing is by manual labels

With Traefik, Miabi does not generate routing configuration for your apps — its automatic Domain/Route management is a Goma feature. To expose an app, add its traefik.* container labels yourself under App → Settings → Container labels:

traefik.enable                                        = true
traefik.http.routers.<app>.rule = Host(`app.example.com`)
traefik.http.routers.<app>.entrypoints = websecure
traefik.http.routers.<app>.tls.certresolver = le
traefik.http.services.<app>.loadbalancer.server.port = 8080

Managed DNS-01 (wildcard) certificates are likewise a Goma feature. Miabi can still issue them as workspace Certificates, but they are inert on Traefik — Traefik owns TLS entirely and issues its own ACME certificates, so use its resolver for wildcard domains.

Features that require Goma Gateway

FeatureWorks on Traefik?Notes
Basic app routing✅ (manual)You add traefik.* labels per app
Automatic domain → route configGoma-only; add labels manually instead
Managed DNS-01 / wildcard certsTraefik issues its own certs (ACME)
Rolling deploymentsRequires Goma — see below
Canary deploymentsRequires Goma — see below
Built-in container registryRequires Goma — see below
Recreate deploymentsUse this strategy on Traefik

Rolling and canary deployments require Goma

Rolling and canary strategies work by reweighting the proxy's backends — shifting traffic from the old release to the new one — which only Miabi's Goma integration drives. Traefik routes by static per-container labels that Miabi does not reconfigure mid-deploy.

On a Traefik stack, use the Recreate deploy strategy for every app (the container is replaced, with a brief moment of downtime). If you need zero-downtime rolling or progressive canary releases, run the default Goma stack.

The built-in container registry requires Goma

The built-in container registry's user/workspace authentication is enforced by Goma's forwardAuth middleware: the registry runs auth-less behind the gateway, and Goma forwards each request to Miabi to validate the Docker credentials (username = workspace name, password = API key) and scope the repository path to that workspace. Traefik is not wired for that callback, so on a Traefik stack keep the built-in registry off (MIABI_REGISTRY_ENABLED=false, the default) and use an external registry (Docker Hub, GHCR, …) instead.

Which should I choose?

  • Choose Goma (default) if you want automatic routing, managed wildcard certificates, zero-downtime rolling/canary deploys, or the built-in registry. This is the recommended path.
  • Choose Traefik if you already run Traefik as your edge and prefer label-based routing, and you can accept manual per-app labels and the Recreate deploy strategy.