🐞 Docker 29.* / Traefik Compatibility Troubleshooting Guide

We'll be seeing an official fix in the next release. However this may aid other Users who have searched and are still searching for answer to this issue. One bug potentially in resolution (well two if you count the Linux issue that has also been resolved in full and is a Linux issue not a Wappler issue). Great start and very appreciated.

Traefik + Docker Engine 29.x — bugs we hit and how we fixed them

DigitalOcean and many VPS images now ship Docker Engine 29.x. Stacks that worked before (Node app + Traefik + Compose, typical for Wappler Server Connect deploys) started failing in confusing ways: containers “up,” site dead.

Below is the list of issues we traced and the fixes that actually worked.


1. Traefik starts but every request returns 404

Symptom: Traefik listens on 80/443. App container is running. Browser shows 404 page not found. Traefik logs may include:

client version 1.24 is too old

Cause: Docker Engine 29+ requires Docker API ≥ 1.44. Older Traefik images (e.g. traefik:v3.0 through v3.5) still use API 1.24. Traefik starts but cannot talk to the Docker socket, so it discovers no backends and serves 404 for everything.

Fix:

  • Use traefik:v3.6.1 or newer (we standardised on traefik:v3.6.7).
  • After deploy, check Traefik logs for the API error above — if it’s there, upgrading the image is the fix, not debugging the app.

Upstream reference: github.com/traefik/traefik/issues/12253


2. App is running but Traefik still returns 404 (healthy container filtering)

Symptom: Correct Traefik version. App process is fine. Site still 404.

Cause: Traefik v3 does not route to containers whose Docker HEALTHCHECK is failing. Many Node/Wappler apps only serve /, not /health. A probe to /health fails → Docker marks the container unhealthy → Traefik drops all routes for that service.

Fix:

  • Point HEALTHCHECK at something the app actually serves, e.g. http://localhost:3000/ (not /health).
  • Add Traefik flag: --providers.docker.allowEmptyServices=true so routes don’t vanish during the container start-period while the app is still starting.

3. Compose fails: external network not found

Symptom: docker compose up errors because network traefik-public (or similar) doesn’t exist.

Cause: Docker 29.x does not auto-create external networks declared in compose. They must exist before up.

Fix: Create the network first:

docker network create traefik-public 2>/dev/null || true

Use whatever network name your compose file expects.


4. Redeploy fails: port already allocated (80 / 443)

Symptom: Second deploy fails with ports 80 or 443 already in use — common after a failed first attempt or a leftover Traefik container.

Cause: An old container still holds those host ports; Docker 29 won’t bind them again.

Fix:

  • Redeploy with docker compose up -d --force-recreate.
  • If that fails: docker compose down, stop any container still on 80/443, then retry.
  • On shared staging (one Traefik for many apps): don’t try to start a second Traefik on 80/443 — only attach the app to the existing proxy network.

5. HTTPS / Let’s Encrypt fails silently

Symptom: HTTP may work briefly; HTTPS never gets a certificate; little obvious error in the app.

Cause: Usually one of:

  • Cert resolver name in Docker labels doesn’t match Traefik static config (e.g. letsencrypt vs leresolver).
  • Global HTTP→HTTPS redirect on port 80 runs before HTTP-01 ACME can complete.

Fix:

  • Use the same cert resolver name in Traefik config and app labels.
  • For HTTP-01: don’t redirect all of port 80 to HTTPS at the entrypoint; use per-router redirect after certs exist.
  • If you route both apex and www, both need DNS (A or CNAME) pointing at the server.

6. Compose variables (${DOMAIN}, ${ACME_EMAIL}) empty or unresolved

Symptom: Traefik host rules blank; compose warns about unresolved variables.

Cause: Variables in the compose file itself (e.g. in Traefik labels) are resolved at compose parse time. Putting values only in a service env_file: does not substitute them in labels. Docker 29 is stricter about missing values.

Fix: Pass env file globally to compose:

docker compose --env-file .env.deploy -f docker-compose.yml up -d

Put DOMAIN, ACME_EMAIL, etc. in that file.


7. Multiple staging apps on one server

Symptom: Deploying one app breaks others on the same VPS, or port conflicts on every deploy.

Cause: Each project starting its own Traefik on 80/443.

Fix: Run one Traefik on the host. Per app, only add:

  • Docker labels for routing
  • Membership on the shared network (e.g. traefik-public or whatever Wappler’s local proxy uses)

Do not publish 80/443 again from each app stack.


Quick reference

Issue Typical symptom Fix
Traefik API too old for Docker 29 404; “client version 1.24 is too old” traefik:v3.6.1+
Bad HEALTHCHECK 404 while app runs Probe / on app port; allowEmptyServices=true
External network missing Compose network error docker network create … before up
Port conflict on redeploy “port already allocated” force-recreate, down + cleanup, retry
ACME / TLS HTTPS never works Matched resolver; no global :80→HTTPS for HTTP-01
${VAR} in compose Blank hosts / compose errors Global --env-file
Shared staging Sites fight over 80/443 One Traefik; labels + shared network per app

Minimal checklist for a working Docker 29 + Traefik stack

  1. traefik:v3.6.1 or newer
  2. HEALTHCHECKhttp://localhost:<app-port>/
  3. --providers.docker.allowEmptyServices=true
  4. Create external proxy network before compose up
  5. docker compose --env-file … for label variables
  6. One Traefik per host on shared servers

Further advice until the fix is implemented:

1 Like

Hahaha love the ladybird Ben!

defcon-1-302875448

Far better than level 4! Which is where I was earlier in the day...

:rofl:

1 Like