8000 was Portainer's Edge tunnel, not a stray process. The first attempt at a fix picked 18080/18081, which are the production dtf-cloud stack's own defaults in docker-compose.yml: it would have passed only while that stack was down and collided again the moment it came back. Use 28080/28081/28000/29000/29001, clear of Portainer (8000, 9443), both production stack definitions (18080/18081 and 8080/8081) and the usual MinIO ports. The occupants are listed in the workflow so the next person choosing a port can see what is taken. Ephemeral ports would remove the guesswork but do not work here: the published port is baked into PUBLIC_ORIGIN, ALLOWED_ORIGINS and the CSP when the containers start, so it has to be known before they run. Full suite verified on the new block, including the browser end-to-end. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9.6 KiB
9.6 KiB