WindowsPublished on May 28, 202614 min read

How to host a TeamSpeak server on a Windows VPS

This guide shows how to install a TeamSpeak server on a Windows VPS and set it up: download TeamSpeak 3 Server, run ts3server.exe, open the ports, start it at boot, take admin rights, organise permissions, secure it, back it up and add a domain name. The commands target Windows Server 2025, the system delivered on OuiHeberg Windows VPS. First connect over Remote Desktop with an administrator account, as explained in Connect to a Windows VPS via RDP.

Choose resources and ports

TeamSpeak is lightweight. A VPS with 2 GB of memory is enough for most gaming communities. Bandwidth matters more than memory.

Concurrent usersMemoryvCPUBandwidth
Up to 101 GB1100 Mbps
Up to 502 GB2200 Mbps
Up to 1004 GB2500 Mbps
Up to 2008 GB41 Gbps

TeamSpeak can share the VPS with another service, such as a FiveM server. Ports do not overlap, but then plan at least 8 GB of memory and 4 vCPU. Here are the TeamSpeak 3 Server ports, according to its documentation.

PortProtocolUse
9987UDPVoice, main port
30033TCPFile transfer
10011TCPClassic ServerQuery (administration)
10022TCPServerQuery encrypted over SSH
41144TCPTSDNS, only if you run tsdnsserver.exe

Choose between TeamSpeak 3 and TeamSpeak 6

TeamSpeak 3 Server is still the stable version. The TeamSpeak 6 server is in beta, published on GitHub.

CriterionTeamSpeak 3 ServerTeamSpeak 6 Server
StatusStable, version 3.13.8 of 27 May 2026Beta, features still incomplete
LicenseFree up to 32 slots and 1 virtual server32-slot beta license, renewed every two months
More slotsLicense to request from TeamSpeakNot possible yet
MigrationNoneNo path from TeamSpeak 3
Bots and toolsRich ecosystemStill limited

For a server meant to last, choose TeamSpeak 3. The rest of this guide covers it.


Install TeamSpeak 3 Server

The official download page offers the 64-bit version for Windows. These commands download it and compute its SHA256 hash, to compare with the one on the page.

# Download the official archive (version 3.13.8)
$zip = "$env:USERPROFILE\Downloads\teamspeak3-server_win64-3.13.8.zip"
Invoke-WebRequest -Uri "https://files.teamspeak-services.com/releases/server/3.13.8/teamspeak3-server_win64-3.13.8.zip" -OutFile $zip

# Compare the hash with the one on the download page
Get-FileHash $zip -Algorithm SHA256

Then extract the archive. The files must sit directly in C:\TeamSpeak3-Server\.

# Create the install folder
New-Item -ItemType Directory -Path "C:\TeamSpeak3-Server" -Force

# Extract the archive, then copy its content straight into C:\TeamSpeak3-Server
Expand-Archive -Path "$env:USERPROFILE\Downloads\teamspeak3-server_win64-3.13.8.zip" -DestinationPath "$env:TEMP\ts3" -Force
Copy-Item -Path "$env:TEMP\ts3\teamspeak3-server_win64\*" -Destination "C:\TeamSpeak3-Server" -Recurse -Force

TeamSpeak will not start until you accept its license, found in license.txt. After reading it, create the acceptance file. The license_accepted=1 parameter does the same at launch.

# Accept the license (file read from the working folder)
New-Item -ItemType File -Path "C:\TeamSpeak3-Server\.ts3server_license_accepted" -Force

Start the server a first time. The createinifile=1 parameter creates the ts3server.ini file used by the automatic start.

# Go to the folder
Set-Location "C:\TeamSpeak3-Server"
# First start: also creates the ts3server.ini file
.\ts3server.exe license_accepted=1 createinifile=1

On the first start only, the server shows the password of the serveradmin ServerQuery account and a privilege key (token). Store them right away in a password manager. They are also written to the log in the logs folder.

------------------------------------------------------------------
ServerAdmin privilege key created, please use it to gain
serveradmin rights for your virtualserver. please
also check the doc/privilegekey_guide.txt for details.
 token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
------------------------------------------------------------------

The privilege key grants server admin rights in the client. It works only once. Without a license file, TeamSpeak 3 Server runs with 32 slots and a single virtual server. Beyond that, you need a TeamSpeak license, copied into the server folder.


Open the ports in the Windows Firewall

The client area has no network firewall for VPS, so only the Windows Firewall matters. Open PowerShell as administrator and paste this block.

