home / teamspeak guide

Self host TeamSpeak on a VPS

TeamSpeak has been the other half of self hosted voice for nearly two decades. Version 3 is the classic channel and permission server everyone knows. Version 6 is the new client with a Discord style layout: text chat, friends list, categories, and voice in one app. Both run on a VPS you own. This guide covers both.

read first

Two things before you install either

Same setup applies to both. Worth getting right up front so you don't chase it later.

  • License. TeamSpeak 3 server requires accepting theTeamSpeak license. Since 3.13.0 you must set license_accepted=1 in ts3server.ini (or pass the flag) before it starts fully. Commercial use over a certain size may need a license. The official licensing page has the detail. Personal and small clan use is the standard free path.
  • Cloudflare proxy. Voice uses UDP ports that Cloudflare's proxy does not forward. If you proxy your DNS records, set the voice subdomain to DNS only (grey cloud) or have clients connect by raw IP. The Mumble guide spells this out too; same gotcha applies here.

Need a VPS? Contabo and Kamatera picks here. A 1 to 2 GB box runs TS3 with headroom. TS6 plus a TS3 on the same box wants 2 GB minimum.

part 01

TeamSpeak 3 server

The TS3 server is a single binary you download and run. No package manager needed, no container required. The steps below are the minimal path to a working server with a query admin password and firewall open.

walk-through youtube

// Download and run

Create a user for the server so it doesn't run as root. Then grab the current server binary for your platform. The link below is the 64 bit Linux build. Confirm the latest version on the TeamSpeak downloads page.

setup
# create a dedicated user with no shell login
root@voice-host:~$ useradd -m -s /bin/bash teamspeak

# become that user and download the server
root@voice-host:~$ su - teamspeak
teamspeak@voice-host:~$ wget https://files.teamspeak-services.com/releases/server/3.13.7/teamspeak3-server_linux_amd64-3.13.7.tar.bz2
teamspeak@voice-host:~$ tar xjf teamspeak3-server_linux_amd64-3.13.7.tar.bz2
teamspeak@voice-host:~$ cd teamspeak3-server_linux_amd64

# accept the license and create a config file
teamspeak@voice-host:~/teamspeak3-server_linux_amd64$ touch .ts3server_license_accepted
teamspeak@voice-host:~/teamspeak3-server_linux_amd64$ echo "license_accepted=1" > ts3server.ini

# first run. note the serveradmin password and the privileged key.
teamspeak@voice-host:~/teamspeak3-server_linux_amd64$ ./ts3server_minimal_runscript.sh inifile=ts3server.ini
------------------------------------------------------------------
I M P O R T A N T
------------------------------------------------------------------
Server Query Admin Account created
  loginname= "serveradmin", password= "AaBbCc..."
ServerAdmin privilege key created, please use it to gain
serveradmin rights for your virtualserver. please
also check the server.log for further information.
  token=      r4nD0mPr1v1l3g3k3y...
------------------------------------------------------------------
save both strings

Stop the server and copy the serveradmin password and the privilege token somewhere safe right now. The token is what you paste into the client to become the server owner. The password is for the ServerQuery interface. They are only printed once on first run.

// Firewall ports

TS3 uses three ports by default:

PortProtoUse
9987UDPVoice
30033TCPFile transfer
10011TCPServerQuery (admin)

Open them with UFW:

ufw
root@voice-host:~$ ufw allow 9987/udp
root@voice-host:~$ ufw allow 30033/tcp
root@voice-host:~$ ufw allow 10011/tcp
root@voice-host:~$ ufw reload
don't expose 10011

ServerQuery is powerful. Prefer to only allow 10011 from localhost if you want to script against it remotely, build a restricted allowlist instead. Never leave it open to the world on a community box.

// First admin token

The privilege key from first run is what promotes your client account to ServerAdmin. You paste it once. If you lose it you can generate a new one via ServerQuery with the serveradmin password.

// Connect with the client

