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=1 is 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

FlagDefaultDescription
--host0.0.0.0Listen address
--port8080Listen port
--api-keys(required)Comma-separated API keys
--dbnullbore.dbSQLite 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-cachecertsDirectory for TLS certificate cache
--max-ttl24hMaximum tunnel TTL
./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

What's next