TeamSpeak: Complete Backup & Recovery Guide
Essential guide to backing up and restoring TeamSpeak server data, including permissions, databases, configurations, and disaster recovery procedures.
Understanding TeamSpeak Data Structure
Critical Components to Backup
- Database Files: SQLite databases containing users, permissions, and channels
- Configuration Files: Server configuration and license files
- File Transfers: Uploaded files and avatars
- Server Logs: Historical logs for troubleshooting
- Icons/Banners: Custom server graphics and branding
File Locations
# Linux Default Locations
/opt/teamspeak3-server_linux_amd64/
├── ts3server.sqlitedb # Main database
├── serverquerydocs/ # File transfer uploads
├── logs/ # Server logs
├── files/ # Avatar and icon files
├── licensekey.dat # License file (if applicable)
└── ts3server.ini # Server configuration
# Windows Default Locations
C:\Program Files\TeamSpeak 3 Server\
├── ts3server.sqlitedb
├── serverquerydocs\
├── logs\
├── files\
├── licensekey.dat
└── ts3server.ini
Manual Backup Procedures
Immediate Backup Script
#!/bin/bash
# teamspeak_backup.sh
TS_DIR="/opt/teamspeak3-server_linux_amd64"
BACKUP_DIR="/home/backups/teamspeak"
DATE=$(date +%Y%m%d_%H%M%S)
MAX_BACKUPS=7
mkdir -p "$BACKUP_DIR"
echo "Starting TeamSpeak backup..."
# Stop TeamSpeak service
systemctl stop teamspeak3
# Create backup directory
mkdir -p "$BACKUP_DIR/backup_$DATE"
# Backup critical files
cp "$TS_DIR/ts3server.sqlitedb" "$BACKUP_DIR/backup_$DATE/"
cp "$TS_DIR/ts3server.ini" "$BACKUP_DIR/backup_$DATE/"
cp -r "$TS_DIR/files" "$BACKUP_DIR/backup_$DATE/"
cp -r "$TS_DIR/logs" "$BACKUP_DIR/backup_$DATE/"
cp -r "$TS_DIR/serverquerydocs" "$BACKUP_DIR/backup_$DATE/"
# Backup license file if exists
if [ -f "$TS_DIR/licensekey.dat" ]; then
cp "$TS_DIR/licensekey.dat" "$BACKUP_DIR/backup_$DATE/"
fi
# Create compressed archive
cd "$BACKUP_DIR"
tar -czf "teamspeak_backup_$DATE.tar.gz" "backup_$DATE/"
rm -rf "backup_$DATE/"
# Start TeamSpeak service
systemctl start teamspeak3
# Clean old backups
ls -t teamspeak_backup_*.tar.gz | tail -n +$((MAX_BACKUPS + 1)) | xargs -r rm
echo "Backup completed: teamspeak_backup_$DATE.tar.gz"
Windows Backup Script
@echo off
REM teamspeak_backup.bat
SET TS_DIR="C:\Program Files\TeamSpeak 3 Server"
SET BACKUP_DIR="D:\Backups\TeamSpeak"
SET DATE=%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%
SET DATE=%DATE: =0%
mkdir "%BACKUP_DIR%"
echo Starting TeamSpeak backup...
REM Stop TeamSpeak service
net stop "TeamSpeak 3 Server"
REM Create backup directory
mkdir "%BACKUP_DIR%\backup_%DATE%"
REM Backup critical files
copy "%TS_DIR%\ts3server.sqlitedb" "%BACKUP_DIR%\backup_%DATE%\"
copy "%TS_DIR%\ts3server.ini" "%BACKUP_DIR%\backup_%DATE%\"
xcopy "%TS_DIR%\files" "%BACKUP_DIR%\backup_%DATE%\files\" /E /I /Y
xcopy "%TS_DIR%\logs" "%BACKUP_DIR%\backup_%DATE%\logs\" /E /I /Y
xcopy "%TS_DIR%\serverquerydocs" "%BACKUP_DIR%\backup_%DATE%\serverquerydocs\" /E /I /Y
REM Backup license file if exists
if exist "%TS_DIR%\licensekey.dat" (
copy "%TS_DIR%\licensekey.dat" "%BACKUP_DIR%\backup_%DATE%\"
)
REM Start TeamSpeak service
net start "TeamSpeak 3 Server"
echo Backup completed: backup_%DATE%
Automated Backup Solutions
Cron Job Setup (Linux)
# Edit crontab
crontab -e
# Add backup schedules
# Daily backup at 3:00 AM
0 3 * * * /home/scripts/teamspeak_backup.sh >> /home/logs/backup.log 2>&1
# Weekly full backup on Sundays at 2:00 AM
0 2 * * 0 /home/scripts/teamspeak_full_backup.sh >> /home/logs/backup.log 2>&1
# Hourly incremental backup
0 * * * * /home/scripts/teamspeak_incremental.sh >> /home/logs/backup.log 2>&1
Windows Task Scheduler
REM Schedule daily backup at 3:00 AM
schtasks /create /tn "TeamSpeak Daily Backup" /tr "C:\Scripts\teamspeak_backup.bat" /sc daily /st 03:00
REM Schedule weekly backup on Sundays
schtasks /create /tn "TeamSpeak Weekly Backup" /tr "C:\Scripts\teamspeak_backup.bat" /sc weekly /d SUN /st 02:00
Incremental Backup Strategy
SQLite Database Dumps
#!/bin/bash
# teamspeak_incremental.sh
TS_DIR="/opt/teamspeak3-server_linux_amd64"
BACKUP_DIR="/home/backups/teamspeak/incremental"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# Create SQLite dump
sqlite3 "$TS_DIR/ts3server.sqlitedb" ".dump" > "$BACKUP_DIR/database_$DATE.sql"
# Backup recent changes only
find "$TS_DIR/logs" -name "*.log" -mtime -1 -exec cp {} "$BACKUP_DIR/" \;
find "$TS_DIR/serverquerydocs" -mtime -1 -exec cp -r {} "$BACKUP_DIR/" \;
echo "Incremental backup: database_$DATE.sql"
Remote Backup Solutions
Cloud Storage Integration
#!/bin/bash
# teamspeak_cloud_backup.sh
LOCAL_BACKUP_DIR="/home/backups/teamspeak"
CLOUD_BUCKET="teamspeak-backups"
# Upload to AWS S3
aws s3 sync "$LOCAL_BACKUP_DIR" s3://$CLOUD_BUCKET/ --delete
# Upload to Google Drive
rclone sync "$LOCAL_BACKUP_DIR" gdrive:teamspeak-backups/
# Upload to Dropbox
python3 /home/scripts/dropbox_upload.py "$LOCAL_BACKUP_DIR"
echo "Cloud sync completed"
Off-site Server Sync
#!/bin/bash
# teamspeak_remote_sync.sh
LOCAL_DIR="/home/backups/teamspeak"
REMOTE_SERVER="backup.example.com"
REMOTE_DIR="/backups/teamspeak"
# Sync using rsync with SSH
rsync -avz --delete -e "ssh -i /home/.ssh/backup_key" \
"$LOCAL_DIR/" "$REMOTE_SERVER:$REMOTE_DIR/"
# Verify transfer
if [ $? -eq 0 ]; then
echo "Remote sync successful"
else
echo "Remote sync failed - check network connectivity"
# Send notification
echo "TeamSpeak backup sync failed" | mail -s "Backup Alert" admin@example.com
fi
Database Maintenance
SQLite Optimization
#!/bin/bash
# teamspeak_maintenance.sh
TS_DIR="/opt/teamspeak3-server_linux_amd64"
DB_FILE="$TS_DIR/ts3server.sqlitedb"
echo "Performing database maintenance..."
# Stop TeamSpeak
systemctl stop teamspeak3
# Create database backup before maintenance
cp "$DB_FILE" "$DB_FILE.backup.$(date +%Y%m%d_%H%M%S)"
# Database optimization
sqlite3 "$DB_FILE" "VACUUM;"
sqlite3 "$DB_FILE" "ANALYZE;"
sqlite3 "$DB_FILE" "REINDEX;"
# Remove old entries (90 days)
sqlite3 "$DB_FILE" "DELETE FROM logs WHERE timestamp < datetime('now', '-90 days');"
# Start TeamSpeak
systemctl start teamspeak3
echo "Database maintenance completed"
Recovery Procedures
Full Server Recovery
#!/bin/bash
# teamspeak_restore.sh
BACKUP_FILE="$1"
TS_DIR="/opt/teamspeak3-server_linux_amd64"
if [ -z "$BACKUP_FILE" ]; then
echo "Usage: $0 "
exit 1
fi
echo "Starting TeamSpeak recovery from: $BACKUP_FILE"
# Stop TeamSpeak
systemctl stop teamspeak3
# Create backup of current state
cp "$TS_DIR/ts3server.sqlitedb" "$TS_DIR/ts3server.sqlitedb.recovery_backup.$(date +%Y%m%d_%H%M%S)"
# Extract backup
cd "$TS_DIR"
tar -xzf "$BACKUP_FILE"
# Restore files
if [ -f "backup_*/ts3server.sqlitedb" ]; then
mv "backup_*/ts3server.sqlitedb" "$TS_DIR/"
fi
if [ -f "backup_*/ts3server.ini" ]; then
mv "backup_*/ts3server.ini" "$TS_DIR/"
fi
if [ -d "backup_*/files" ]; then
rm -rf "$TS_DIR/files"
mv "backup_*/files" "$TS_DIR/"
fi
# Set correct permissions
chown -R teamspeak:teamspeak "$TS_DIR"
chmod 644 "$TS_DIR/ts3server.sqlitedb"
chmod 644 "$TS_DIR/ts3server.ini"
# Start TeamSpeak
systemctl start teamspeak3
echo "Recovery completed"
Specific Data Recovery
Restoring Permissions Only
#!/bin/bash
# restore_permissions.sh
BACKUP_DB="$1"
CURRENT_DB="/opt/teamspeak3-server_linux_amd64/ts3server.sqlitedb"
if [ -z "$BACKUP_DB" ]; then
echo "Usage: $0 "
exit 1
fi
# Export permissions from backup
sqlite3 "$BACKUP_DB" ".dump permissions" > /tmp/permissions.sql
# Import permissions to current database
sqlite3 "$CURRENT_DB" < /tmp/permissions.sql
echo "Permissions restored"
Restoring Files Only
#!/bin/bash
# restore_files.sh
BACKUP_DIR="$1"
TS_DIR="/opt/teamspeak3-server_linux_amd64"
if [ -z "$BACKUP_DIR" ]; then
echo "Usage: $0 "
exit 1
fi
# Restore uploaded files
cp -r "$BACKUP_DIR/serverquerydocs/"* "$TS_DIR/serverquerydocs/"
cp -r "$BACKUP_DIR/files/"* "$TS_DIR/files/"
# Set permissions
chown -R teamspeak:teamspeak "$TS_DIR/serverquerydocs"
chown -R teamspeak:teamspeak "$TS_DIR/files"
echo "Files restored"
Disaster Recovery Planning
Recovery Time Objectives (RTO/RPO)
Service Level Agreements
- RPO (Recovery Point Objective): Maximum 1 hour data loss
- RTO (Recovery Time Objective): Maximum 30 minutes downtime
- Backup Frequency: Every 15 minutes for database, daily for full
- Retention Period: 30 days for daily, 1 year for weekly
Emergency Procedures
Critical Failure Response
- Immediate Assessment: Identify failure scope and impact
- Communication: Notify users and stakeholders
- Isolation: Prevent further damage to systems
- Recovery Initiation: Begin restoration process
- Verification: Test restored systems thoroughly
- Documentation: Record incident and lessons learned
Monitoring and Alerting
Backup Health Monitoring
#!/bin/bash
# backup_monitor.sh
BACKUP_DIR="/home/backups/teamspeak"
ALERT_EMAIL="admin@example.com"
MAX_AGE_HOURS=24
# Check for recent backup
LATEST_BACKUP=$(ls -t "$BACKUP_DIR"/teamspeak_backup_*.tar.gz | head -1)
BACKUP_AGE=$(( ($(date +%s) - $(stat -c %Y "$LATEST_BACKUP")) / 3600 ))
if [ "$BACKUP_AGE" -gt "$MAX_AGE_HOURS" ]; then
echo "ALERT: TeamSpeak backup is $BACKUP_AGE hours old" | \
mail -s "TeamSpeak Backup Alert" "$ALERT_EMAIL"
fi
# Check backup file integrity
tar -tzf "$LATEST_BACKUP" > /dev/null
if [ $? -ne 0 ]; then
echo "ALERT: TeamSpeak backup corruption detected" | \
mail -s "TeamSpeak Backup Alert" "$ALERT_EMAIL"
fi
Best Practices
Backup Strategy Recommendations
- 3-2-1 Rule: 3 copies, 2 different media, 1 off-site
- Regular Testing: Test recovery procedures monthly
- Encryption: Encrypt backups for security
- Documentation: Maintain detailed recovery procedures
- Monitoring: Monitor backup success and storage capacity
Security Considerations
- Access Control: Restrict backup file access to authorized personnel
- Encryption Keys: Store encryption keys securely
- Backup Integrity: Verify backup checksums regularly
- Secure Storage: Use encrypted cloud storage for off-site backups
- Audit Logging: Log all backup and recovery activities
Troubleshooting
Common Backup Issues
❌ Database Lock Error
TeamSpeak server must be stopped during backup to prevent database corruption.
❌ Permission Denied
Ensure backup script runs with proper permissions to access TeamSpeak files.
❌ Disk Space Full
Monitor available disk space and implement cleanup policies for old backups.
❌ Network Timeout
For remote backups, implement retry logic and timeout handling.
Pro Tip: Always test backup recovery procedures before implementing them in production to ensure they work as expected.
#!/bin/bash
# teamspeak_incremental.sh
TS_DIR="/opt/teamspeak3-server_linux_amd64"
BACKUP_DIR="/home/backups/teamspeak/incremental"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# Create SQLite dump
sqlite3 "$TS_DIR/ts3server.sqlitedb" ".dump" > "$BACKUP_DIR/database_$DATE.sql"
# Backup recent changes only
find "$TS_DIR/logs" -name "*.log" -mtime -1 -exec cp {} "$BACKUP_DIR/" \;
find "$TS_DIR/serverquerydocs" -mtime -1 -exec cp -r {} "$BACKUP_DIR/" \;
echo "Incremental backup: database_$DATE.sql"
#!/bin/bash
# teamspeak_cloud_backup.sh
LOCAL_BACKUP_DIR="/home/backups/teamspeak"
CLOUD_BUCKET="teamspeak-backups"
# Upload to AWS S3
aws s3 sync "$LOCAL_BACKUP_DIR" s3://$CLOUD_BUCKET/ --delete
# Upload to Google Drive
rclone sync "$LOCAL_BACKUP_DIR" gdrive:teamspeak-backups/
# Upload to Dropbox
python3 /home/scripts/dropbox_upload.py "$LOCAL_BACKUP_DIR"
echo "Cloud sync completed"
#!/bin/bash
# teamspeak_remote_sync.sh
LOCAL_DIR="/home/backups/teamspeak"
REMOTE_SERVER="backup.example.com"
REMOTE_DIR="/backups/teamspeak"
# Sync using rsync with SSH
rsync -avz --delete -e "ssh -i /home/.ssh/backup_key" \
"$LOCAL_DIR/" "$REMOTE_SERVER:$REMOTE_DIR/"
# Verify transfer
if [ $? -eq 0 ]; then
echo "Remote sync successful"
else
echo "Remote sync failed - check network connectivity"
# Send notification
echo "TeamSpeak backup sync failed" | mail -s "Backup Alert" admin@example.com
fi
#!/bin/bash
# teamspeak_maintenance.sh
TS_DIR="/opt/teamspeak3-server_linux_amd64"
DB_FILE="$TS_DIR/ts3server.sqlitedb"
echo "Performing database maintenance..."
# Stop TeamSpeak
systemctl stop teamspeak3
# Create database backup before maintenance
cp "$DB_FILE" "$DB_FILE.backup.$(date +%Y%m%d_%H%M%S)"
# Database optimization
sqlite3 "$DB_FILE" "VACUUM;"
sqlite3 "$DB_FILE" "ANALYZE;"
sqlite3 "$DB_FILE" "REINDEX;"
# Remove old entries (90 days)
sqlite3 "$DB_FILE" "DELETE FROM logs WHERE timestamp < datetime('now', '-90 days');"
# Start TeamSpeak
systemctl start teamspeak3
echo "Database maintenance completed"
#!/bin/bash
# teamspeak_restore.sh
BACKUP_FILE="$1"
TS_DIR="/opt/teamspeak3-server_linux_amd64"
if [ -z "$BACKUP_FILE" ]; then
echo "Usage: $0 "
exit 1
fi
echo "Starting TeamSpeak recovery from: $BACKUP_FILE"
# Stop TeamSpeak
systemctl stop teamspeak3
# Create backup of current state
cp "$TS_DIR/ts3server.sqlitedb" "$TS_DIR/ts3server.sqlitedb.recovery_backup.$(date +%Y%m%d_%H%M%S)"
# Extract backup
cd "$TS_DIR"
tar -xzf "$BACKUP_FILE"
# Restore files
if [ -f "backup_*/ts3server.sqlitedb" ]; then
mv "backup_*/ts3server.sqlitedb" "$TS_DIR/"
fi
if [ -f "backup_*/ts3server.ini" ]; then
mv "backup_*/ts3server.ini" "$TS_DIR/"
fi
if [ -d "backup_*/files" ]; then
rm -rf "$TS_DIR/files"
mv "backup_*/files" "$TS_DIR/"
fi
# Set correct permissions
chown -R teamspeak:teamspeak "$TS_DIR"
chmod 644 "$TS_DIR/ts3server.sqlitedb"
chmod 644 "$TS_DIR/ts3server.ini"
# Start TeamSpeak
systemctl start teamspeak3
echo "Recovery completed"
#!/bin/bash
# restore_permissions.sh
BACKUP_DB="$1"
CURRENT_DB="/opt/teamspeak3-server_linux_amd64/ts3server.sqlitedb"
if [ -z "$BACKUP_DB" ]; then
echo "Usage: $0 "
exit 1
fi
# Export permissions from backup
sqlite3 "$BACKUP_DB" ".dump permissions" > /tmp/permissions.sql
# Import permissions to current database
sqlite3 "$CURRENT_DB" < /tmp/permissions.sql
echo "Permissions restored"
#!/bin/bash
# restore_files.sh
BACKUP_DIR="$1"
TS_DIR="/opt/teamspeak3-server_linux_amd64"
if [ -z "$BACKUP_DIR" ]; then
echo "Usage: $0 "
exit 1
fi
# Restore uploaded files
cp -r "$BACKUP_DIR/serverquerydocs/"* "$TS_DIR/serverquerydocs/"
cp -r "$BACKUP_DIR/files/"* "$TS_DIR/files/"
# Set permissions
chown -R teamspeak:teamspeak "$TS_DIR/serverquerydocs"
chown -R teamspeak:teamspeak "$TS_DIR/files"
echo "Files restored"
Service Level Agreements
- RPO (Recovery Point Objective): Maximum 1 hour data loss
- RTO (Recovery Time Objective): Maximum 30 minutes downtime
- Backup Frequency: Every 15 minutes for database, daily for full
- Retention Period: 30 days for daily, 1 year for weekly
Critical Failure Response
- Immediate Assessment: Identify failure scope and impact
- Communication: Notify users and stakeholders
- Isolation: Prevent further damage to systems
- Recovery Initiation: Begin restoration process
- Verification: Test restored systems thoroughly
- Documentation: Record incident and lessons learned
#!/bin/bash
# backup_monitor.sh
BACKUP_DIR="/home/backups/teamspeak"
ALERT_EMAIL="admin@example.com"
MAX_AGE_HOURS=24
# Check for recent backup
LATEST_BACKUP=$(ls -t "$BACKUP_DIR"/teamspeak_backup_*.tar.gz | head -1)
BACKUP_AGE=$(( ($(date +%s) - $(stat -c %Y "$LATEST_BACKUP")) / 3600 ))
if [ "$BACKUP_AGE" -gt "$MAX_AGE_HOURS" ]; then
echo "ALERT: TeamSpeak backup is $BACKUP_AGE hours old" | \
mail -s "TeamSpeak Backup Alert" "$ALERT_EMAIL"
fi
# Check backup file integrity
tar -tzf "$LATEST_BACKUP" > /dev/null
if [ $? -ne 0 ]; then
echo "ALERT: TeamSpeak backup corruption detected" | \
mail -s "TeamSpeak Backup Alert" "$ALERT_EMAIL"
fi
❌ Database Lock Error
TeamSpeak server must be stopped during backup to prevent database corruption.
❌ Permission Denied
Ensure backup script runs with proper permissions to access TeamSpeak files.
❌ Disk Space Full
Monitor available disk space and implement cleanup policies for old backups.
❌ Network Timeout
For remote backups, implement retry logic and timeout handling.
Pro Tip: Always test backup recovery procedures before implementing them in production to ensure they work as expected.