Skip to content

Setup Same Machine

DomeNinchen edited this page Oct 14, 2026 · 3 revisions

Setup: TeamSpeak on the same machine

Both TS6 Manager and your TeamSpeak server run on one host. This is the common setup for a home server or a single VPS.

If your TeamSpeak server lives somewhere else, use Setup: TeamSpeak elsewhere instead.

1. Enable WebQuery on the TeamSpeak server

WebQuery is the HTTP query interface, and on TeamSpeak 6 it is off by default. It is not the old raw/telnet ServerQuery on port 10011.

If TeamSpeak runs in Docker, recreate the container with the query interface enabled and its port published:

docker run -d --name ts6 \
  -e TSSERVER_LICENSE_ACCEPTED=accept \
  -e TSSERVER_QUERY_HTTP_ENABLED=1 \
  -e TSSERVER_QUERY_HTTP_PORT=10080 \
  -p 10080:10080/tcp \
  -p 9987:9987/udp \
  -p 30033:30033/tcp \
  -v ts6-data:/var/tsserver \
  teamspeaksystems/teamspeak6-server:latest

Use a named volume (-v ts6-data:/var/tsserver above). If the server's data lives in an anonymous volume and the container is ever removed, the volume is orphaned and a later docker volume prune will delete it — along with the API key, which is only ever printed on a fresh volume's first start.

If TeamSpeak is installed natively, enable it in tsserver.yaml (keep the rest of your file as it is):

server:
  query:
    http:
      enable: 1
      port: 10080

ip sits next to port if the interface should listen on a specific address only. The same exists as command-line flags: --query-http-enable, --query-http-port, --query-http-ip. Restart the server afterwards.

2. Get the API key

WebQuery authenticates with an API key, not a password.

Your server prints a serveradmin key once, on its very first startup ever, in a log block titled "Server Query Admin Account created":

docker logs ts6 2>&1 | grep -i apikey

If that key is gone, generate a new one with the apikeyadd query command.

Treat it like a root password. It grants full server administration.

3. Allow the manager through the query IP allowlist

TeamSpeak keeps an allowlist (query_ip_allowlist.txt) that by default contains only the loopback address. Even on the same host, the manager's connection does not arrive as loopback — it comes through Docker's networking, from the bridge gateway, typically 172.17.0.1.

Without this step you get the most confusing failure mode there is: the connection is accepted and then immediately dropped, with nothing useful in any log.

docker exec ts6 sh -c 'echo 172.17.0.0/16 >> /var/tsserver/query_ip_allowlist.txt'
docker restart ts6

The server confirms it on startup with a [CIDRManager] updated query_ip_allowlist ips: ... line.

4. Add the connection

In the manager: Settings → Connections → Add.

Field Value
Host Not localhost — see below
WebQuery port 10080
API key From step 2

The host field is resolved from inside the backend container, so localhost there means the backend itself, not your machine. Two options that work:

  • The host's LAN address, e.g. 192.168.1.50. Simplest, works immediately
  • A shared Docker network — put both containers on one network and use the TeamSpeak container's name (ts6) as the host. Tidier, and survives the host's IP changing. Deployment shows how to attach an external network

Press Test Connection before saving. It reports the actual reason for a failure — a refused connection, or TeamSpeak's own error message — rather than just "failed".

5. Optional: SSH, for events and files

Only needed if you want bot flows that react to server events or chat commands — a client joining, leaving, or moving channel — the live event feed in the Query Console, or the Files page and icon picker. Everything else, including scheduled and webhook-triggered flows, works over WebQuery alone.

WebQuery is request/response only: the server cannot push events back over it, and it has no file-transfer commands. Event subscriptions need a persistent connection, which SSH ServerQuery provides.

Enable it on the TeamSpeak server (TSSERVER_QUERY_SSH_ENABLED=1, default port 10022, published like the others), then fill in the SSH fields on the same connection. If you don't know the serveradmin ServerQuery password, reset it through the already-working WebQuery connection with clientsetserverquerylogin client_login_name=serveradmin — the response contains the new password.

6. First things to set up

  1. Create your admin account at /setup. There are no default credentials by design
  2. Consider a Bot Identity (Settings → Connections → Bot Identity) if you plan to use bot flows, so automated actions appear under their own name in TeamSpeak's logs instead of sharing yours. Optional, and changes nothing until you create one
  3. Enable two-factor authentication under Settings → Account if this is reachable from the internet

If it doesn't connect

Symptom Likely cause
Connection accepted, then immediately reset WebQuery not actually enabled inside the container — Docker's port forwarding answers, nothing listens behind it
Connection refused Wrong port, or the port isn't published
Connects, then drops silently The IP allowlist (step 3)
invalid apikey (error 5122) The stored key doesn't match this server's current data volume — re-fetch it from the logs

v0.7, last edited 14.10.2026

Getting started

Home
Getting Started
Install on Debian 13
Setup: same machine
Setup: elsewhere / rented
Users and Roles

Using the app

Dashboard
Virtual Servers and Instance
Channels
Clients
Client Database
Permissions
Server and Channel Groups
Moderation
Tokens and Passwords
Files
Icons
Bot Flows
Music Bots
Server Widgets
Server Maintenance
Server Logs
Query Console
Connection Journal
Themes and Appearance

Running it

Administration
Configuration
Deployment
Privacy and Hosting

When something is odd

Tips and Pitfalls
Troubleshooting

Contributing

Development

Repository · Changelog

Clone this wiki locally