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.
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 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 configurationquery_ip_allowlist.txt/query_ip_denylist.txtfiles/directory — uploaded channel/server icons- Any
*.datlicense 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"
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.
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
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
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
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.