Download the TeamSpeak client from the official downloads page. Steps:

  1. server add your box

    Connections → Connect

    Address: voice.yourdomain.com (or the VPS IP). Port: 9987. Nickname: anything. Click Connect.

  2. token one time

    Paste the privilege key

    A dialog will pop asking for a privilege key. Paste the token from first run. Your client now has ServerAdmin rights. The key only needs to be entered once per identity.

  3. channels build the tree

    Right click → Create Channel

    Build the channel tree. Channels can be permanent, semi-permanent, or default. Set a channel password, subscribers, talk power, codecs. Set default channel for new joins by right clicking it.

  4. perms set groups

    Permissions → Server Groups

    Build admin and mod groups with specific talk power and channel rights. Add people to groups by their unique ID. This replaces Discord roles.

// Run as a service

The minimal runscript is for testing. Run it under systemd so it survives reboots and starts clean. Drop this unit file in place:

/etc/systemd/system/ts3server.service
[Unit]
Description=TeamSpeak 3 Server
After=network.target

[Service]
WorkingDirectory=/home/teamspeak/teamspeak3-server_linux_amd64
User=teamspeak
Group=teamspeak
Type=forking
ExecStart=/home/teamspeak/teamspeak3-server_linux_amd64/ts3server_startscript.sh start inifile=ts3server.ini
ExecStop=/home/teamspeak/teamspeak3-server_linux_amd64/ts3server_startscript.sh stop
PIDFile=/home/teamspeak/teamspeak3-server_linux_amd64/ts3server_server.pid
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

Then enable and start it:

systemd
root@voice-host:~$ systemctl daemon-reload
root@voice-host:~$ systemctl enable --now ts3server
root@voice-host:~$ systemctl status ts3server
Active: active (running)

// Optional TLS certificate

TeamSpeak can present a TLS cert to clients to avoid the self signed warning. Get a Let's Encrypt cert for your voice subdomain the same way as the Mumble guide, then point the server at it in ts3server.ini:

ts3server.ini
license_accepted=1
query_protocols=raw,ssh
query_ssh_rsa_host_key=/home/teamspeak/ssh_host_rsa_key
certificate=/etc/letsencrypt/live/voice.yourdomain.com/fullchain.pem
certificate_key=/etc/letsencrypt/live/voice.yourdomain.com/privkey.pem

The teamspeak user must be able to read those files. Restart the service and clients stop seeing the warning. Add a renew hook that runs systemctl restart ts3server in /etc/letsencrypt/renewal-hooks/deploy/.


part 02

TeamSpeak 6 server

TeamSpeak 6 is the refreshed client and server line. Server side the install is similar: a dedicated binary you run on your VPS. Client side the app looks modern with text channels, a friends list, presence, categories, and voice in a sidebar. If you ever wanted Discord's layout without Discord, this is it. Heavier than Mumble and a touch heavier than TS3, but a full community platform.

walk-through youtube

// Install the server

Reuse the teamspeak user from the TS3 section, or create it now if you skipped straight here. Then download the TS6 server. Confirm the current version on the downloads page before you run these.

setup
root@voice-host:~$ su - teamspeak
teamspeak@voice-host:~$ wget <copy the Linux 64-bit server archive URL from teamspeak.com/downloads#server>
# paste the archive URL from the downloads page into wget.
teamspeak@voice-host:~$ tar xzf teamspeak6-server_linux_amd64.tar.gz
teamspeak@voice-host:~$ cd teamspeak6-server_linux_amd64

# accept the license the same way
teamspeak@voice-host:~/teamspeak6-server_linux_amd64$ export TS3_LICENSE_ACCEPTED=1

# first run. save the serveradmin password and privilege key like TS3.
teamspeak@voice-host:~/teamspeak6-server_linux_amd64$ ./ts6server_minimal_runscript.sh
ServerAdmin privilege key: r4nD0mPr1v1l3g3k3y...
Server Query loginname: "serveradmin", password: "AaBbCc..."
release shape changes