# Rule 1: voice (UDP 9987)
New-NetFirewallRule `
  -DisplayName "TeamSpeak3 - Voice (UDP 9987)" `
  -Direction Inbound `
  -Protocol UDP `
  -LocalPort 9987 `
  -Action Allow `
  -Profile Any

# Rule 2: ServerQuery (TCP 10011)
New-NetFirewallRule `
  -DisplayName "TeamSpeak3 - ServerQuery (TCP 10011)" `
  -Direction Inbound `
  -Protocol TCP `
  -LocalPort 10011 `
  -Action Allow `
  -Profile Any

# Rule 3: file transfer (TCP 30033)
New-NetFirewallRule `
  -DisplayName "TeamSpeak3 - FileTransfer (TCP 30033)" `
  -Direction Inbound `
  -Protocol TCP `
  -LocalPort 30033 `
  -Action Allow `
  -Profile Any

# Rule 4: TSDNS (TCP 41144), only if you run tsdnsserver.exe
New-NetFirewallRule `
  -DisplayName "TeamSpeak3 - TSDNS (TCP 41144)" `
  -Direction Inbound `
  -Protocol TCP `
  -LocalPort 41144 `
  -Action Allow `
  -Profile Any

Write-Host "Firewall rules created" -ForegroundColor Green

Check that the rules exist and are enabled.

Get-NetFirewallRule | Where-Object { $_.DisplayName -like "TeamSpeak3*" } | Select-Object DisplayName, Enabled, Direction

ServerQuery controls the whole server. Restrict its port to your IP address.

# Restrict ServerQuery to your IP address
Set-NetFirewallRule -DisplayName "TeamSpeak3 - ServerQuery (TCP 10011)" -RemoteAddress "203.0.113.42"

The guide How to open a port in Windows Firewall on a VPS explains rule management in detail.


Start TeamSpeak with Windows

Without a scheduled task, the server does not come back after a VPS restart. First create the startup script.

# Create the startup script
$scriptContent = @'
# TeamSpeak 3 startup script
$tsPath = "C:\TeamSpeak3-Server"
$tsExe  = "$tsPath\ts3server.exe"

