Linux Client Build Guide
This guide builds and packages the Linux desktop client (client/linux/src/main.py) as a Debian package.
Supported Targets
- Debian and Ubuntu derivatives (amd64)
- Package name:
tornadovpn-client
Prerequisites
sudo apt update
sudo apt install -y build-essential dpkg-dev python3-pip python3-venv python3-pyqt5 wireguard-tools
1. Build Environment
cd client/linux
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
pip install pyinstaller
2. Build Binary With PyInstaller
pyinstaller --noconfirm --onefile --windowed \
--name tornadovpn-client \
--add-data "../../assets/icons/*.svg:." \
src/main.py
Expected output binary:
client/linux/dist/tornadovpn-client
3. Package Layout
mkdir -p tornadovpn-client_1.0.0_amd64/DEBIAN
mkdir -p tornadovpn-client_1.0.0_amd64/usr/bin
mkdir -p tornadovpn-client_1.0.0_amd64/usr/share/applications
mkdir -p tornadovpn-client_1.0.0_amd64/usr/share/icons/hicolor/scalable/apps
mkdir -p tornadovpn-client_1.0.0_amd64/usr/share/doc/tornadovpn-client
Copy payload:
cp dist/tornadovpn-client tornadovpn-client_1.0.0_amd64/usr/bin/
cp ../../assets/icons/tornado_vpn.svg tornadovpn-client_1.0.0_amd64/usr/share/icons/hicolor/scalable/apps/tornadovpn-client.svg
cp -r DEBIAN/* tornadovpn-client_1.0.0_amd64/DEBIAN/
cp ../../LICENSE tornadovpn-client_1.0.0_amd64/usr/share/doc/tornadovpn-client/copyright
cp ATTRIBUTIONS.md tornadovpn-client_1.0.0_amd64/usr/share/doc/tornadovpn-client/
If you want a launcher, provide a .desktop file and copy it into usr/share/applications.
4. Permissions and Build
chmod 755 tornadovpn-client_1.0.0_amd64/DEBIAN/postinst
chmod 755 tornadovpn-client_1.0.0_amd64/DEBIAN/postrm
dpkg-deb --build tornadovpn-client_1.0.0_amd64
Expected artifact:
tornadovpn-client_1.0.0_amd64.deb
5. Install and Smoke Test
Validate post-install script created sudoers drop-in:
Packaging Notes
client/linux/DEBIAN/controldeclares runtime dependency on WireGuard tooling.postinstwrites/etc/sudoers.d/tornadovpn-clientfor WireGuard command execution.postrmremoves that sudoers file on package removal/purge.