distroless/static-debian12. There is no shell, no package manager, and no unnecessary tooling — just the compiled binary. This guide covers running it with docker run and with Docker Compose, including how to persist state and serve custom static files.
Quick start with docker run
The fastest way to get verifyngo running is a singledocker run command. Mount your config.json into the container and expose port 8080:
Docker Compose
For production deployments, Docker Compose gives you a repeatable, version-controlled setup. The following file is based on the project’s example and includes a named volume for persistent state:docker-compose.yml
Persisting state
By default, verifyngo keeps its ban and verification state in memory. When the container restarts, that state is lost and previously-banned clients can connect again. To persist state across restarts, mount a named volume at/data and point store.file.path at a file inside it:
config.json
/data/store.json every 30 seconds and reloads it on startup. The verifyngo-data named volume in the Compose example above satisfies the /data mount.
Serving custom static files
You can supply a custom logo, stylesheet, or other assets by mounting a local directory into the container and telling verifyngo where to find it with thestatic_dir config key. Those files are then reachable under /static/ and can be referenced in your branding config.
Mount the directory when you run the container:
static_dir at the mount path in your config:
config.json
config.json
The Docker image runs as a non-root user (
nonroot:nonroot). Make sure any files and directories you bind-mount into the container are readable by this user. On Linux, chmod o+r on the files (or o+rx on directories) is the simplest fix if you run into permission errors.