TeamSpeak 3 → TeamSpeak 6 Migration on FreeBSD


This guide walks you through migrating a running TeamSpeak 3 (TS3) server to TeamSpeak 6 (TS6) on FreeBSD. Since TS6 is not yet available in the FreeBSD ports tree, we build and install it from the official GitHub source. The guide covers prerequisites, backup, build, migration, and service configuration.

⚠ Before you begin: TeamSpeak 6 server is under active development. Always verify repository URLs, branch names, and build instructions against the TeamSpeak Systems GitHub at the time of your installation, as they may have changed since this guide was written. Test in a non-production environment first.

1 Prerequisites

Ensure the following are in place before starting:

Requirement Notes
FreeBSD 13.x or 14.x (amd64) Tested on 14.1-RELEASE
Root or sudo access Required for service installation
Existing TS3 server data backed up See Step 2
Git installed pkg install git
Rust toolchain (stable) TS6 server is written in Rust
OpenSSL, libsodium Cryptography dependencies
CMake & Ninja (optional) Used by some TS6 build targets

Install required packages in one command:

pkg install git rust cargo openssl libsodium cmake ninja pkgconf
ℹ Rust version: TeamSpeak 6 server requires Rust stable 1.70 or newer. The FreeBSD rust package is usually current. Verify with rustc --version. If you need a newer version, use rustup instead.

2 Back Up Your TeamSpeak 3 Server

Never skip this step. Stop the TS3 server first, then archive its entire data directory.

# Stop the existing TS3 service (adjust service name as needed)
service teamspeak3 stop

# Default TS3 data is usually in /usr/local/teamspeak3-server or /home/teamspeak
# Adjust the path to match your installation
TS3_DIR="/usr/local/teamspeak3-server"
BACKUP_FILE="/root/ts3-backup-$(date +%Y%m%d-%H%M%S).tar.gz"

tar -czf "$BACKUP_FILE" -C "$(dirname $TS3_DIR)" "$(basename $TS3_DIR)"
echo "Backup saved to: $BACKUP_FILE"

Key files to confirm are in your backup:

  • ts3server.sqlitedb — main database (channels, groups, permissions)
  • ts3server.ini — server configuration
  • query_ip_allowlist.txt / query_ip_denylist.txt
  • files/ directory — uploaded channel/server icons
  • Any *.dat license files

3 Clone the TeamSpeak 6 Server Repository

Fetch the source from GitHub. At the time of writing, the server component lives in the teamspeak6-server repository under the TeamSpeak-Systems organization. Verify the current repository name and default branch before cloning.

# Create a dedicated build directory
mkdir -p /usr/local/src
cd /usr/local/src

# Clone the TS6 server repository (verify URL at github.com/TeamSpeak-Systems)
git clone https://github.com/TeamSpeak-Systems/teamspeak6-server.git
cd teamspeak6-server

# Check out the latest stable tag (replace v6.x.x with the current release)
git fetch --tags
LATEST=$(git describe --tags "$(git rev-list --tags --max-count=1)")
echo "Latest tag: $LATEST"
git checkout "$LATEST"
ℹ No stable tag yet? If TS6 server is still in pre-release, use the main or develop branch and expect possible instability. Check the repository’s CHANGELOG.md or release notes for guidance.

4 Configure Environment Variables for FreeBSD

FreeBSD’s OpenSSL and library paths differ slightly from Linux. Export these before building so Cargo can locate the correct headers and libraries:

# Point Rust/Cargo to the FreeBSD OpenSSL installation
export OPENSSL_DIR=/usr
export OPENSSL_LIB_DIR=/usr/lib
export OPENSSL_INCLUDE_DIR=/usr/include

# Ensure pkg-config can find libsodium
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

# Optional: speed up compilation
export CARGO_BUILD_JOBS=$(sysctl -n hw.ncpu)

5 Build the TS6 Server

cd /usr/local/src/teamspeak6-server

# Build in release mode
cargo build --release

# The compiled binary will be at:
ls -lh target/release/ts6server

Compilation typically takes 5–15 minutes depending on hardware. If you see linker errors related to libsodium or openssl, double-check Step 4 and confirm the packages are installed with pkg info libsodium openssl.

⚠ Build script variations: Some TS6 releases include a Makefile, build.sh, or CMake configuration. Always check the repository’s README.md for the canonical build command — it may differ from the cargo build shown above.

6 Install the Binary and Create the Service User

# Create a dedicated service user (no login shell, no home login)
pw useradd -n teamspeak6 -d /var/db/teamspeak6 -m -s /usr/sbin/nologin -c "TeamSpeak 6 Server"

# Create the working directory
mkdir -p /var/db/teamspeak6
chown -R teamspeak6:teamspeak6 /var/db/teamspeak6

# Install the binary system-wide
install -o root -g wheel -m 755 \
  /usr/local/src/teamspeak6-server/target/release/ts6server \
  /usr/local/bin/ts6server

7 Migrate TS3 Data to TS6

TeamSpeak 6 introduces a new data format. Most releases ship a migration utility or accept a --migrate-from-ts3 flag. The exact invocation depends on the release — check the repository’s MIGRATION.md or release notes. A typical migration looks like this:

# Run the built-in migration tool (verify flag name in your release's docs)
/usr/local/bin/ts6server migrate \
  --ts3-db /usr/local/teamspeak3-server/ts3server.sqlitedb \
  --ts3-files /usr/local/teamspeak3-server/files \
  --output-dir /var/db/teamspeak6

chown -R teamspeak6:teamspeak6 /var/db/teamspeak6
⚠ Data compatibility: Not all TS3 data may migrate cleanly. Server groups, permissions, and channel trees are usually preserved. Custom client badges, some plugin data, and very old SQLite schema versions may require manual intervention. Review the migration output log carefully.

