OpenClaw gateway process runs but port 3000 not listening

Deployed OpenClaw on Fly.io. The node process runs but curl localhost:3000 fails. No “listening” message, no errors. Works fine locally with Docker. Any ideas?

Is there a verbose mode for OpenClaw? Or maybe does it write logs? Is this on a sprite or a regular machine?

Thanks for the reply!

Yes, there is a verbose mode for OpenClaw. You can run the gateway with --verbose to get more detailed console output:

bash

node dist/index.js gateway --port 3000 --bind lan --verbose

I’ve tried this, but the gateway produces no output at all — not even error messages. It just hangs silently. When I run curl localhost:3000, it fails with “connection refused.”

I’ve also tried:

  • Creating a config file at /data/openclaw.json with "bind": "lan" and "port": 3000

  • Setting environment variables like OPENCLAW_GATEWAY_PORT and OPENCLAW_GATEWAY_BIND

  • Running openclaw doctor (but the openclaw command isn’t available in the Fly.io container)

This is on a regular Fly.io machine (not a GPU machine). The Docker image builds successfully (852 MB) and the node process shows as running with ps aux, but it never binds to the port.

Any ideas what could cause the gateway to run but produce absolutely no output and never bind? Could this be a missing dependency or a permissions issue with the /data volume?

I’d say this is your next step. I’ve never used openclaw before, so I am not aware of the toolset, but this sounds to be exactly what you need. I assume openclaw can be installed from source, so that this command is included. But do check dist/*.js in case there is a console command hiding in there already.

Finally run netstat or similar to make sure that port 3000 is not already taken on your machine.

Ok..thanks…I’ll try that and see how it goes!

Out of interest, what is the image you are using? If it is a custom one, would you add here your Dockerfile?

Using official image: ghcr.io/openclaw/openclaw:latest

Problem: Gateway says “ready” and “HTTP server started” but doesn’t actually bind to any port. netstat -tlnp shows nothing listening.

What I see:

text

[gateway] ready
[gateway] starting HTTP server...

But curl localhost:18789/healthConnection reset by peer

Tried: --bind lan, config file with dangerouslyAllowHostHeaderOriginFallback, port 3000/8080, host networking.

Why does it say ready but not bind? Docker image issue?

My guess is that it is listening in encrypted mode, and needs a certificate; I wonder if there is an unencrypted mode? The “Connection reset by peer” can be an indicator of TLS/plaintext mismatch. I don’t think it would be Docker.

Can you do --help to show the console commands, and then put them here? A reader might see a relevant option you can try.