A narrow post-0.7.1 patch: two reliability gaps caught once 0.7.1 went out, both narrow in scope. The
git://protocol was not part of thelib/gitEgressSSRF guard, so a repository URL ofgit://169.254.169.254/...could reach the cloud metadata service; and the Traefik reaper'sdocker network ls --filterquery used^anchors that Docker treats as literal characters, so the reaper matched no bridge and Traefik was never re-attached to the per-slugnd-svc-<slug>orndcmp-<slug>_defaultbridges after a restart, leaving every domain on those meshes answering 502 until a full service redeploy ranensureServiceBridgefor that slug. No new features — just two holes closed.
Fixed
- The
git://protocol is now part of the egress SSRF guard.lib/gitEgress.tshandled onlyhttp://,https://, andssh://URLs, leavinggit://(port 9418, supported bysimple-git) with no check. A repository URL ofgit://169.254.169.254/...could reach the cloud metadata service and leak instance credentials, andgit://<private-LAN>/...could reach internal Git servers. Thegit://branch parses the URL and callsrejectIfPrivateHost, mirroring thessh://guard. Four new regression cases cover the metadata service, RFC1918 LAN, loopback, and the positive public case. - The Traefik bridge reaper actually reaps. Docker's
--filter name=<value>is a substring match, not a regex, so the^anchors inname=^nd-svc-andname=^ndcmp-were treated as literal characters and the filter matched no bridge. After any Traefik restart (deploy, host reboot, image update), the reaper silently returned zero bridges and Traefik was never re-attached to the per-slugnd-svc-<slug>meshes or thendcmp-<slug>_defaultcompose defaults — every domain on those meshes answered 502 until a full service redeploy ranensureServiceBridgefor that slug. The anchors are gone and a regression test pins the substring-not-regex invariant so it cannot silently regress.