Most server and deploy problems aren't hard. They're just confusing the first time you hit them. Here are five we see constantly, each with the cause, the fix and a way to check it worked.
1. Your firewall blocks port 8080, but Docker opens it anyway
Why it happens: when you publish a port with -p 8080:80 , Docker rewrites the traffic to the container's IP. The packet then goes through the FORWARD chain, where Docker's own rules accept it. UFW mostly manages INPUT , so ufw deny 8080 never sees it.
The fix: if only your reverse proxy needs the port, bind it to localhost in compose.yaml :
ports : - "127.0.0.1:8080:80"
Enter fullscreen mode
Exit fullscreen mode
Check it: run docker ps . You want 127.0.0.1:8080->80/tcp , not 0.0.0.0:8080 . Then test from another machine with nc -zv your.server.ip 8080 . It should fail.
2. Works locally, blank page when deployed (Vite, React, Lovable exports)
Why it happens: the built index.html loads its JS and CSS from paths that don't exist on the server.…