TS6 is still active development. The exact archive name and runscript name can shift between builds. Use the variables and paths shown as the shape, and read the file you unzipped. The principle is the same as TS3: extract, accept the license, first run prints the admin token and query password, then run under systemd.

// Firewall ports

TS6 uses the same port family as TS3 by default, plus HTTPS for the new accounts web and TSDNS:

PortProtoUse
9987UDPVoice
30033TCPFile transfer
10011TCPServerQuery
443 / 80TCPTSDNS / account web (optional)

Open the usual three. You already opened 80 and 443 if this box also hosts a website:

ufw
root@voice-host:~$ ufw allow 9987/udp
root@voice-host:~$ ufw allow 30033/tcp
root@voice-host:~$ ufw allow 10011/tcp
root@voice-host:~$ ufw reload

Same caveat as TS3: keep 10011 restricted. Voice UDP cannot go through the Cloudflare proxy, so grey-cloud the voice subdomain.

// Connect and claim

Grab the TeamSpeak 6 client from teamspeak.com downloads. The login flow uses a TeamSpeak account (your friends identity) which is separate from your server admin token:

  1. identity this is new

    Create or sign in with your TeamSpeak account

    The TS6 client walks you through creating a global TeamSpeak account on first launch. This is what powers the friends list and cross server presence. It is optional for pure voice but you need it to use the Discord features.

  2. server same as TS3

    Connect to your server

    Connections → Connect. Address: voice.yourdomain.com. The new UI shows channels as a sidebar with categories just like you'd expect.

  3. token claim admin

    Paste the privilege key

    Use the privilege key printed on first run. Your account becomes ServerAdmin. Add the server to your servers list so it sticks.

  4. channels build categories

    Build categories and text channels

    TS6 lets you create categories that contain voice and text channels, the sidebar layout Discord users know. Set channel topics, slow mode, channel permissions per category. Set a welcome channel.

  5. friends the new bit

    Add friends

    Find people by their TeamSpeak account handle and add them as friends. See when they're online across servers. This is the presence layer TS3 never had.

// Run as a service

Same pattern as TS3. Adapt the unit file to the TS6 binary path and startscript, then:

/etc/systemd/system/ts6server.service
[Unit]
Description=TeamSpeak 6 Server
After=network.target

[Service]
WorkingDirectory=/home/teamspeak/teamspeak6-server_linux_amd64
User=teamspeak
Group=teamspeak
Type=forking
Environment=TS3_LICENSE_ACCEPTED=1
ExecStart=/home/teamspeak/teamspeak6-server_linux_amd64/ts6server_startscript.sh start
ExecStop=/home/teamspeak/teamspeak6-server_linux_amd64/ts6server_startscript.sh stop
PIDFile=/home/teamspeak/teamspeak6-server_linux_amd64/ts6server.pid
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
enable
root@voice-host:~$ systemctl daemon-reload
root@voice-host:~$ systemctl enable --now ts6server
root@voice-host:~$ systemctl status ts6server

// How TS6 differs from TS3

Both run on your VPS. The differences are mostly in the client and what the platform offers:

TeamSpeak 3TeamSpeak 6
LayoutChannel tree, chat tabsCategories + sidebar, Discord shaped
Text chatPer channel, basicFull text channels inside categories
Friends and presenceManual, per serverGlobal friends list, cross server presence
Server identityPer server, certificateTeamSpeak account
Server RAM at idle~40 MB~120 MB
VPS sweet spot1 GB cheap box2 GB box, runs fine alongside a site
Best forPure voice, classic server vibeCommunity hangout, text + voice + friends

If you want the lightest possible voice and nothing else, you want Mumble. If you want something that handles almost everything Discord does without giving the keys to a third party, TS6 is the closest fit. A lot of people end up running both: Mumble for rostered ops and TS6 for the casual hangout.

both at once

Murmur, TS3, and TS6 all fit comfortably on a single 2 GB Kamatera or Contabo box if you are running a community rather than a public service. One IP, three ports, three communities if you want. Each has its own systemd unit.