Fix Private Registry "Pull Access Denied" on Coolify
Error: Error response from daemon: pull access denied / unauthorized: authentication required
Docker refuses to pull your image because the Coolify server was never authenticated to the private registry it's hosted on, so the deploy fails before the container can start.
Coolify doesn't manage credentials for arbitrary private registries through its own UI — it relies entirely on the Docker daemon's own credential store on the host (/root/.docker/config.json). If the server was never docker login-ed to that specific registry, or the stored credentials don't resolve for the path Coolify uses to pull, every deploy referencing that image fails at the Docker daemon level, before any of Coolify's own settings are even consulted. This shows up the same way for Docker Hub, GHCR, GCR, and self-hosted registries.
The fix
SSH into the server and log in to the registry directly, or re-save credentials under Coolify's Server > Docker Registry settings to regenerate the daemon's config file.
docker login <registry-host>Confirm the login actually works by pulling the image manually as the same user Coolify runs under.
docker pull <private-image>For self-hosted registries, confirm htpasswd-based auth is set correctly and the registry has been restarted since the credentials were added.
If you're running Docker Swarm, confirm the registry is reachable from every node, not just the leader — a pull that works on one node can still fail on another.
Verify it worked
The manual docker pull succeeds on the host, and a redeploy completes without a pull access denied or unauthorized error.
docker pull <private-image>Related Coolify errors
- Timeout / no response / container not starting
- no available server (Traefik 503) behind your Coolify domain after a successful deploy
- 502 Bad Gateway (Traefik) — build succeeds and container runs, but your-domain.com returns 502 Bad Gateway
- Healthcheck failed / Container is unhealthy — new container never receives traffic, deploy rolls back to the old container (or shows 404 "No available server")
Sources
- github.com/coollabsio/coolify/issues/6398
- github.com/coollabsio/coolify/issues/4604
- github.com/coollabsio/coolify/issues/4763
- coolify.io/docs/knowledge-base/docker/registry