# Do nothing if the server is already running
$running = Get-Process -Name "ts3server" -ErrorAction SilentlyContinue
if (-not $running) {
    Start-Process -FilePath $tsExe `
                  -WorkingDirectory $tsPath `
                  -ArgumentList "inifile=ts3server.ini" `
                  -WindowStyle Hidden
    Write-EventLog -LogName Application -Source "TeamSpeak3" -EventId 1000 `
                   -EntryType Information -Message "TeamSpeak 3 Server started" `
                   -ErrorAction SilentlyContinue
}
'@

New-Item -ItemType Directory -Path "C:\Scripts" -Force | Out-Null
$scriptContent | Out-File -FilePath "C:\Scripts\Start-TeamSpeak3.ps1" -Encoding UTF8
Write-Host "Script created: C:\Scripts\Start-TeamSpeak3.ps1" -ForegroundColor Green

Then create the task that runs this script at boot under the SYSTEM account, even with no open session.

# Task settings
$taskName    = "TeamSpeak3-AutoStart"
$scriptPath  = "C:\Scripts\Start-TeamSpeak3.ps1"
$description = "Automatic start of the TeamSpeak 3 server"

# Action: run PowerShell with the script
$action = New-ScheduledTaskAction `
    -Execute "powershell.exe" `
    -Argument "-NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File `"$scriptPath`""

# Trigger: at system startup, with a delay
$trigger = New-ScheduledTaskTrigger -AtStartup
$trigger.Delay = "PT30S"

# Settings: no open session needed, SYSTEM account
$settings = New-ScheduledTaskSettingsSet `
    -ExecutionTimeLimit (New-TimeSpan -Hours 0) `
    -RestartCount 3 `
    -RestartInterval (New-TimeSpan -Minutes 1)
$principal = New-ScheduledTaskPrincipal `
    -UserId "SYSTEM" `
    -LogonType ServiceAccount `
    -RunLevel Highest

# Register the task
Register-ScheduledTask `
    -TaskName $taskName `
    -Action $action `
    -Trigger $trigger `
    -Settings $settings `
    -Principal $principal `
    -Description $description `
    -Force

Write-Host "Scheduled task '$taskName' created" -ForegroundColor Green

Check the task, then test it.

# Check that the task exists
Get-ScheduledTask -TaskName "TeamSpeak3-AutoStart" | Select-Object TaskName, State

# Run the task by hand, then check the process
Start-ScheduledTask -TaskName "TeamSpeak3-AutoStart"
Start-Sleep -Seconds 5
Get-Process -Name "ts3server" -ErrorAction SilentlyContinue

Finally, restart the VPS and check that ts3server.exe shows up in Task Manager.


Connect and take admin rights

Install the client from the download page. The labels below are those of the English TeamSpeak 3 client.

  1. Open Connections › Connect (Ctrl+S).

  2. In the address, type YOUR_VPS_IP:9987, pick a nickname, then click Connect.

  3. On first connection, the client asks for a key. Paste the privilege key saved during the install. If the window does not show up, open Permissions › Use Privilege Key.

You now have Server Admin rights. Right-click the server name, then Edit Virtual Server, to set the essentials.

  • The server name, clear for your community.

  • The message of the day, shown on connection.

  • The number of slots, 32 at most without a license.

  • A password, if the community is private.


Organise permissions

The TeamSpeak 3 permission system is powerful but often misunderstood. First turn on advanced mode, otherwise part of the permissions stays hidden. In the client, open Tools › Options › Application and tick Advanced permission system.

TeamSpeak has two kinds of groups. Server groups apply to the whole server.

GroupUsual role
Server AdminFull control of the server
ModeratorKick, ban, move
MemberAccess to the usual channels
GuestLimited access

Channel groups only apply inside one channel.

GroupUsual role
Channel AdminManages sub-channels and channel permissions
Channel OperatorCan kick channel members
NormalTalks and listens

Create a custom group

  1. Open Permissions › Server Groups.

  2. Right-click, then add a group and name it, for example "VIP" or "Streamer".

  3. Tick the permissions you want, such as b_channel_create_permanent to create permanent channels.

Restrict access to a channel

Right-click the channel, then Edit Channel. In the channel permissions, set i_channel_needed_join_power. A group whose i_channel_join_power is lower than this value cannot enter.


Secure the server

Change the ServerQuery password

Prefer the encrypted SSH ServerQuery to plain port 10011. The OpenSSH client is included in Windows Server 2025. From the VPS, log in with the password saved during the install.

ssh -p 10022 serveradmin@127.0.0.1

Then generate a new password. The server picks it and shows it in its reply.

# After the SSH login: generate a new password for serveradmin
clientsetserverquerylogin client_login_name=serveradmin

Close unused ports

Not using file transfer? Disable its rule. Do the same for TSDNS if you do not run tsdnsserver.exe.

# Disable the file transfer rule
Set-NetFirewallRule -DisplayName "TeamSpeak3 - FileTransfer (TCP 30033)" -Enabled False

Encrypt voice

The Opus Voice codec gives the best balance between quality and bitrate. Pick it in the settings of each channel. To encrypt voice on the whole server, run this command in ServerQuery.

use sid=1
# 2 = voice encryption enabled on the whole server
serveredit virtualserver_codec_encryption_mode=2

Slow down flood bots

A high identity security level forces each new client to spend longer computing its identity. Bots that create identities in bulk are slowed down.

use sid=1
serveredit virtualserver_needed_identity_security_level=25

Ban clients or addresses

# Ban a connected client for one hour
banclient clid=ID_CLIENT banreason=Spam time=3600
# Ban an IP address directly, with no time limit
banadd ip=1.2.3.4 banreason=Flood time=0

time=0 makes the ban permanent. time is counted in seconds.

Checklist

  • The ServerQuery password has been regenerated.

  • The ServerQuery port is open to your IP address only.

  • Voice is encrypted on sensitive channels.

  • The identity security level has been raised.

  • A password protects the server if the community is private.

  • You read the logs in C:\TeamSpeak3-Server\logs\ regularly.


Back up and restore

FileContentPriority
ts3server.sqlitedbFull database: users, channels, permissionsEssential
licensekey.datYour TeamSpeak license, if you have oneEssential
query_ip_allowlist.txtAddresses allowed on ServerQueryImportant
query_ip_denylist.txtAddresses denied on ServerQueryImportant
ts3server.iniServer configurationImportant

This script copies these files and keeps the last 7 backups. Save it as C:\Scripts\Backup-TeamSpeak3.ps1.

# Script: C:\Scripts\Backup-TeamSpeak3.ps1
# Daily backup, 7 backups kept
$sourceDir  = "C:\TeamSpeak3-Server"
$backupRoot = "C:\Backups\TeamSpeak3"
$date       = Get-Date -Format "yyyy-MM-dd_HH-mm"
$backupDir  = "$backupRoot\$date"
$maxBackups = 7

# Create the backup folder
New-Item -ItemType Directory -Path $backupDir -Force | Out-Null

# Files to back up
$filesToBackup = @(
    "ts3server.sqlitedb",
    "licensekey.dat",
    "query_ip_allowlist.txt",
    "query_ip_denylist.txt",
    "ts3server.ini"
)

foreach ($file in $filesToBackup) {
    $src = Join-Path $sourceDir $file
    if (Test-Path $src) {
        Copy-Item -Path $src -Destination $backupDir -Force
        Write-Host "Backed up: $file" -ForegroundColor Green
    } else {
        Write-Host "File not found: $file" -ForegroundColor Yellow
    }
}

# Rotation: keep only the last 7 backups
$allBackups = Get-ChildItem -Path $backupRoot -Directory | Sort-Object CreationTime
if ($allBackups.Count -gt $maxBackups) {
    $toDelete = $allBackups | Select-Object -First ($allBackups.Count - $maxBackups)
    foreach ($dir in $toDelete) {
        Remove-Item -Path $dir.FullName -Recurse -Force
        Write-Host "Old backup deleted: $($dir.Name)" -ForegroundColor Gray
    }
}

Write-Host "Backup finished: $backupDir" -ForegroundColor Cyan

Schedule it every day at 3 am.

$backupAction = New-ScheduledTaskAction `
    -Execute "powershell.exe" `
    -Argument "-NonInteractive -ExecutionPolicy Bypass -File `"C:\Scripts\Backup-TeamSpeak3.ps1`""
$backupTrigger = New-ScheduledTaskTrigger -Daily -At "03:00"

Register-ScheduledTask `
    -TaskName "TeamSpeak3-DailyBackup" `
    -Action $backupAction `
    -Trigger $backupTrigger `
    -Principal (New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount) `
    -Description "Daily TeamSpeak 3 backup" `
    -Force

Write-Host "Daily backup scheduled at 3 am" -ForegroundColor Green

To restore, stop the server, copy the files back, then start it again.

# 1. Stop the TeamSpeak server
Stop-Process -Name "ts3server" -Force -ErrorAction SilentlyContinue
Start-Sleep -Seconds 3

# 2. Pick the backup to restore (adjust the date)
$backupToRestore = "C:\Backups\TeamSpeak3\2026-05-27_03-00"
$targetDir       = "C:\TeamSpeak3-Server"

# 3. Restore the files
$filesToRestore = @("ts3server.sqlitedb", "licensekey.dat", "query_ip_allowlist.txt", "ts3server.ini")
foreach ($file in $filesToRestore) {
    $src = Join-Path $backupToRestore $file
    if (Test-Path $src) {
        Copy-Item -Path $src -Destination $targetDir -Force
        Write-Host "Restored: $file" -ForegroundColor Green
    }
}

# 4. Start the server again
Start-Process -FilePath "$targetDir\ts3server.exe" -WorkingDirectory $targetDir
Write-Host "TeamSpeak 3 server restarted" -ForegroundColor Cyan

These backups stay on the VPS. The client area also offers an automatic backup option for the whole VPS, described in How to set up automatic VPS backups.

Migrate an existing server to this VPS

  1. On the old server, back up ts3server.sqlitedb, licensekey.dat, ts3server.ini and query_ip_allowlist.txt.

  2. Install TeamSpeak on the new VPS with this guide, then stop it.

  3. Copy the files into C:\TeamSpeak3-Server\ and start the server. Channels, groups and users are back.

  4. Update the DNS A record so it points to the new IP.


Update TeamSpeak Server

According to the upgrade guide shipped with the server, you only need to stop the server and copy all files of the new version over the old ones. This script does it, after a backup. Read the changelog on the download page before each update.

# 1. Stop the server
Stop-Process -Name "ts3server" -Force -ErrorAction SilentlyContinue
Start-Sleep -Seconds 5

# 2. Back up before the update
& "C:\Scripts\Backup-TeamSpeak3.ps1"

# 3. Download the new version (update this number)
$newVersion = "3.13.8"
$downloadUrl = "https://files.teamspeak-services.com/releases/server/$newVersion/teamspeak3-server_win64-$newVersion.zip"
$zipPath = "$env:TEMP\ts3server_update.zip"
Invoke-WebRequest -Uri $downloadUrl -OutFile $zipPath

# 4. Extract to a temporary folder
$tempDir = "$env:TEMP\ts3server_new"
Expand-Archive -Path $zipPath -DestinationPath $tempDir -Force

# 5. Copy all files of the new version (the archive has no database, license or ts3server.ini)
Copy-Item -Path "$tempDir\teamspeak3-server_win64\*" -Destination "C:\TeamSpeak3-Server\" -Recurse -Force

# 6. Clean up and restart
Remove-Item $zipPath, $tempDir -Recurse -Force
Start-Process -FilePath "C:\TeamSpeak3-Server\ts3server.exe" -WorkingDirectory "C:\TeamSpeak3-Server"
Write-Host "Server restarted with version $newVersion" -ForegroundColor Green

Version 3.13.8 fixes three flaws that could crash the server (CVE-2026-4390 to 4392). Update any older server.


Use a domain name

Instead of an IP address, give your users a name such as ts.mydomain.com. If you move servers, you only change the DNS. First create an A record in your domain's DNS zone.

Type  : A
Name  : ts
Value : YOUR_VPS_IP
TTL   : 3600

With the default port 9987, this record is enough. An SRV record also lets users connect without typing another port.

Type     : SRV
Name     : _ts3._udp.ts.mydomain.com
Priority : 0
Weight   : 5
Port     : 9987
Target   : ts.mydomain.com
TTL      : 3600

In most DNS managers, the SRV form asks for these fields.

FieldValue
Service_ts3
Protocol_udp
Namets.mydomain.com
Priority0
Weight5
Port9987
Targetts.mydomain.com

Propagation takes from a few minutes to 24 hours. Then check the resolution.

Resolve-DnsName -Name "_ts3._udp.ts.mydomain.com" -Type SRV

Fix common errors

"failed to bind network interface"

Another process holds port 9987. Find it.

# Find the process holding port 9987
netstat -ano | findstr :9987
# Get its name from the PID
Get-Process -Id NUMERO_PID

Stop that process, or change the TeamSpeak port in ts3server.ini.

default_voice_port=9988

Then adjust the firewall rule, and your SRV record if you have one.

Remove-NetFirewallRule -DisplayName "TeamSpeak3 - Voice (UDP 9987)"
New-NetFirewallRule -DisplayName "TeamSpeak3 - Voice (UDP 9988)" -Direction Inbound -Protocol UDP -LocalPort 9988 -Action Allow

The server does not start after a reboot

# Task state (LastTaskResult = 0 means success)
Get-ScheduledTask -TaskName "TeamSpeak3-AutoStart" | Select-Object State, LastRunTime, LastTaskResult
# Run it by hand to test
Start-ScheduledTask -TaskName "TeamSpeak3-AutoStart"

If the task fails, check the execution policy with Get-ExecutionPolicy, and that -ExecutionPolicy Bypass is in the task action.

Cannot connect from outside

Only the Windows Firewall filters connections to the VPS. Check that the rules created earlier are enabled with the rule check command.

Your address was banned by mistake

Log in to ServerQuery, list the bans, then delete the right one.

login serveradmin YOUR_PASSWORD
use sid=1
banlist
bandel banid=BAN_ID

If ServerQuery itself refuses you, add your IP to query_ip_allowlist.txt and restart the server.

The privilege key is lost

Create a new one for the Server Admin group, whose ID is 6 by default.

login serveradmin YOUR_PASSWORD
use sid=1
tokenadd tokentype=0 tokenid1=6 tokenid2=0

The database is damaged

# 1. Stop the server
Stop-Process -Name "ts3server" -Force
# 2. Rename the damaged database
Rename-Item "C:\TeamSpeak3-Server\ts3server.sqlitedb" "ts3server.sqlitedb.corrupt"
# 3. Restore the latest backup
$latestBackup = Get-ChildItem "C:\Backups\TeamSpeak3" -Directory | Sort-Object CreationTime -Descending | Select-Object -First 1
Copy-Item "$($latestBackup.FullName)\ts3server.sqlitedb" "C:\TeamSpeak3-Server\"
# 4. Restart
Start-Process -FilePath "C:\TeamSpeak3-Server\ts3server.exe" -WorkingDirectory "C:\TeamSpeak3-Server"

Without a backup, the server creates an empty database on the next start. Channels, groups and users are lost, but the server runs again.


Need help?

Open a ticket from Tickets › Open a Ticket, or from the Contact support tile at the bottom of the VPS page. In the Related Service field, pick the VPS so the team saves time. You can also ask your question on the OuiHeberg Discord.

Was this article helpful?

317 views
Share this article
VPS Windows
Need a Windows VPS?

Windows Server 2025 with the license included, Remote Desktop access and management from the client area.

View plans →

Related Articles