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.1or newer (we standardised ontraefik: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
HEALTHCHECKat something the app actually serves, e.g.http://localhost:3000/(not/health). - Add Traefik flag:
--providers.docker.allowEmptyServices=trueso 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.
letsencryptvsleresolver). - 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-publicor 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
traefik:v3.6.1or newerHEALTHCHECK→http://localhost:<app-port>/--providers.docker.allowEmptyServices=true- Create external proxy network before
compose up docker compose --env-file …for label variables- One Traefik per host on shared servers
Further advice until the fix is implemented:
