Docker
Two images are published:
scaleassembly/zshotforwards its arguments to thezshotbinary. Pass the same flags you would on the command line. It applies--containerautomatically.scaleassembly/zshot-serveris opinionated: it runs the HTTP server on0.0.0.0:3000in container mode, with a built-in health check. Supply a license and it works with no flags.
zshot-server
docker run --rm -p 3000:3000 \
-e ZSHOT_LICENSE="MY-ZSHOT-LICENSE-KEY" \
scaleassembly/zshot-serverThe server listens on port 3000. Server mode requires the Pro tier; the image exits at startup if no license is present.
Change the port or bind address with environment variables; the baked-in health check follows the same value:
docker run --rm -p 8080:8080 \
-e ZSHOT_SERVER_PORT=8080 \
-e ZSHOT_LICENSE="MY-ZSHOT-LICENSE-KEY" \
scaleassembly/zshot-serverWhen ZSHOT_SERVER_PORT is unset the server binds a PORT from the environment, so hosts that inject one — Railway, Render, Heroku — work with no configuration.
Set authentication by environment variable, so a deploy needs no custom command:
docker run --rm -p 3000:3000 \
-e ZSHOT_LICENSE="MY-ZSHOT-LICENSE-KEY" \
-e ZSHOT_SERVER_TOKEN_AUTH="MY-TOKEN" \
scaleassembly/zshot-serverZSHOT_SERVER_BASIC_AUTH takes user:password for HTTP basic auth. ZSHOT_SERVER_SIGNED_URL takes hmac-sha256:<secret> to require signed GET requests, and ZSHOT_SERVER_SIGNED_URL_MAX_AGE caps their lifetime in seconds. Append any other zshot flags after the image name; they override the defaults. See Server for the endpoints and tuning flags.
zshot
Run any zshot command. For a server, pass the --server flags yourself:
docker run --rm -p 3000:3000 \
-e ZSHOT_LICENSE="MY-ZSHOT-LICENSE-KEY" \
scaleassembly/zshot \
--server --server-bind-address 0.0.0.0--server-bind-address 0.0.0.0 listens on all interfaces; the server binds 127.0.0.1 by default, which is unreachable from outside the container.
License
Supply the license one of two ways.
Set the ZSHOT_LICENSE environment variable to your license key:
docker run --rm -p 3000:3000 \
-e ZSHOT_LICENSE="MY-ZSHOT-LICENSE-KEY" \
scaleassembly/zshot-serverOr mount a zshot.toml and point --config at it:
docker run --rm -p 3000:3000 \
-v /host/zshot.toml:/etc/zshot/zshot.toml:ro \
scaleassembly/zshot-server \
--config /etc/zshot/zshot.tomlHealth checks
scaleassembly/zshot-server ships a Docker HEALTHCHECK that probes /status. To check it yourself, or to add one to the generic image:
curl http://localhost:3000/statusIt returns 200 with the current number of in-flight requests once the server is ready. /status is not behind authentication.
Deploy to Railway
Create a Railway service from the Docker image source set to scaleassembly/zshot-server:latest. Set ZSHOT_LICENSE to your key and ZSHOT_SERVER_TOKEN_AUTH to a token — Railway serves a public URL, and the API is not built to sit open on the internet. Railway injects PORT, which the image binds automatically. Point the health check at /status and allow about 1 GB of memory.
Render through the generated domain with the token:
curl -H "Authorization: Bearer MY-TOKEN" \
"https://YOUR-APP.up.railway.app/?url=https://example.com&output_type=png" -o out.png