> La lista completa de artículos está en [llms.txt](https://docs.f3cloud.com/llms.txt). Cada página tiene versión en Markdown, basta con añadir .md a su dirección. Esta página en Markdown: [https://docs.f3cloud.com/es/games/teamspeak-server.md](https://docs.f3cloud.com/es/games/teamspeak-server.md).

# Servidor de TeamSpeak en un VPS – instalación, clave de administrador, puertos y copias de seguridad

Cómo crear un servidor de voz de TeamSpeak en un VPS. Instalación de TeamSpeak 3 Server en Debian desde el archivo oficial, usuario aparte y servicio de systemd, aceptación de la licencia, clave de privilegios y contraseña de ServerQuery, apertura de los puertos 9987, 30033 y 10011 en UFW, comprobación de los puertos desde fuera, conexión con el cliente, actualización y copias de seguridad. Sección aparte sobre la versión beta de TeamSpeak 6 Server en Docker. Probado en Debian 12 con TeamSpeak 3 Server 3.13.8.

Un servidor de voz de TeamSpeak propio en un VPS funciona las 24 horas, y tus amigos o tu equipo pueden entrar en el canal que quieran a cualquier hora, incluso con tu ordenador apagado. Tú decides cuántos canales habrá, quién puede hablar en ellos y a quién das derechos de administrador. En este artículo instalaremos el servidor desde el archivo oficial, lo ejecutaremos con un usuario aparte bajo systemd, encontraremos la clave de administrador y la contraseña de ServerQuery, abriremos los puertos, los comprobaremos desde fuera, nos conectaremos con el cliente y configuraremos las copias de seguridad. Al final hay una sección sobre la versión beta de TeamSpeak 6 Server. Hemos repetido todos los pasos en un servidor de pruebas con Debian 12, y la versión del servidor en el momento de la prueba era **TeamSpeak 3 Server 3.13.8**.

***

## Cómo funciona el servidor de TeamSpeak

Un servidor de TeamSpeak es un programa que recibe la voz de quien habla y se la reenvía a quienes están en el mismo canal. El servidor no mezcla las voces, así que, cuando hablan varias personas a la vez, recibe varios flujos y envía todos a cada oyente. De ahí se deduce algo sencillo para la red. El tráfico entrante en el servidor es pequeño, mientras que el saliente crece con el número de oyentes y de personas que hablan a la vez, y precisamente el canal saliente determina cuánta gente aguantará tu servidor. La voz viaja por el protocolo UDP al puerto **9987**. UDP no espera la confirmación de cada paquete, y en una conversación en directo un paquete que llega tarde ya no sirve de nada, por eso la latencia es menor que con TCP. Además de la voz, el servidor escucha varios puertos más. Por **30033/tcp** los clientes transfieren archivos, avatares e iconos de canales. Por **10011/tcp** funciona ServerQuery, una consola de texto para la administración con la que se comunican los bots, los paneles y el propio administrador. La ayuda oficial de TeamSpeak considera obligatorios solo 9987/udp y 30033/tcp, y los puertos de ServerQuery opcionales, y en el cortafuegos haremos lo mismo.

En TeamSpeak no hay cuentas con usuario y contraseña. Cuando el cliente se inicia por primera vez, crea un par de claves, y el servidor reconoce a la persona por un identificador único derivado de la clave pública. Los permisos están ligados a ese identificador, y el nick sirve solo como firma en pantalla. Este esquema tiene un inconveniente. Mientras en un servidor nuevo no haya nadie con permisos, no hay quien nombre al primer administrador. De esto se encarga la **clave de privilegios** (privilege key, antes se llamaba token). El servidor la crea en el primer arranque y la muestra una sola vez. Quien introduzca la clave en el cliente entra en el grupo Server Admin, y después la clave deja de funcionar. El segundo secreto es la **contraseña de ServerQuery** de la cuenta `serveradmin`. También se entrega una sola vez y da control sobre todos los servidores virtuales. Por eso encontrar estos dos valores en el paso 4 es más importante de lo que parece.

TeamSpeak tiene ahora dos generaciones de servidor. En la página de descargas la versión estable sigue siendo **TeamSpeak 3 Server 3.13.8**, mientras que **TeamSpeak 6 Server** se ha publicado como beta para quien quiera probarlo, y el README del propio servidor lo llama directamente incompleto. Para un servidor que debe simplemente funcionar, las limitaciones de la beta son importantes. La licencia integrada es para 32 slots y se renueva cada dos meses con las nuevas compilaciones, y en la compilación que probamos es válida hasta el 1 de diciembre de 2026. Las licencias de TeamSpeak 3 no sirven para la versión sexta, y por ahora no hay traspaso de datos entre versiones. Por eso dedicamos la parte principal del artículo al TeamSpeak 3 estable, y a la beta le reservamos una sección aparte al final. El servidor 3.13.8 escribe él mismo en el registro, al arrancar, que su licencia integrada es válida hasta el 1 de julio de 2027, así que hacia el verano de 2027 conviene mirar en la página de descargas si hay una versión nueva.

> **Para una empresa hace falta otra licencia.**
>
> El servidor sin clave de licencia es gratuito y no tiene límite de tiempo, pero permite un solo servidor virtual y hasta 32 slots. El texto de la licencia reserva este modo para particulares y comunidades sin ánimo de lucro. Si el servidor lo necesita una empresa, TeamSpeak ofrece una licencia comercial aparte, y las condiciones hay que consultarlas con la propia TeamSpeak.

***

## Qué necesitas

* **Un servidor** con Debian 12 y **al menos 1 GB de memoria**, como recomienda la ayuda de TeamSpeak, por ejemplo el plan **DE-RZ9-1**. El propio servidor de TeamSpeak ocupó en reposo unos 17 MB. Si todavía no tienes servidor, contrátalo siguiendo la [guía](https://docs.f3cloud.com/es/client-area/order-vps.md).
* **Conexión por SSH**, por ejemplo con [Termius](https://docs.f3cloud.com/es/vps/termius-connection.md). Los comandos se ejecutan como `root`.
* **El cliente de TeamSpeak** para ti y para quienes vayan a entrar. Se descarga en la [página de descargas de TeamSpeak](https://teamspeak.com/en/downloads/), en la pestaña **TeamSpeak 3**, y en el momento de la prueba allí estaba la versión 3.6.2.
* **Un segundo ordenador** con Linux o macOS para comprobar los puertos en el paso 6. También sirve un segundo VPS.

***

## Paso 1. Crea el usuario y descarga el servidor

Ejecutar el servidor como `root` no es seguro, así que crearemos para él un usuario aparte, `teamspeak`, con la carpeta personal `/opt/teamspeak`. El inicio de sesión con este usuario está desactivado, y el servidor lo gestionará systemd. Encontrarás más información sobre los usuarios en el artículo sobre los [usuarios de Linux](https://docs.f3cloud.com/es/linux/linux-users.md).

```bash
useradd -r -m -d /opt/teamspeak -s /usr/sbin/nologin teamspeak
```

Para descargar y descomprimir el archivo hacen falta los paquetes `wget` y `bzip2`. En nuestra imagen ya estaban instalados, y el comando de abajo es por si a ti te faltan.

```bash
apt install -y wget bzip2
```

Descarga el archivo comprimido del servidor. La dirección está tomada de la página de descargas de TeamSpeak, y si allí ya ha salido una versión nueva, sustituye 3.13.8 por ella en los dos sitios.

```bash
cd /root
wget https://files.teamspeak-services.com/releases/server/3.13.8/teamspeak3-server_linux_amd64-3.13.8.tar.bz2
```

El archivo pesa unos 10 MB. Descomprímelo en `/opt/teamspeak` y pasa los archivos al usuario `teamspeak`.

```bash
tar -xjf teamspeak3-server_linux_amd64-3.13.8.tar.bz2 -C /opt/teamspeak --strip-components=1
chown -R teamspeak:teamspeak /opt/teamspeak
```

El parámetro `--strip-components=1` quita de las rutas la carpeta exterior del archivo comprimido, por eso el archivo `ts3server` queda directamente en `/opt/teamspeak`. Después de descomprimir, allí hay unos 22 MB.

***

## Paso 2. Lee la licencia y acéptala

El servidor no arrancará hasta que aceptes la licencia de forma explícita. Compruébalo tú mismo e inícialo a mano como el usuario `teamspeak`.

```bash
cd /opt/teamspeak
runuser -u teamspeak -- ./ts3server
```

El servidor terminará enseguida y explicará cómo aceptar la licencia.

<figure><img src="https://docs.f3cloud.com/img/teamspeak-license-error.png" alt="El servidor de TeamSpeak se niega a arrancar y pide aceptar la licencia"><figcaption><p>Sin aceptar la licencia, el servidor no arranca</p></figcaption></figure>

Puedes leer la licencia directamente en el terminal. Es larga, así que desplázate con la tecla <kbd>Espacio</kbd>, y para salir pulsa <kbd>Q</kbd>.

```bash
runuser -u teamspeak -- env TS3SERVER_LICENSE=view ./ts3server | less
```

La aceptación de la licencia se registra con un archivo vacío `.ts3server_license_accepted` en la carpeta de trabajo del servidor. TeamSpeak describe otras dos formas, el parámetro `license_accepted=1` en la línea de comandos y la variable `TS3SERVER_LICENSE=accept`, pero el archivo es más cómodo, porque se queda en su sitio tras las actualizaciones.

```bash
runuser -u teamspeak -- touch /opt/teamspeak/.ts3server_license_accepted
```

***

## Paso 3. Configura el inicio automático

Para que el servidor funcione en segundo plano, arranque junto con el VPS y se levante tras un fallo, lo configuraremos como servicio de systemd. Cómo funcionan los servicios se explica con detalle en el artículo sobre [systemd](https://docs.f3cloud.com/es/linux/systemd-services.md).

```bash
nano /etc/systemd/system/teamspeak.service
```

Pega en el archivo el texto de abajo, guarda con la combinación <kbd>Ctrl</kbd> + <kbd>O</kbd>, luego <kbd>Enter</kbd>, y sal del editor con <kbd>Ctrl</kbd> + <kbd>X</kbd>.

```ini
[Unit]
Description=TeamSpeak 3 server
After=network-online.target
Wants=network-online.target

[Service]
User=teamspeak
WorkingDirectory=/opt/teamspeak
ExecStart=/opt/teamspeak/ts3server
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
```

El parámetro `WorkingDirectory` es importante, porque en la carpeta de trabajo es donde el servidor busca el archivo con la aceptación de la licencia y donde guarda la base de datos, los archivos y los registros. El servidor funciona en modo normal, no en segundo plano, así que todo lo que escribe en pantalla systemd lo guarda en el registro. Activa el inicio automático e inicia el servicio.

```bash
systemctl daemon-reload
systemctl enable --now teamspeak
systemctl status teamspeak
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-systemd-status.png" alt="systemctl status teamspeak, servicio active (running), proceso ts3server"><figcaption><p>El servicio funciona y está activado en el inicio automático</p></figcaption></figure>

En nuestro servidor, el primer arranque junto con la creación de la base de datos tardó alrededor de un segundo, y en reposo el servicio ocupó 16,9 MB de memoria según systemd. Comprobamos que el servicio sobrevive a un fallo. Cuando terminamos el proceso a la fuerza con el comando `kill -9`, systemd volvió a iniciar el servidor al cabo de 10 segundos.

Ahora el servidor hay que gestionarlo a través de systemd.

* `systemctl stop teamspeak` apaga el servidor.
* `systemctl start teamspeak` lo enciende.
* `systemctl restart teamspeak` lo reinicia.
* `journalctl -u teamspeak -f` muestra el registro en tiempo real, y se sale con <kbd>Ctrl</kbd> + <kbd>C</kbd>. Encontrarás más información sobre los registros en el artículo sobre los [logs de Linux](https://docs.f3cloud.com/es/linux/linux-logs.md).

***

## Paso 4. Encuentra la clave de privilegios y la contraseña de ServerQuery

En el primer arranque el servidor imprimió dos secretos. Como el servidor funciona bajo systemd, están en el registro del servicio. Sacaremos de él solo las líneas necesarias.

```bash
journalctl -u teamspeak --no-pager -o cat | grep -E "loginname|apikey|token="
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-credentials.png" alt="Líneas del registro con la contraseña de ServerQuery, la clave API y la clave de privilegios, los valores están ocultos"><figcaption><p>Contraseña, clave API y clave de privilegios (en la captura los valores están ocultos)</p></figcaption></figure>

En la salida hay cuatro líneas.

* En la primera línea están el nombre de la cuenta `serveradmin` y su **contraseña de ServerQuery**.
* En la segunda línea está la **clave API** para gestionar el servidor por HTTP, y solo les servirá a quienes escriban bots y paneles.
* En la tercera y la cuarta línea está la misma **clave de privilegios**, que necesitarás en el paso 7. El servidor la imprime dos veces, la primera en una línea del registro y la segunda dentro de un recuadro.

Copia estos valores en un gestor de contraseñas. La clave de privilegios además queda anotada en la carpeta `logs`, en el archivo de registro del servidor virtual, pero la contraseña de ServerQuery y la clave API no llegan a los archivos de registro, y solo se pueden encontrar en el registro de systemd. Si con el tiempo el registro se limpia o pierdes los valores antes, no pasa nada, en la sección «Preguntas frecuentes» de más abajo hay una forma de crear una clave nueva y de restablecer la contraseña.

> **No envíes la clave ni la contraseña a nadie.**
>
> La clave de privilegios da derechos de administrador en el servidor, y la contraseña de ServerQuery da control total sobre todos los servidores. No las muestres en capturas de pantalla ni las envíes por mensajería. Si la clave ha caído en manos ajenas antes de que la uses, crea una nueva como se describe en la sección «Preguntas frecuentes».

***

## Paso 5. Abre los puertos en UFW

Si en el VPS está activado el cortafuegos UFW, abre el puerto de voz y el de transferencia de archivos. Estos dos puertos los necesita todo el que vaya a entrar en el servidor. Encontrarás más información sobre el cortafuegos en el artículo sobre [UFW](https://docs.f3cloud.com/es/vps/security/firewall.md).

```bash
ufw allow 9987/udp
ufw allow 30033/tcp
```

No conviene abrir el puerto 10011 de ServerQuery a todo internet. La contraseña viaja por él en texto plano, y el manual oficial del servidor llama a esta variante la antigua opción predeterminada y aconseja encarecidamente protocolos más seguros. Si necesitas acceso a ServerQuery desde tu ordenador de casa, abre el puerto solo para tu dirección. Para la comprobación del paso 6 lo hicimos exactamente así, y en lugar de `IP-de-tu-ordenador` pon tu dirección externa.

```bash
ufw allow from IP-de-tu-ordenador to any port 10011 proto tcp
ufw status
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-ufw.png" alt="Comandos ufw allow para los puertos 9987/udp, 30033/tcp y 10011/tcp solo para una dirección, y después ufw status"><figcaption><p>Voz y archivos abiertos para todos, ServerQuery solo para una dirección</p></figcaption></figure>

El propio servidor escucha más puertos de los que hemos abierto. Además de la voz y la transferencia de archivos, acepta conexiones de ServerQuery de tres tipos, la normal en el 10011, por SSH en el 10022 y por HTTP en el 10080, y además en todas las direcciones a la vez. Puedes comprobarlo con el comando `ss`.

```bash
ss -tuln | grep -E "Netid|:(9987|10011|10022|10080|30033) "
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-ports.png" alt="Salida de ss, el servidor escucha udp 9987 y tcp 30033, 10022, 10011, 10080"><figcaption><p>Puertos que escucha el servidor de TeamSpeak</p></figcaption></figure>

Los puertos 10022 y 10080 no los abrimos en el cortafuegos, y desde otro ordenador no responden. Lo mejor es dejarlos así.

***

## Paso 6. Comprueba los puertos desde fuera

Los puertos hay que comprobarlos desde otro ordenador. Si haces la comprobación en el propio servidor, pasará incluso con el cortafuegos cerrado, porque el tráfico va por la interfaz interna, que el cortafuegos no limita. Nosotros comprobamos desde un ordenador con macOS, y en Linux los comandos son los mismos.

Primero comprobaremos el puerto de transferencia de archivos. Funciona por TCP, así que basta con la utilidad `nc`.

```bash
nc -vz IP-del-servidor 30033
```

La respuesta **succeeded** significa que el puerto está abierto y el servidor responde.

Con el puerto de voz es más complicado, porque UDP no responde a una simple comprobación de conexión. Escribimos un script corto en Python que envía el primer paquete del handshake, con el que el cliente empieza la conexión, y espera la respuesta tres segundos. No es una utilidad oficial, la hicimos nosotros para comprobar el puerto sin cliente gráfico. Crea el archivo.

```bash
nano ts3-udp-check.py
```

```python
import os, socket, struct, sys, time

host = sys.argv[1]
port = int(sys.argv[2]) if len(sys.argv) > 2 else 9987

# Primer paquete de handshake de TeamSpeak, tal como lo envía el cliente
data = struct.pack('>IBI', 1566914096, 0, int(time.time())) + os.urandom(4) + bytes(8)
packet = b'TS3INIT1' + struct.pack('>HH', 101, 0) + b'\x88' + data

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(3)
s.sendto(packet, (host, port))
try:
    reply, addr = s.recvfrom(2048)
    print('El servidor respondió, el puerto está accesible')
except socket.timeout:
    print('Sin respuesta, el puerto está cerrado o el servidor no está en marcha')
```

Ejecútalo indicando la dirección del servidor y el puerto.

```bash
python3 ts3-udp-check.py IP-del-servidor 9987
```

Por último, comprobaremos ServerQuery. Conéctate al puerto 10011, y el servidor te saludará con la línea `TS3`. Después introduce los comandos uno por uno. En lugar de `CONTRASEÑA` pon la contraseña de ServerQuery del paso 4.

```bash
nc IP-del-servidor 10011
```

```text
login serveradmin CONTRASEÑA
version
quit
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-check-outside.png" alt="Comprobación desde fuera, nc al puerto 30033, respuesta del script para el puerto 9987 y entrada en ServerQuery con el comando version"><figcaption><p>Los tres puertos responden, el servidor informa de la versión 3.13.8</p></figcaption></figure>

La respuesta `error id=0 msg=ok` al comando `login` significa que la contraseña se ha aceptado, y en respuesta a `version` el servidor indica su versión y su plataforma. En nuestro servidor, antes de los comandos `ufw allow` el script callaba e informaba de que no había respuesta, y después de ellos la respuesta llegaba en unos 60 milisegundos.

Tras la comprobación, quita la regla para ServerQuery si ya no la necesitas.

```bash
ufw delete allow from IP-de-tu-ordenador to any port 10011 proto tcp
```

***

## Paso 7. Conéctate con el cliente y hazte administrador

A partir de aquí, los pasos se describen según la ayuda oficial de TeamSpeak 3, porque en el servidor de pruebas no ejecutamos el cliente gráfico. Los nombres de los elementos del menú están tomados de allí.

1. Instala el cliente de TeamSpeak 3 y ejecútalo.
2. En el menú **Connections** elige **Connect**.
3. En el campo de la dirección introduce la dirección IP del servidor. Si el servidor funciona en el puerto 9987, no hace falta indicar el puerto, y para otro puerto usa el formato `IP:PUERTO`.
4. Introduce el nick con el que te verán los demás. Deja vacío el campo de la contraseña del servidor mientras no la hayas establecido.
5. Pulsa el botón de conexión.

Entrarás en el servidor como un usuario normal, sin derechos de administrador. Para obtenerlos, en el menú **Permissions** elige **Use Token** y pega la clave de privilegios del paso 4. Si todo ha ido bien, junto a tu nick aparecerá el icono **SA**. La clave es de un solo uso, así que tras introducirla con éxito dejará de funcionar. Para dar derechos a otra persona, abre en el menú **Permissions** la opción **Token Manager**, pulsa **Add Token**, elige el tipo **Server Group** y el grupo **Server Admin**, y a continuación pulsa **Create**. En la aplicación para iOS, la opción para introducir la clave se llama **Use Privilege Key**.

Ahora ya puedes configurar el servidor. Haz clic con el botón derecho en el nombre del servidor, sobre el canal superior, y elige **Edit Virtual Server**. Entre otras cosas, allí se establece la contraseña general del servidor. Hace falta si no quieres que entre cualquiera que conozca la dirección. El enlace para los amigos se puede hacer con el formato `ts3server://IP-del-servidor?port=9987`, y al hacer clic en él el cliente se conectará solo al servidor. En lugar de la dirección IP es cómodo usar un dominio, y cómo hacerlo se describe en el artículo sobre [cómo apuntar un dominio a un VPS](https://docs.f3cloud.com/es/vps/domain-to-vps.md).

> **También sirve el cliente TeamSpeak 6.**
>
> Según la ayuda de TeamSpeak, el cliente de la versión sexta puede conectarse a un servidor de TeamSpeak 3, pero tendrá solo las funciones de la versión tercera. El cliente de TeamSpeak 6 en la página de descargas también es por ahora una beta, y en el primer arranque pide crear una cuenta de myTeamSpeak.

***

## Copias de seguridad

Todo lo que guarda TeamSpeak está dentro de `/opt/teamspeak`. Según la ayuda oficial, para trasladar el servidor a otra máquina hacen falta los siguientes archivos.

* `ts3server.sqlitedb` contiene la base de datos con todos los canales, grupos, permisos y usuarios, y es el archivo más importante.
* La carpeta `files` guarda los archivos subidos, los iconos y los avatares.
* `query_ip_allowlist.txt` y `query_ip_denylist.txt` contienen las listas de direcciones para ServerQuery. En la ayuda se llaman `whitelist` y `blacklist`, y en la versión 3.13.8 los archivos se llaman exactamente como hemos escrito.
* `licensekey.dat` lo tienen solo quienes han comprado una licencia.
* `ssh_host_rsa_key` guarda la clave de la variante SSH de ServerQuery, y la hemos añadido nosotros para que tras la restauración la clave del servidor no cambie.

Copiar sin más `ts3server.sqlitedb` en un servidor en funcionamiento no es fiable. SQLite escribe los cambios primero en un archivo de registro contiguo y no los traslada al archivo principal de inmediato. Lo comprobamos en nuestro servidor. Después de crear dos canales, la copia del archivo principal por sí solo contenía un solo canal en vez de tres, y la copia hecha con las herramientas de SQLite conservó los tres. Por eso usamos la utilidad `sqlite3` con el comando `.backup`, que hace una copia coherente sin detener el servidor.

```bash
apt install -y sqlite3
nano /opt/teamspeak/backup.sh
```

El script guarda la base de datos y los archivos en un archivo comprimido en la carpeta `/opt/teamspeak/backups` y conserva los 7 últimos.

```bash
#!/bin/sh
# Copia de la base de datos y de los archivos de TeamSpeak sin detener el servidor, conserva los 7 últimos archivos comprimidos
set -e
cd /opt/teamspeak
mkdir -p backups
tmp=$(mktemp -d)
sqlite3 ts3server.sqlitedb ".backup '$tmp/ts3server.sqlitedb'"
cp -a files query_ip_allowlist.txt query_ip_denylist.txt ssh_host_rsa_key "$tmp"/
[ -f licensekey.dat ] && cp -a licensekey.dat "$tmp"/
tar -czf "backups/teamspeak-$(date +%F-%H%M).tar.gz" -C "$tmp" .
rm -rf "$tmp"
ls -1t backups/teamspeak-*.tar.gz | tail -n +8 | xargs -r rm --
```

Haz el script ejecutable, ejecútalo a mano y añádelo a la programación del usuario `teamspeak`, por ejemplo cada noche a las 4:00.

```bash
chmod +x /opt/teamspeak/backup.sh
chown teamspeak:teamspeak /opt/teamspeak/backup.sh
runuser -u teamspeak -- /opt/teamspeak/backup.sh
echo "0 4 * * * /opt/teamspeak/backup.sh" | crontab -u teamspeak -
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-backup.png" alt="Ejecución de backup.sh, lista de archivos comprimidos en la carpeta backups y contenido del último"><figcaption><p>En el archivo comprimido están la base de datos, la lista de direcciones y la clave SSH, y también la carpeta files</p></figcaption></figure>

Comprobamos el script tanto a mano como por programación, y las dos veces apareció el archivo comprimido. Encontrarás más información sobre la programación en el artículo sobre [cron](https://docs.f3cloud.com/es/linux/cron-linux.md). Las copias en este mismo servidor no te salvarán si desaparece el propio servidor, así que de vez en cuando descarga los archivos comprimidos a tu equipo o envíalos a otro servidor, por ejemplo con el comando [rsync](https://docs.f3cloud.com/es/linux/rsync-linux.md).

Para restaurar el servidor desde una copia, detén el servicio, elimina la base de datos y los archivos actuales, descomprime el archivo que necesites e inicia de nuevo el servicio. En lugar del nombre del archivo del ejemplo pon el tuyo.

```bash
systemctl stop teamspeak
rm -rf /opt/teamspeak/ts3server.sqlitedb* /opt/teamspeak/files
tar -xzf /opt/teamspeak/backups/teamspeak-2026-10-21-1503.tar.gz -C /opt/teamspeak
chown -R teamspeak:teamspeak /opt/teamspeak
systemctl start teamspeak
```

Comprobamos la restauración en nuestro servidor. Después volvieron el nombre del servidor, los dos canales, la contraseña de ServerQuery anterior y la clave de privilegios anterior. El comando `rm` elimina además los archivos temporales de la base de datos con las terminaciones `-wal` y `-shm`, para que el servidor empiece a trabajar desde un estado limpio.

> **Un servidor sin base de datos arranca como nuevo.**
>
> Si inicias el servidor sin el archivo `ts3server.sqlitedb`, creará una base de datos vacía y entregará una contraseña de ServerQuery y una clave de privilegios nuevas. Nos aseguramos de ello quitando temporalmente la base de datos, y después recuperamos los datos de la copia. Por eso no elimines la base de datos sin tener un archivo comprimido reciente.

***

## Actualización del servidor

El servidor se actualiza sustituyendo los archivos. En la documentación del servidor de TeamSpeak se dice simplemente que se copien los archivos nuevos sobre los antiguos. La base de datos y los ajustes no se ven afectados, porque no están en el archivo comprimido. Repetimos este procedimiento en nuestro servidor. En ese momento no había una versión más nueva que la 3.13.8, así que descomprimimos la misma versión sobre la instalada. Los canales, las claves y los ajustes se quedaron en su sitio, y en el registro tras el arranque volvió a aparecer la línea con la versión. Antes de actualizar se detiene el servidor y se hace una copia de seguridad con el script de la sección anterior.

```bash
systemctl stop teamspeak
runuser -u teamspeak -- /opt/teamspeak/backup.sh

cd /root
wget https://files.teamspeak-services.com/releases/server/NUEVA-VERSION/teamspeak3-server_linux_amd64-NUEVA-VERSION.tar.bz2
tar -xjf teamspeak3-server_linux_amd64-NUEVA-VERSION.tar.bz2 -C /opt/teamspeak --strip-components=1
chown -R teamspeak:teamspeak /opt/teamspeak

systemctl start teamspeak
```

El último comando `chown` es obligatorio. Descomprimimos el archivo como `root`, y tras descomprimir el archivo `ts3server` pertenecía a `root`. Puedes comprobar la versión tras el arranque en el registro.

```bash
journalctl -u teamspeak -n 80 --no-pager -o cat | grep "TeamSpeak 3 Server"
```

La lista de cambios de cada versión está en el archivo `/opt/teamspeak/CHANGELOG`.

***

## TeamSpeak 6 como versión beta del servidor en Docker

Si quieres probar la nueva generación, TeamSpeak recomienda para TeamSpeak 6 Server la instalación mediante Docker. Cómo instalar el propio Docker se explica en el artículo sobre la [instalación de Docker](https://docs.f3cloud.com/es/docker/docker-installation.md). Probamos la compilación **6.0.0-beta13.1**. La imagen ocupa unos 60 MB, y el contenedor en reposo ocupó unos 20 MB de memoria. El conjunto de puertos de la versión sexta es casi el mismo. La voz va por el **9987/udp**, la transferencia de archivos por el **30033/tcp**, y ServerQuery no está activado por defecto. Lo comprobamos desde fuera, y al puerto 10011 llega un rechazo de la conexión. Se puede activar con los parámetros del servidor, y según la documentación se le asignan los puertos 10022 para SSH y 10080 para HTTP.

Ejecuta el comando del README oficial del servidor. Le hemos añadido `--restart unless-stopped` para que el contenedor se levante tras reiniciar el VPS. La aceptación de la licencia aquí se indica con la variable `TSSERVER_LICENSE_ACCEPTED=accept`, y los datos se guardan en el volumen `teamspeak-data`.

```bash
docker run -d --name teamspeak-server --restart unless-stopped \
  -p 9987:9987/udp -p 30033:30033 \
  -e TSSERVER_LICENSE_ACCEPTED=accept \
  -v teamspeak-data:/var/tsserver \
  teamspeaksystems/teamspeak6-server:latest
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak6-docker-run.png" alt="Ejecución del contenedor teamspeak-server con la imagen teamspeaksystems/teamspeak6-server"><figcaption><p>El contenedor de TeamSpeak 6 está en marcha</p></figcaption></figure>

El servidor imprime la clave de privilegios y la contraseña de ServerQuery en el primer arranque igual que la versión tercera, solo que hay que buscarlas en el registro del contenedor.

```bash
docker logs teamspeak-server 2>&1 | grep -E "loginname|apikey|token="
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak6-credentials.png" alt="Líneas del registro del contenedor con la contraseña de ServerQuery, la clave API y la clave de privilegios, los valores están ocultos"><figcaption><p>Clave y contraseña en el registro del contenedor (en la captura los valores están ocultos)</p></figcaption></figure>

El contenedor se actualiza sustituyendo la imagen. Comprobamos el procedimiento, y después los datos se quedaron en el volumen y no se crearon una clave ni una contraseña nuevas.

```bash
docker pull teamspeaksystems/teamspeak6-server:latest
docker stop teamspeak-server
docker rm teamspeak-server
```

Después repite el comando `docker run` de esta sección. Si cambias el puerto de transferencia de archivos, añade la variable `TSSERVER_FILE_TRANSFER_PORT` con el mismo número y publica el mismo número de puerto en el host, porque los clientes se conectan directamente a ese puerto. Lo comprobamos con el puerto 30034.

> **Docker abre los puertos sin pasar por UFW.**
>
> Docker abre por su cuenta los puertos publicados con `-p`, y las reglas de UFW no actúan sobre ellos. Iniciamos el contenedor en los puertos 9988 y 30034 sin una sola regla en UFW, y desde otro ordenador respondieron los dos puertos. Publica solo los puertos que deban estar abiertos para todos.

> **Qué conviene saber de la beta.**
>
> En el README del servidor se dice que es una beta y que algunas funciones todavía no están listas. La licencia integrada de 32 slots se renueva con las nuevas compilaciones, y en nuestra compilación es válida hasta el 1 de diciembre de 2026, así que habrá que actualizar el servidor. Las licencias de TeamSpeak 3 no sirven para él, y no hay traspaso de datos entre versiones. Si la versión tercera y la sexta están en el mismo servidor, necesitan puertos distintos.

***

## Preguntas frecuentes

<details>

<summary>Please set the environment variable TS3SERVER_LICENSE to "accept" in order to accept the license agreement</summary>

El servidor no ha encontrado la aceptación de la licencia y ha terminado. Recibimos este mensaje en el primer arranque manual. Crea un archivo vacío `.ts3server_license_accepted` en la carpeta de trabajo del servidor, como se muestra en el paso 2, y asegúrate de que en el servicio de systemd figura `WorkingDirectory=/opt/teamspeak`, porque el archivo se busca precisamente en la carpeta de trabajo.

</details>

<details>

<summary>local accounting reports an already running instance, instance will shutdown</summary>

Sin clave de licencia, TeamSpeak permite ejecutar un solo servidor en una máquina. Recibimos esta línea cuando iniciamos una segunda copia mientras el servicio estaba en marcha, y la segunda copia se detuvo enseguida. Lo más habitual es que estés iniciando el servidor a mano mientras el servicio de systemd ya está funcionando. Detén la copia sobrante o gestiona el servidor solo mediante `systemctl`.

</details>

<details>

<summary>error id=520 msg=invalid\sloginname\sor\spassword</summary>

La contraseña de ServerQuery no ha servido. Los símbolos `\s` en la respuesta significan un espacio, así es como ServerQuery escribe los espacios. Toma la contraseña del registro, como en el paso 4. Si has perdido la contraseña, se puede restablecer. Detén el servicio e inicia el servidor una vez a mano con el parámetro `serveradmin_password`, y cuando muestre las líneas de arranque, deténlo con <kbd>Ctrl</kbd> + <kbd>C</kbd> y vuelve a iniciar el servicio.

```bash
systemctl stop teamspeak
cd /opt/teamspeak
runuser -u teamspeak -- ./ts3server serveradmin_password=NUEVA-CONTRASEÑA
systemctl start teamspeak
```

Comprobamos este método, y después la contraseña anterior dejó de servir y la nueva funcionó. Ten en cuenta que la contraseña se queda en el historial de comandos, por eso la ayuda de TeamSpeak aconseja ejecutar tras entrar el comando `clientsetserverquerylogin client_login_name=serveradmin`. El servidor mostrará una contraseña nueva, y esa ya no estará en el historial.

</details>

<details>

<summary>error id=3329 msg=connection\sfailed,\syou\sare\sbanned extra_msg=you\smay\sretry\sin\s600\sseconds</summary>

Ha saltado la protección de ServerQuery contra la adivinación de contraseñas. Recibimos esta respuesta tras tres contraseñas incorrectas seguidas, y la dirección quedó bloqueada durante 600 segundos. Espera ese tiempo o reinicia el servicio con el comando `systemctl restart teamspeak`, y comprobamos que el reinicio levanta el bloqueo. La protección no afecta a las direcciones del archivo `query_ip_allowlist.txt`, en el que por defecto figuran `127.0.0.1` y `::1`. Añadir una dirección a este archivo surte efecto de inmediato, pero no levanta un bloqueo ya impuesto, y para eso hace falta el reinicio.

</details>

<details>

<summary>No reply from server o Connection Error [0x705]</summary>

El cliente no ha recibido respuesta del servidor. La ayuda de TeamSpeak menciona como causas habituales una dirección o un puerto incorrectos, un servidor que no está en marcha y un cortafuegos que corta el tráfico. Comprueba por orden.

1. El servicio funciona, y `systemctl status teamspeak` muestra active (running).
2. El puerto **9987/udp** está abierto, y `ufw status` contiene una regla para él.
3. La comprobación del paso 6 responde. Cuando quitamos a propósito la regla para 9987/udp, el script informó de que no había respuesta, y tras el comando `ufw allow 9987/udp` la respuesta volvió.
4. Si el servidor no funciona en el puerto 9987, la dirección en el cliente hay que escribirla en el formato `IP:PUERTO`.

</details>

<details>

<summary>Has perdido la clave de privilegios o ya está usada</summary>

La clave nueva se crea con un comando de ServerQuery. Entra en la consola directamente en el servidor, porque la protección contra la adivinación de contraseñas no bloquea la dirección `127.0.0.1`, y no hace falta abrir el puerto en el cortafuegos.

```bash
nc 127.0.0.1 10011
```

Introduce por orden tres comandos, y en lugar de `CONTRASEÑA` pon la contraseña de ServerQuery.

```text
login serveradmin CONTRASEÑA
use 1
servergrouplist
```

En la lista de grupos busca la línea `name=Server\sAdmin` con el atributo `type=1`. La línea con `type=0` tiene otra función, es una plantilla para servidores futuros. En nuestro servidor, el grupo necesario tenía el número 6. Sustitúyelo por tu número en el siguiente comando.

```text
privilegekeyadd tokentype=0 tokenid1=6 tokenid2=0 tokendescription=new\sadmin
```

El servidor responderá con una línea `token=…`, y esa es la clave nueva. Comprobamos el comando, y la clave se creó y apareció en la lista del comando `privilegekeylist`. Puedes salir de la consola con el comando `quit`.

</details>

<details>

<summary>Unable to open licensekey.dat, falling back to limited functionality</summary>

Esto no es un error, sino una advertencia de que el servidor funciona sin una licencia comprada. En el registro, justo al lado, se ve que la licencia se llama **No License** y que permite un servidor virtual y 32 slots. Para un servidor personal es suficiente.

</details>

<details>

<summary>Please set the environment variable TSSERVER_LICENSE_ACCEPTED to "accept" in order to accept the license agreement</summary>

Así se comporta el contenedor de TeamSpeak 6 si se inicia sin la variable con la aceptación de la licencia, y recibimos este mensaje exactamente así. Añade al comando `docker run` el parámetro `-e TSSERVER_LICENSE_ACCEPTED=accept`.

</details>

***

## Nuestros recursos

**Canal de Telegram:** [https://t.me/f3cloud_news](https://t.me/f3cloud_news)\
**Web del hosting:** [https://f3cloud.com](https://f3cloud.com/es)
