Render app deploy stuck on in progress

By

Learn how to fix a Render deploy stuck forever on in progress, caused by binding to 127.0.0.1, by starting your app on host 0.0.0.0 instead.

~~~

If your Render deploy never finishes and stays “in progress” forever, the cause is almost always your app binding to 127.0.0.1 instead of 0.0.0.0. Render can’t detect the open port, so it keeps waiting.

Here’s how it looked for me. I was trying to deploy an app on Render but stuck in a forever cycle of “in progress” build, the build never ended processing:

Render deploy log shows no open HTTP ports on 0.0.0.0 while npm start runs Astro dev server bound to 127.0.0.1:4321

Notice 127.0.0.1? That’s the problem.

Render doesn’t “pick it up”.

You have to bind the server to host 0.0.0.0 instead of 127.0.0.1.

For Node scripts, you can do this by prepending HOST=0.0.0.0:

HOST=0.0.0.0 node app.js

I used this in package.json, and used npm run start in my Render site setting “Start Command” for an Astro site:

{
  ...
  "scripts": {
    "dev": "astro dev",
    "start": "HOST=0.0.0.0 node ./dist/server/entry.mjs",
    "build": "astro build",
    "preview": "astro preview",
    "astro": "astro"
  },
  ...
}

Render Start Command settings page explaining it launches app processes, with npm run start entered in the command field

Why does the host matter?

127.0.0.1 is the loopback address. A server bound to it only accepts connections coming from inside the same machine, or in Render’s case, from inside the same container. Nothing outside can reach it.

Render runs a port scan after your app starts. When it finds a port listening on 0.0.0.0, it marks the deploy as live and starts routing traffic to it. That’s the “Detected open port” message you want to see in the logs.

Bound to 127.0.0.1, your app runs fine but is invisible to that scan. Render waits, retries, and the deploy sits on “in progress” until it eventually gives up.

Most web frameworks default to 127.0.0.1 in development, because that’s the safe choice on your laptop. On a hosting platform you need the opposite.

Watch the port too

The host is half of it. Render also tells your app which port to use through the PORT environment variable.

The Astro Node adapter reads both HOST and PORT from the environment, so on Render the port part worked without me doing anything. If you’re running something like Express, pass both explicitly:

const port = process.env.PORT || 3000

app.listen(port, '0.0.0.0', () => {
  console.log(`Listening on ${port}`)
})

One more mistake visible in my first screenshot: the start command was running astro dev, the development server. Always run the production build on Render. Build with astro build, then start the compiled entry file, like the start script above does.

Tagged: Services · All topics
~~~

Related posts about services: