TunnelFleet
Use Case: DevOps Teams

Eliminate manual VPN provisioning from your workflows

If you're already automating infrastructure, you don't want WireGuard setup to be the one thing that still requires SSH and manual configuration. TunnelFleet brings the same automated-provisioning approach to VPN servers.

The Problem

VPN infrastructure in a DevOps context

  • WireGuard setup breaks automation pipelines

    Most IaC tools can create VMs, but bootstrapping WireGuard correctly still requires manual steps or a custom Ansible playbook.

  • SSH dependencies in provisioning scripts

    Any automation that requires SSH access adds complexity: key management, security group rules, wait-for-port logic.

  • Firewall rules are easy to get wrong

    iptables/nftables rules for WireGuard NAT require attention. A wrong rule breaks routing silently.

  • Managing WireGuard configs at scale

    As the number of servers grows, keeping WireGuard configurations consistent and correct becomes a separate maintenance burden.

The Solution

cloud-init as the automation primitive

TunnelFleet uses cloud-init — the standard cloud VM bootstrapping mechanism — to provision WireGuard. This is the same approach you would take writing a production-ready Ansible role, but without the maintenance overhead of building and maintaining that role yourself.

The provisioning is SSHless by design. TunnelFleet calls the cloud provider API, passes a cloud-init script as user-data, and polls for completion via the API. No SSH, no ports to wait on, no jump hosts.

  • cloud-init based — no SSH required
  • Consistent, auditable provisioning script
  • Key generation on-server (not in pipelines)
  • API-driven: cloud provider API + TunnelFleet callback

The provisioning approach in detail

Typical Ansible approach

wireguard.yml
- name: Install WireGuard
  apt:
    name: wireguard
    state: present

- name: Generate WireGuard keys
  shell: wg genkey
  register: private_key

- name: Get public key
  shell: echo "$PRIVATE_KEY" | wg pubkey
  register: public_key

- name: Configure WireGuard interface
  template:
    src: wg0.conf.j2
    dest: /etc/wireguard/wg0.conf
    mode: 0600

- name: Enable IP forwarding
  sysctl:
    name: net.ipv4.ip_forward
    value: "1"
    sysctl_set: yes

- name: Configure UFW
  ufw:
    rule: allow
    port: "51820"
    proto: udp

# ... more tasks ...
# Requires SSH, become, and a correctly
# configured Ansible inventory

TunnelFleet approach

deploy.sh
# Everything above happens automatically
# via TunnelFleet cloud-init.
#
# From the TunnelFleet dashboard:
# 1. Click "New Server"
# 2. Choose region + size
# 3. Click "Deploy"
#
# Or via the TunnelFleet API (coming soon):
# POST /api/v1/servers
# {
#   "name": "vpn-prod-01",
#   "region": "lon1",
#   "size": "s-1vcpu-1gb"
# }
#
# No SSH. No Ansible inventory.
# No become_user. No wait_for_connection.
# Keys generated on-server.
# Provisioning idempotent by cloud-init.

Frequently Asked Questions

Automate your VPN infrastructure

cloud-init provisioning, no SSH dependencies, consistent deployments every time.