Skip to main content
  1. Posts/

Best VPN for Ubuntu SLSKD Server: A Self-Hosted Community Guide

·4 mins

The Community Spark: The SLSKD VPN Dilemma #

Recently, the r/selfhosted community has seen a massive surge in discussions around securing SLSKD (the modern web implementation of the Soulseek client) on Ubuntu servers. The core dilemma? Soulseek is an inherently public, peer-to-peer network. Exposing your bare home IP to thousands of peers while running an always-on Soulseek server is a significant privacy and security risk.

While throwing a standard commercial VPN like Mullvad or NordVPN onto a Docker container seems like an easy fix, community members quickly realized a harsh reality: routing SLSKD through a standard VPN tunnel often bricks remote access, kills SSH connectivity, and breaks local network sharing.

Synthesized Community Perspectives #

Digging through hundreds of upvoted comments and real-world deployments, the community consensus points to a few critical realities:

  1. The WireGuard Split-Tunneling Approach Dominates: Power users agree that installing a commercial VPN client directly on the host is a mistake. Instead, using WireGuard with split-tunneling (Policy-Based Routing) is the gold standard. This forces only SLSKD’s Docker traffic through the VPN, leaving SSH and local network management untouched.
  2. Docker-Native VPN Gateways: For those who want zero host-level routing headaches, the community heavily favors using containerized VPN gateways like qmcgaw/gluetun or wgcf. You route SLSKD’s network traffic through the VPN container’s network stack.
  3. Provider Choice Matters: Because Soulseek relies on direct peer-to-peer connections for file transfers, providers that strictly block incoming ports (or require complex NAT traversal) are useless. Users highly recommended Mullvad, AirVPN, and ProtonVPN because they allow dedicated port forwarding—crucial for SLSKD connectivity.

Deep-Dive Actionable Guide: Routing SLSKD via Gluetun #

Based on community configs, the most reliable way to secure SLSKD on Ubuntu is using a Gluetun Docker container as a network gateway.

Step 1: Set Up the Gluetun VPN Gateway #

Create a docker-compose.yml file for your VPN gateway. (We’ll use WireGuard with Mullvad as the example, as it’s a community favorite for reliable port forwarding).

version: "3.8"
services:
  gluetun:
    image: qmcgaw/gluetun
    container_name: gluetun
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    ports:
      - "8888:8888/tcp" # HTTP proxy
      - YOUR_SLSKD_PORT:YOUR_SLSKD_PORT/tcp # Map SLSKD port
    volumes:
      - /path/to/gluetun:/gluetun
    environment:
      - VPN_SERVICE_PROVIDER=mullvad
      - VPN_TYPE=wireguard
      - WIREGUARD_PRIVATE_KEY=your_private_key
      - WIREGUARD_ADDRESSES=your_assigned_ip
      - SERVER_COUNTRIES=Sweden

Step 2: Route SLSKD Through the Gateway #

Update your SLSKD Docker container to use the Gluetun container’s network stack. This requires adding network_mode: "service:gluetun" to your SLSKD service and removing any direct port mappings from SLSKD (since Gluetun now handles the ports).

  slskd:
    image: slskd/slskd:latest
    container_name: slskd
    network_mode: "service:gluetun" # Crucial: Routes traffic through VPN
    volumes:
      - /path/to/slskd/data:/app/data
      - /path/to/downloads:/downloads
      - /path/to/shared:/shared
    environment:
      - SLSKD_SLSK_PORT=YOUR_SLSKD_PORT
    depends_on:
      - gluetun

Step 3: Configure Port Forwarding #

SLSKD requires an open listening port to connect to peers properly. In your Mullvad or AirVPN dashboard, configure a port forward on the VPN server you selected. Then, map that exact external port to the internal SLSKD port in the ports block of your Gluetun config and in the SLSKD web UI settings.

Pros & Cons: VPN Solutions for Ubuntu #

SolutionProsConsBest For
Docker Gateway (Gluetun)Zero host routing changes, highly portable, clean isolation.Slight learning curve for port forwarding.Docker users wanting reliable isolation.
WireGuard + Policy RoutingNative speed, maximum control over split-tunneling.Complex Linux IPTables/IPRoute2 setup required.Advanced Linux sysadmins.
Standard Commercial AppEasy 1-click install.Often breaks SSH, hard to route specific containers.Not recommended for servers.

The Verdict / Expert Advice #

If you are hosting SLSKD on Ubuntu, do not install a VPN client directly on your host operating system. The community has spoken: this almost always leads to locked-out SSH sessions and broken local access.

For the vast majority of self-hosters, the Docker Gluetun gateway method is the definitive answer. It perfectly isolates your Soulseek traffic, keeps your home IP hidden, and allows you to easily retain remote SSH access to your Ubuntu server. Pair Gluetun with a provider that supports port forwarding—like AirVPN or Mullvad—for flawless SLSKD peer connectivity.

Frequently Asked Questions (FAQ) #

Does SLSKD require port forwarding when behind a VPN? #

Yes. Because Soulseek relies on direct peer-to-peer connections, SLSKD needs a reachable listening port. If your VPN provider blocks incoming ports, your SLSKD server will experience severely limited download speeds and connectivity issues.

Can I use a commercial VPN app like NordVPN directly on my Ubuntu server? #

You can, but it is highly discouraged by the self-hosted community. Installing a system-wide VPNVPN often overrides your default routing table, which cuts off your SSH access and prevents you from accessing local network resources.

Which VPN providers are best for SLSKD? #

The r/selfhosted community heavily recommends Mullvad, AirVPN, and ProtonVPN. These providers not only support WireGuard for fast tunneling but also allow dedicated port forwarding, which is absolutely critical for SLSKD connectivity.

How do I check if my SLSKD traffic is actually going through the VPN? #

You can exec into your SLSKD Docker container and run a curl command to check the public IP. Alternatively, most web-based SLSKD dashboards feature a network status page where you can verify the IP address and active port.