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.
TeamSpeak 3 server ↓
The legendary stable server binary. Channels, permissions, file transfer, query interface. Lightweight enough for the cheapest box.
TeamSpeak 6 server ↓
The new client. Text channels, friends, presence, voice in a sidebar layout that will look familiar. Self hosted, full community platform.
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=1ints3server.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.
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.
TS3 contents
// 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.
# 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... ------------------------------------------------------------------
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:
| Port | Proto | Use |
|---|---|---|
| 9987 | UDP | Voice |
| 30033 | TCP | File transfer |
| 10011 | TCP | ServerQuery (admin) |
Open them with 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
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:
Connections → Connect
Address:
voice.yourdomain.com(or the VPS IP). Port: 9987. Nickname: anything. Click Connect.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.
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.
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:
[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:
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:
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/.
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.
TS6 contents
// 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.
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..."
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:
| Port | Proto | Use |
|---|---|---|
| 9987 | UDP | Voice |
| 30033 | TCP | File transfer |
| 10011 | TCP | ServerQuery |
| 443 / 80 | TCP | TSDNS / account web (optional) |
Open the usual three. You already opened 80 and 443 if this box also hosts a website:
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:
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.
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.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.
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.
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:
[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
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 3 | TeamSpeak 6 | |
|---|---|---|
| Layout | Channel tree, chat tabs | Categories + sidebar, Discord shaped |
| Text chat | Per channel, basic | Full text channels inside categories |
| Friends and presence | Manual, per server | Global friends list, cross server presence |
| Server identity | Per server, certificate | TeamSpeak account |
| Server RAM at idle | ~40 MB | ~120 MB |
| VPS sweet spot | 1 GB cheap box | 2 GB box, runs fine alongside a site |
| Best for | Pure voice, classic server vibe | Community 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.
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.