Skip to content
Your own VPN server, managed from a web page
Download

1. Installing

What you need

  • A server (virtual or physical) with a fresh installation of Debian 13 or Ubuntu 24.04, 64-bit. A fresh server is best: the installer sets up its own web server and firewall.
  • Root access (sudo) and some free disk space (the setup check asks for at least 500 MB). The application is light; a small virtual server is enough. A fresh Debian has no curl yet (sudo apt install -y curl), which you need to download the release.
  • A way for people to reach the server: a public IP address or a DNS name, with UDP 1194 (the VPN) and TCP 8443 (the web interface) allowed through any router or cloud firewall in front of it. SSH stays open.

Installing

Everything below is run on the server. The download page shows the same commands with the current version filled in; replace X.Y.Z here with that version.

1. Download the release into a new directory. The loop fetches the archive, its checksum list and signature, the installer, the uninstaller and the public signing key:

mkdir tunnelry && cd tunnelry
BASE=https://updates.tunnelry.com/releases/X.Y.Z
for f in tunnelry-X.Y.Z.tar.gz SHA256SUMS SHA256SUMS.sig install.sh uninstall.sh release-key.pub.pem; do
  curl -fsSL -O "$BASE/$f"
done

If the server has no internet access, download the same files on another computer and copy them into one directory on the server (for example with scp).

2. Check the key. Compare this fingerprint with the one on the download page, so you know the key is the project's:

openssl pkey -pubin -in release-key.pub.pem -outform DER | sha256sum

3. Run the installer as root, from that directory:

sudo bash install.sh --archive tunnelry-X.Y.Z.tar.gz

The installer verifies the signature of the release before it unpacks anything, installs the packages it needs (nginx, PHP, OpenVPN, easy-rsa, nftables, unbound, sqlite3), creates an unprivileged tunnelry user for the web application, writes the system files and starts the web interface. It takes a few minutes and ends with this:

Tunnelry <version> is installed.

  Open:         https://203.0.113.10:8443
  Certificate:  self-signed; SHA-256 fingerprint 54:6B:02:...
  Setup token:  dZIFQnsv1MLAHFjgJvV1lBvYU8cjqUIJ

Write down the setup token. It is shown once and lets you create the first administrator. If you lose it, run the installer again with --new-token.

The web interface starts with a self-signed certificate, so your browser warns you the first time. Compare the SHA-256 fingerprint in the browser's certificate details with the one the installer printed before you accept.

Options

OptionMeaning
--public-key FILEverify the signature with this Ed25519 public key (use the key published with the release)
--gui-port PORTport of the web interface (default 8443)
--address HOSTaddress shown in the URL and certificate (default: the server's main IPv4 address); use a DNS name if people will reach it by name
--update-url URLwhere the Updates page looks for new versions (https only)
--new-tokenissue a new one-time setup token
--forcecontinue although the checks found something unusual (other web sites on the machine, another distribution)

Running the installer again is safe: it repairs or refreshes the installation without changing its keys. The installer's log is kept in /var/log/tunnelry-install.log.

What it changed on the server

Everything Tunnelry owns is in a few places, so you always know what it touched:

PlaceWhat
/opt/tunnelrythe application (one folder per version, current points at the active one)
/var/lib/tunnelryits data: the database, settings, backups
/etc/tunnelrythe certificate authority and the server's state (root only)
/etc/openvpn/serverthe OpenVPN configuration it generates
/usr/lib/tunnelrythe privileged helper vpnctl
nginx site, PHP pool, sudoers rule, systemd units, nftables table tunnelrygenerated by Tunnelry and rewritten on update

Next: the setup wizard.