Server Setup
Run your own NullBore server. One binary, zero dependencies (besides SQLite).
Download
Pre-built binaries are on the releases page.
Or build from source:
git clone https://github.com/nullbore/nullbore-server.git
cd nullbore-server
CGO_ENABLED=1 go build -o nullbore-server ./cmd/server/
Note:
CGO_ENABLED=1is required for the SQLite dependency.
Quick start
# Generate an API key
API_KEY="nbk_$(openssl rand -hex 24)"
echo "Your API key: $API_KEY"
# Start the server
./nullbore-server \
--host 0.0.0.0 \
--port 8080 \
--api-keys "$API_KEY" \
--dash-password "your-dashboard-password"
The server is now running at http://localhost:8080 with:
- REST API at
/v1/tunnels - Dashboard at
/dash - Health check at
/health
Server flags
| Flag | Default | Description |
|---|---|---|
--host | 0.0.0.0 | Listen address |
--port | 8080 | Listen port |
--api-keys | (required) | Comma-separated API keys |
--db | nullbore.db | SQLite database path |
--dash-password | (none) | Dashboard passphrase (enables /dash) |
--base-domain | (none) | Base domain for subdomain routing (e.g., tunnel.example.com) |
--tls-domain | (none) | Domain for automatic TLS via Let's Encrypt |
--tls-email | (none) | Email for Let's Encrypt registration |
--tls-cache | certs | Directory for TLS certificate cache |
--max-ttl | 24h | Maximum tunnel TTL |
With TLS (recommended for production)
./nullbore-server \
--host 0.0.0.0 \
--port 443 \
--api-keys "$API_KEY" \
--tls-domain tunnel.yourdomain.com \
--tls-email admin@yourdomain.com \
--base-domain tunnel.yourdomain.com \
--dash-password "your-dashboard-password"
See TLS & Certificates for full details.
DNS setup
For subdomain routing, you need:
A tunnel.yourdomain.com → your-server-ip
A *.tunnel.yourdomain.com → your-server-ip
The wildcard record enables myapp.tunnel.yourdomain.com style URLs.
Docker
docker run -d \
-p 443:443 \
-v nullbore-data:/data \
-e API_KEYS="$API_KEY" \
-e TLS_DOMAIN=tunnel.yourdomain.com \
-e TLS_EMAIL=admin@yourdomain.com \
ghcr.io/nullbore/nullbore-server