A Bump VPN server is an OpenVPN server plus a small credential service, shipped as one Docker image. It registers itself with the Bump directory using your organization key, and once Bump activates it the app can route users through it. Plan on about 30 minutes the first time.
network_mode: host, so it does not run on Docker Desktop for Mac or Windows without extra port forwarding.vpn1.example.org) with an A record pointing at the host. Let's Encrypt issues the certificate automatically, so the name must resolve publicly before you start.c-…) and API key (bvk_…) from the dashboard. The key is shown once when created or rotated.Two files, served by this console for the vpn-directory.bumpapp.xyz directory. The image is public and has the OpenVPN config and helper scripts baked in, so this is all a server needs:
mkdir bump-vpn && cd bump-vpn curl -fsSO https://operators.bumpapp.xyz/docs/docker-compose.yml curl -fsS -o .env https://operators.bumpapp.xyz/docs/env
Edit .env and set these; leave everything else at its default:
VIRTUAL_HOST=vpn1.example.org LETSENCRYPT_HOST=vpn1.example.org BUMP_DIRECTORY_ORGANIZATION=c-your-organization-id BUMP_DIRECTORY_API_KEY=bvk_your-key
.env and restart it right after a rotation.Nothing to build: the compose file pulls the published image and runs Watchtower, which keeps the server on the latest release:
docker compose up -d
The first start takes a minute or two: OpenVPN generates its keys and Let's Encrypt issues the certificate. Follow along with:
docker compose logs -f openvpn-server
curl https://vpn1.example.org/health answers 200 once the certificate is in place.UNAUTHENTICATED).docker compose restart openvpn-server.openvpn/keys/server-id. Keep that folder; deleting it registers a new server and orphans the old record.bump-vpn folder (.env, openvpn/keys, nginx), update the DNS record, start on the new host.server.conf at openvpn/server.conf and uncomment its mount in docker-compose.yml; the one baked into the image is used otherwise.| Symptom | Check |
|---|---|
| Never shows up on the dashboard | docker compose logs openvpn-server | grep -i directory. UNAUTHENTICATED means the organization id or key is wrong; a connection error means the host cannot reach vpn-directory.bumpapp.xyz on 443. |
| Certificate never issues | The hostname must resolve to this host from the internet and TCP 80 must be reachable. docker compose logs letsencrypt shows the challenge result. |
| Shows online but the app cannot connect | UDP 1194 is blocked somewhere. Test from outside: nc -vzu vpn1.example.org 1194. |
| Marked DNS on the dashboard | The hostname resolves to a different address than the one the server reports. Fix the A/AAAA record; the check repeats every few minutes. |
Uplink capacity and Datadog log shipping are optional settings documented inline in .env. IPv6 works when the host has a public IPv6 address (the server listens dual-stack); add an AAAA record for the hostname.