8 Create the TS6 Configuration File

Create a minimal configuration at /var/db/teamspeak6/ts6server.ini. Adjust values to match your network setup:

cat > /var/db/teamspeak6/ts6server.ini << 'EOF'
# TeamSpeak 6 Server Configuration
# Refer to ts6server --help for all available options

# Network
default_voice_port=9987
query_port=10011
filetransfer_port=30033

# Paths
workdir=/var/db/teamspeak6
logpath=/var/log/teamspeak6

# Limits (adjust for your license)
maxclients=32

# Query interface
query_ip=127.0.0.1
EOF

mkdir -p /var/log/teamspeak6
chown -R teamspeak6:teamspeak6 /var/db/teamspeak6 /var/log/teamspeak6

9 Create the rc.d Service Script

FreeBSD services are managed through rc.d. Create a service script so TS6 starts automatically at boot:

cat > /usr/local/etc/rc.d/teamspeak6 << 'EOF'
#!/bin/sh
#
# PROVIDE: teamspeak6
# REQUIRE: NETWORKING DAEMON
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf to enable teamspeak6:
#   teamspeak6_enable="YES"

. /etc/rc.subr

name="teamspeak6"
rcvar="${name}_enable"
desc="TeamSpeak 6 Voice Server"

load_rc_config "${name}"

: ${teamspeak6_enable:="NO"}
: ${teamspeak6_user:="teamspeak6"}
: ${teamspeak6_group:="teamspeak6"}
: ${teamspeak6_dir:="/var/db/teamspeak6"}
: ${teamspeak6_config:="/var/db/teamspeak6/ts6server.ini"}

command="/usr/local/bin/ts6server"
command_args="--config ${teamspeak6_config}"
pidfile="/var/run/${name}.pid"

start_precmd="${name}_prestart"

teamspeak6_prestart()
{
    if [ ! -d "${teamspeak6_dir}" ]; then
        install -d -o ${teamspeak6_user} -g ${teamspeak6_group} "${teamspeak6_dir}"
    fi
}

run_rc_command "$1"
EOF

chmod 555 /usr/local/etc/rc.d/teamspeak6

Enable and start the service:

# Enable at boot
sysrc teamspeak6_enable="YES"

# Start it now
service teamspeak6 start

# Check status
service teamspeak6 status

10 Configure the Firewall

Open the required ports. The example below uses pf. Add these rules to /etc/pf.conf (adjust interface name as needed):

# TeamSpeak 6 voice (UDP)
pass in on em0 proto udp to port 9987

# ServerQuery (TCP)
pass in on em0 proto tcp to port 10011

# File transfer (TCP)
pass in on em0 proto tcp to port 30033
# Reload pf rules
pfctl -f /etc/pf.conf

11 Retrieve the Admin Token

On first startup, TS6 generates a ServerAdmin privilege key (token). You must use this to claim administrator rights from your TS6 client. Find it in the server log:

grep -i "token\|privilege\|admin" /var/log/teamspeak6/ts6server_*.log | head -20

Copy this token. In the TeamSpeak 6 client, go to Permissions → Use Privilege Key and paste it in.

12 Decommission the TS3 Server

Once you have verified the TS6 server is running correctly and all users can connect, disable the old TS3 service:

# Disable TS3 from starting at boot
sysrc teamspeak3_enable="NO"

# Stop it if still running
service teamspeak3 stop

# Optional: remove the TS3 package (if installed via pkg)
# pkg remove teamspeak3-server
✓ Keep your TS3 backup safe for at least 30 days in case you need to roll back. Do not delete the TS3 data directory until you’re fully satisfied with the TS6 migration.

Troubleshooting

Service fails to start

Check the log file for errors: tail -50 /var/log/teamspeak6/ts6server_*.log. Common causes are missing library paths or incorrect config file syntax. Run the binary manually as root first to see console output: /usr/local/bin/ts6server --config /var/db/teamspeak6/ts6server.ini

Library not found errors on startup

TS6 may require libsodium or libssl at runtime. Verify with ldd /usr/local/bin/ts6server and install any missing pkg packages shown.

Clients can’t connect

Confirm the UDP port is open: nc -zuv YOUR_SERVER_IP 9987. Check pf rules with pfctl -sr. Ensure the TS6 client version matches the server protocol version — TS3 clients cannot connect to a TS6 server.

Migration tool fails with schema error

Your TS3 database may be at an older schema version. First upgrade your TS3 server to the latest 3.x release, let it run once to migrate the schema, then stop it and re-run the TS6 migration tool.

Keeping TS6 Up to Date

Since TS6 is not yet in ports, updates require a manual rebuild. Create a simple update script:

cat > /usr/local/sbin/update-ts6.sh << 'EOF'
#!/bin/sh
set -e
cd /usr/local/src/teamspeak6-server
git fetch --tags
LATEST=$(git describe --tags "$(git rev-list --tags --max-count=1)")
git checkout "$LATEST"

export OPENSSL_DIR=/usr
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

cargo build --release

service teamspeak6 stop
install -o root -g wheel -m 755 target/release/ts6server /usr/local/bin/ts6server
service teamspeak6 start
echo "Updated to $LATEST"
EOF

chmod 755 /usr/local/sbin/update-ts6.sh
ℹ Watch for a ports entry: You can track the progress of a TS6 FreeBSD port by searching bugs.freebsd.org and the FreshPorts database. Once it lands in the tree, you can switch to pkg install teamspeak6-server and remove the manual build.

Last verified against FreeBSD 14.1-RELEASE and the TeamSpeak 6 server GitHub main branch. Always check the official repository for the latest build instructions and release notes before following this guide.