This is the preflight checklist for the person who will own the deployment. Do not start with the installer and discover the network design afterward: the public URL, gateway reachability, address pools, and recovery custody become part of issued client state.
Choose a topology
Section titled “Choose a topology”| Topology | Best for | What you run |
|---|---|---|
| Single Linux VM | Evaluation and a small first deployment | Control plane, PostgreSQL, Redis, edge, and one gateway on one host |
| Control plane plus remote gateways | Multiple offices, VPCs, or regions | One control plane and a gateway in every routed location |
| Multiple gateways per site | Gateway maintenance and site failover | Two or more independently reachable gateways bound to the same site |
| Kubernetes integration | Publishing private cluster Services | Normal control plane plus a site gateway and in-cluster connector; the GitOps operator path is not usable in this release |
Tunnex is self-hosted. It does not provide a hosted traffic relay or managed NAT traversal fleet. A gateway can call the control plane from behind NAT, but clients and other sites cannot initiate WireGuard traffic to that gateway unless you provide a reachable UDP endpoint or port forward.
Host and software prerequisites
Section titled “Host and software prerequisites”For the public Compose installer, prepare a dedicated Linux host with:
- an
amd64orarm64CPU; - Docker Engine and Docker Compose v2;
curlandopenssl;- correct DNS and time synchronization; and
- durable storage for PostgreSQL and the Tunnex secrets volume.
Two vCPUs and 2 GB of RAM are a reasonable evaluation starting point, not a production sizing guarantee. Size from your actual device count, audit volume, retention, and database monitoring.
Run these checks before installing:
uname -mdocker versiondocker compose versiontimedatectl statusgetent hosts vpn.example.comDNS and ports
Section titled “DNS and ports”Use one stable public origin such as https://vpn.example.com. Direct HTTPS to
a raw IP is rejected by the installer because certificate management needs a DNS
name.
| Direction | Port | Purpose |
|---|---|---|
| Users → control plane | TCP 443 | Web console and API |
| Internet → direct-TLS host | TCP 80 | Certificate challenge and redirect when direct TLS is used |
| Gateways → control plane | TCP 8443 | Raw mutually authenticated gateway control channel |
| Devices/sites → gateway | UDP 51820 by default | WireGuard data plane |
| Control plane → SMTP | TCP 587 when configured | STARTTLS email delivery |
Open the same rules in the provider firewall, host firewall, and any intervening
NAT device. A healthy HTTPS page proves only TCP reachability; it does not prove
that 51820/udp reaches the gateway.
Address planning
Section titled “Address planning”Choose non-overlapping ranges for:
- the organization device pool;
- each site’s private LANs;
- Kubernetes Service CIDRs and synthetic VIP pools; and
- optional IPv6 pools.
The Routed ranges page is the source of truth after deployment, but it is read-only. Pending site advertisements are approved under Sites. Do not interpret a partially loaded inventory as proof that a range is free.
Client and enforcement boundaries
Section titled “Client and enforcement boundaries”- Managed macOS and Windows clients can report posture. Linux CLI, imported WireGuard/OpenVPN profiles, iOS, and Android do not provide managed posture.
- Static/imported profiles bake in routes and DNS. Re-export and re-import them after a route, DNS, or gateway-home change that cannot be delivered in place.
- Full tunnel requires an egress-capable gateway and working return routing.
- Access rules do nothing until enforcement is enabled. Enforcement is default-deny, so an omitted recovery rule can lock operators out of the data plane.
- Network policy limits where an AI agent can connect; it cannot inspect prompts or detect prompt injection. MCP tool policy applies only through the explicit local MCP proxy.
Recovery is a prerequisite
Section titled “Recovery is a prerequisite”A usable control-plane recovery set has two separately protected artifacts:
- a PostgreSQL custom-format dump; and
- the exact 32-byte Tunnex master key.
Losing the master key makes sealed CA, MFA, SSO, and OpenVPN material unrecoverable even when the database dump is intact. Gateway and device private keys are generated on their hosts and are not in the control-plane backup.
Production go/no-go
Section titled “Production go/no-go”Before adding real users, be able to answer yes to all of these:
- The public URL resolves from every user network.
- HTTPS, TCP
8443, and the chosen WireGuard UDP port were tested independently. - Site, device, Kubernetes, and VIP ranges do not overlap.
- At least two people know how to access the host out of band.
- The master key and database dump have separate, tested custody.
- SMTP or an explicit manual invitation/reset process is available.
- A representative allowed flow and denied flow can be tested.
- The restore and forward-only upgrade procedures have named owners.
Continue with the control-plane installation or use the Quickstart for a compact evaluation path.