Deploy the official OtoHits traffic-exchange client as a Render Web Service.
The upstream otohits/app image is a background client and does not listen on an HTTP port. Render Web Services require a process that binds to $PORT, including on the free plan. This repository adds a tiny, public status endpoint while preserving the upstream client as the main process:
9
GET /orGET /healthzreturns a non-sensitive JSON status response.- The OtoHits client still receives your
APPLICATION_KEYnormally. - No account data or application key is exposed by the endpoint.
- Push this repository to GitHub.
- In Render, select New β Blueprint, then choose this repository.
- At the
APPLICATION_KEYprompt, enter the application key from your OtoHits Application page. - Apply the blueprint. Render builds
Dockerfile, starts a Web Service, and checksGET /healthz.
The key is declared with sync: false, so Render stores it as a secret instead of committing it to the repository.
Once the service is live, open its Render URL:
https://your-service.onrender.com/healthz
Expected response:
{"status":"ok","service":"otohits-client"}Free web services can spin down after inactivity and take time to wake on the next request. That means this client is not suitable for uninterrupted 24/7 traffic exchange on a free instance. Use a paid always-on instance if continuous operation is required. Do not rely on automated keep-alive requests to work around hosting limits.
docker build -t otohit-web .
docker run --rm -p 10000:10000 \
-e PORT=10000 \
-e APPLICATION_KEY="your-application-key" \
otohit-webThen visit http://localhost:10000/healthz.
render.yamlβ Render Blueprint configured as a free Web Service.Dockerfileβ wraps the officialotohits/appimage.healthcheck.goβ minimal port/health endpoint.docker-entrypoint.shβ starts the listener and an Xvfb display, writes the container-safe client settings, then supervises the OtoHits client.
Every startup step is logged with a [docker-entrypoint-web] prefix β check
Logs in the Render dashboard first.
Application exited earlyright afterDeploying...β the previous version of this repository replaced the upstream image'sENTRYPOINT, and becauseotohits/app:latestis normally started with no container command (docker run -e APPLICATION_KEY=... otohits/app:latest), nothing was left to execute and the container exited immediately. The current entrypoint locates the client binary inside the image when no command is inherited.Error: missing email or password/No Application key found in otohits.ini/Error while reading AppKey: EOFβ the client never saw your key. The upstream image's original entrypoint is what converts theAPPLICATION_KEYenvironment variable into client configuration, and this repository replaces that entrypoint. The wrapper therefore writes anotohits.ini(/login:<key>,/nosandbox, and/autoupdate) next to the client binary before launching it. If you still see this error, make sure theAPPLICATION_KEYenvironment variable is set on the service (see below) β the startup logs will saywrote otohits.ini ...when the key was picked up.Unable to receive response from the viewer in time, trying to start viewer again...βotohits-vieweris based on Chromium and requires an X display even though it has no visible window. This wrapper now reproduces both parts of the official Docker launch setup: it starts an Xvfb virtual display and adds/nosandboxtootohits.ini. Look forvirtual display :51 is readybefore the client launch line. If Xvfb cannot start, its output is copied into the Render log with an[xvfb]prefix instead of allowing a silent viewer restart loop.- Warning that
APPLICATION_KEYis not set β add it under your service's Environment tab in Render (get it from your OtoHits Application page) and redeploy. The client exits immediately without it. - "could not find the OtoHits client binary" β the upstream image layout
changed. Run
docker image inspect otohits/app:latest --format '{{json .Config}}'to see the image's originalEntrypoint/Cmd, then set that command (without the entrypoint parts) as the service's Docker Command override in Render, or update the candidate list indocker-entrypoint.sh.