Complete Guide: Setting Up Sons Of The Forest Server with Pangolin
This guide will walk you through setting up a dedicated Sons Of The Forest (SOTF) game server and exposing it securely to the internet using Pangolin tunneling solution.
Table of Contents
-
Prerequisites
-
Part 1: Server Preparation
-
Part 2: Pangolin Installation
-
Part 3: SOTF Server Setup
-
Part 4: Configuring Traefik for UDP Ports
-
Part 5: Newt Tunnel Configuration
-
Part 6: Exposing SOTF Ports via Pangolin
-
Part 7: Server Configuration
-
Part 8: Testing and Connection
-
Troubleshooting
Prerequisites
Before starting, ensure you have:
-
Server/VPS: A Linux server with at least 8GB RAM (16GB recommended)
-
Operating System: Ubuntu 20.04/22.04 or Debian 11/12
-
Docker and Docker Compose: Installed on your server
-
Domain Name: A registered domain pointed to your server
-
Open Ports: The following ports must be open on your server firewall:
-
TCP: 80, 443 (for web traffic)
-
UDP: 51820, 21820 (for Pangolin tunneling)
-
UDP: 8766, 27016, 9700 (for SOTF game server)
-
-
Pangolin Account: Sign up at pangolin.io
-
Sons Of The Forest: Game copy on Steam (for testing)
-
Storage: At least 20GB free space for server files
Part 1: Server Preparation
Step 1: Connect to Your Server
ssh user@your-server-ip
Step 2: Install Docker (if not already installed)
# Update package list
sudo apt update
# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Add your user to docker group
sudo usermod -aG docker $USER
# Log out and back in for group changes
exit
ssh user@your-server-ip
Step 3: Install Docker Compose
# Download Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# Make it executable
sudo chmod +x /usr/local/bin/docker-compose
# Verify installation
docker compose --version
Step 4: Configure Firewall
# Using ufw (Ubuntu/Debian)
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 51820/udp # Pangolin
sudo ufw allow 21820/udp # Pangolin
sudo ufw allow 8766/udp # SOTF Game
sudo ufw allow 27016/udp # SOTF Query
sudo ufw allow 9700/udp # SOTF Steam
# Enable firewall
sudo ufw enable
# Verify rules
sudo ufw status
Expected output:
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
51820/udp ALLOW Anywhere
21820/udp ALLOW Anywhere
8766/udp ALLOW Anywhere
27016/udp ALLOW Anywhere
9700/udp ALLOW Anywhere
Part 2: Pangolin Installation
Step 1: Install Pangolin Base
cd ~
mkdir pangolin
cd pangolin
# Download and run the Pangolin installer
curl -fsSL https://get.pangolin.io | bash
Step 2: Configure Pangolin Installation
Follow the installer prompts:
-
Choose Docker as the container type
-
Enter your base domain (e.g.,
example.com) -
Enter dashboard subdomain (e.g.,
pangolin.example.com) -
Enter email for Let’s Encrypt certificates
-
Configure email settings (optional, can skip)
-
Choose to install Gerbil (recommended: yes)
Step 3: Verify Pangolin Installation
docker ps
You should see containers:
-
pangolin
-
gerbil
-
traefik
Part 3: SOTF Server Setup
Step 1: Create Project Directory
cd ~
mkdir sotf-server
cd sotf-server
Step 2: Create Directory Structure
mkdir -p config data container-data
Step 3: Create Dockerfile for SOTF Server
nano container-data/Containerfile
Add the following content:
FROM rouhim/sons-of-the-forest-server:latest
# Additional configurations can be added here if needed
Step 4: Create Docker Compose File
nano docker-compose.yml
Add the following configuration:
services:
sotf_newt:
image: ghcr.io/fosrl/newt:latest
container_name: sotf_newt
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- PANGOLIN_ENDPOINT=https://pangolin.your-domain.com # Update this
- NEWT_ID=XXXXXXX # Will be replaced later
- NEWT_SECRET=XXXXXXX # Will be replaced later
- DOCKER_SOCKET=/var/run/docker.sock
- ACCEPT_CLIENTS=true
networks:
- pangolin
sons-of-the-forest-dedicated-server:
container_name: sons-of-the-forest-dedicated-server
image: jammsen/sons-of-the-forest-dedicated-server:latest
restart: always
environment:
PUID: 1000
PGID: 1000
ALWAYS_UPDATE_ON_START: true
SKIP_NETWORK_ACCESSIBILITY_TEST: true
volumes:
- ./game:/sonsoftheforest
ports:
- "0.0.0.0:8766:8766/udp"
- "0.0.0.0:27016:27016/udp"
- "0.0.0.0:9700:9700/udp"
logging:
driver: "json-file"
options:
max-size: "50m"
networks:
- pangolin
networks:
pangolin:
external: true
Part 4: Configuring Traefik for UDP Ports
Step 1: Edit Traefik Configuration
cd ~/pangolin
nano config/traefik/traefik_config.yml
Step 2: Add SOTF UDP Entrypoints
Make sure your entryPoints section includes:
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
websecure:
address: ":443"
transport:
respondingTimeouts:
readTimeout: "30m"
http:
tls:
certResolver: "letsencrypt"
# Sons Of The Forest UDP ports
udp-27016:
address: ":27016/udp"
udp-9700:
address: ":9700/udp"
udp-8766:
address: ":8766/udp"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
file:
directory: "/etc/traefik/dynamic"
watch: true
http:
endpoint: "http://pangolin:3001/api/v1/traefik-config"
pollInterval: "5s"
certificatesResolvers:
letsencrypt:
acme:
email: your-email@example.com # Update this
storage: /letsencrypt/acme.json
httpChallenge:
entryPoint: web
Step 3: Update Gerbil Port Mappings
nano docker-compose.yml
Ensure the gerbil service has the SOTF ports:
gerbil:
image: docker.io/fosrl/gerbil:latest
container_name: gerbil
ports:
- 51820:51820/udp
- 21820:21820/udp
- 443:443
- 80:80
- 27016:27016/udp # SOTF Query Port
- 9700:9700/udp # SOTF Steam Port
- 8766:8766/udp # SOTF Game Port
Step 4: Enable Raw Resources
nano config/config.yml
Add or ensure this flag is set:
flags:
allow_raw_resources: true
Step 5: Restart Pangolin Stack
docker compose down
docker compose up -d
Part 5: Newt Tunnel Configuration
Step 1: Access Pangolin Dashboard
Navigate to:
https://pangolin.your-domain.com
Step 2: Create Organization (if needed)
-
Click “Create Organization”
-
Enter organization name (e.g., “Gaming”)
-
Click “Create”
Step 3: Create Site
-
Go to “Sites” tab
-
Click “Add Site”
-
Enter site name (e.g., “SOTF-Server”)
-
Click “Create Site”
Step 4: Get Newt Credentials
-
Click on your newly created site
-
Copy the NEWT_ID and NEWT_SECRET values
-
Note the PANGOLIN_ENDPOINT URL
Step 5: Update Docker Compose with Newt Credentials
cd ~/sotf-server
nano docker-compose.yml
Replace the placeholder values:
environment:
- PANGOLIN_ENDPOINT=https://pangolin.your-domain.com
- NEWT_ID=your-actual-newt-id
- NEWT_SECRET=your-actual-newt-secret
Step 6: Start SOTF Server Stack
docker compose up -d
Step 7: Verify Newt Connection
docker logs sotf_newt
You should see: “Successfully connected to Pangolin endpoint”
Part 6: Exposing SOTF Ports via Pangolin
Step 1: Create Resource for Port 8766 (Game Port)
In Pangolin Dashboard:
-
Go to “Resources” tab
-
Click “Add Resource”
-
Configure:
-
Name: SOTF-Game
-
Type: HTTP Resource (toggle OFF for UDP)
-
Protocol: UDP
-
Port Number: 8766
-
Site: Select “SOTF-Server”
-
-
Click “Create Resource”
Step 2: Configure Target for Port 8766
-
In the resource settings page
-
Under “Target Configuration”, add:
-
IP/Hostname: sotf_server
-
Port: 8766
-
-
Click “Save Targets”
Step 3: Create Resource for Port 27016 (Query Port)
-
Click “Add Resource”
-
Configure:
-
Name: SOTF-Query
-
Type: HTTP Resource (toggle OFF)
-
Protocol: UDP
-
Port Number: 27016
-
Site: Select “SOTF-Server”
-
-
Click “Create Resource”
-
Add target:
-
IP/Hostname: sotf_server
-
Port: 27016
-
-
Click “Save Targets”
Step 4: Create Resource for Port 9700 (Steam Port)
-
Click “Add Resource”
-
Configure:
-
Name: SOTF-Steam
-
Type: HTTP Resource (toggle OFF)
-
Protocol: UDP
-
Port Number: 9700
-
Site: Select “SOTF-Server”
-
-
Click “Create Resource”
-
Add target:
-
IP/Hostname: sotf_server
-
Port: 9700
-
-
Click “Save Targets”
Part 7: Server Configuration
Step 1: Create Server Configuration File
cd ~/sotf-server
nano config/dedicatedserver.cfg
Add your server configuration:
{
"ServerName": "My SOTF Pangolin Server",
"MaxPlayers": 8,
"Password": "",
"LanOnly": false,
"SaveSlot": 1,
"SaveMode": "Continue",
"GameMode": "Normal",
"SaveInterval": 600,
"IdleDayCycleSpeed": 0.0,
"IdleTargetFramerate": 5,
"ActiveTargetFramerate": 60,
"LogFilesEnabled": false,
"TimestampLogFilenames": true,
"TimestampLogEntries": true,
"SkipNetworkAccessibilityTest": false,
"GameSettings": {
"Difficulty": "Normal",
"TreeRegrowth": true,
"BuildingDestruction": true,
"EnemiesEnabled": true,
"EnemyAggression": "Normal",
"EnemyArmour": "Normal",
"EnemyHealthMultiplier": "Normal",
"EnemyDamageMultiplier": "Normal",
"EnemyRespawnMultiplier": "Normal",
"AnimalSpawnRate": "Normal"
},
"CustomGameModeSettings": {}
}
Step 2: Configure Server Permissions (Optional)
nano config/ownerswhitelist.txt
Add Steam IDs of server admins (one per line):
76561198000000000
76561198000000001
Step 3: Set Environment Variables
Update docker-compose.yml with server settings:
environment:
FAST_BOOT: "true"
SERVER_NAME: "My SOTF Pangolin Server"
MAX_PLAYERS: "8"
PASSWORD: "myserverpass" # Optional
SAVE_INTERVAL: "600"
SERVER_PORT: "8766"
QUERY_PORT: "27016"
STEAM_PORT: "9700"
Step 4: Restart Server with Configuration
docker compose down
docker compose up -d
Part 8: Testing and Connection
Step 1: Verify Server is Running
docker logs sotf_server
Look for messages indicating the server has started successfully.
Step 2: Check Port Accessibility
# Test UDP ports locally
nc -u -v localhost 8766
nc -u -v localhost 27016
nc -u -v localhost 9700
Step 3: Get Your Server Connection Info
Your server will be accessible at:
Server IP: your-org.pangolin.io
Game Port: 8766
Query Port: 27016
Step 4: Connect via Sons Of The Forest
Method 1: Direct Connection
-
Launch Sons Of The Forest
-
Click “Multiplayer”
-
Click “Join”
-
Click “Dedicated”
-
Enter IP:
your-org.pangolin.io:8766
Method 2: Server Browser
Your server should appear in the server browser if configured correctly. Look for your server name.
Method 3: Steam Server Browser
-
Open Steam
-
View → Servers
-
Add server:
your-org.pangolin.io:27016
Step 5: Verify Connection
Once connected, verify:
-
Player can join successfully
-
Game saves properly
-
No connection timeouts
-
Check server logs for player activity
Troubleshooting
Server Not Starting
# Check logs
docker logs sotf_server -f
# Verify container status
docker ps -a
# Check disk space
df -h
Cannot Connect to Server
- Verify UDP ports are open:
sudo netstat -tulnp | grep -E '8766|27016|9700'
- Check Traefik logs:
docker logs traefik | grep -E '8766|27016|9700'
- Verify Newt tunnel:
docker logs sotf_newt
- Test port forwarding:
# From another machine
nc -u -v your-org.pangolin.io 8766
Server Shows Offline in Browser
-
Ensure Query Port (27016) is properly configured
-
Check that all three UDP ports are exposed
-
Verify
SkipNetworkAccessibilityTestis set to false
Performance Issues
- Increase server resources:
services:
sons-of-the-forest-server:
mem_limit: 8g
cpus: '4.0'
- Optimize server settings:
{
"IdleTargetFramerate": 5,
"ActiveTargetFramerate": 30,
"LogFilesEnabled": false
}
- Monitor resource usage:
docker stats sotf_server
Save Game Issues
# Check save directory permissions
ls -la ~/sotf-server/data/
# Fix permissions if needed
sudo chown -R 1000:1000 ~/sotf-server/data/
Server Crashes
# Check system logs
dmesg | tail -50
# Increase container restart delay
nano docker-compose.yml
# Add under restart policy:
restart: unless-stopped
deploy:
restart_policy:
delay: 10s
Maintenance
Backup Server Data
#!/bin/bash
# Create backup script
cat > backup-sotf.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/home/user/sotf-backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
tar -czf "$BACKUP_DIR/sotf-backup-$DATE.tar.gz" -C /home/user/sotf-server data/ config/
# Keep only last 7 days of backups
find $BACKUP_DIR -name "sotf-backup-*.tar.gz" -mtime +7 -delete
EOF
chmod +x backup-sotf.sh
# Add to crontab (daily at 3 AM)
crontab -e
# Add line:
0 3 * * * /home/user/backup-sotf.sh
Update Server
cd ~/sotf-server
# Pull latest image
docker compose pull sons-of-the-forest-server
# Backup before update
./backup-sotf.sh
# Restart with new image
docker compose down
docker compose up -d
Monitor Server Health
# Create monitoring script
cat > monitor-sotf.sh << 'EOF'
#!/bin/bash
if ! docker ps | grep -q sotf_server; then
echo "SOTF Server is down! Restarting..."
cd /home/user/sotf-server
docker-compose up -d
fi
EOF
chmod +x monitor-sotf.sh
# Add to crontab (check every 5 minutes)
*/5 * * * * /home/user/monitor-sotf.sh
Security Recommendations
-
Use Strong Passwords: Always set a server password for public servers
-
Whitelist Admins: Use ownerswhitelist.txt for admin control
-
Regular Backups: Implement automated backup strategy
-
Monitor Logs: Regularly check for suspicious activity
-
Update Regularly: Keep Docker images and server updated
-
Resource Limits: Set Docker resource limits to prevent DoS
-
Firewall Rules: Only open required ports
-
Access Control: Use Pangolin’s authentication features if needed
Performance Tuning
For Large Servers (16+ players)
environment:
ActiveTargetFramerate: "30"
IdleTargetFramerate: "5"
LogFilesEnabled: "false"
Network Optimization
environment:
NETWORK_QUALITY: "3" # 0=Low, 3=Ultra
NETWORK_BUFFER_SIZE: "2048"
Conclusion
You now have a fully functional Sons Of The Forest dedicated server running through Pangolin’s secure tunneling system! Your server is accessible via your custom domain and all three UDP ports (8766, 27016, 9700) are properly exposed for full game functionality.
Remember that UDP traffic cannot use proxy protocol, so all players will appear to connect from the same IP (the proxy). This is normal behavior and doesn’t affect gameplay.
For support and updates:
-
SOTF Server Image: jammsendocker-sons-of-the-forest-dedicated-server
-
Pangolin Documentation: docs.pangolin.io
-
Game Updates: Check Steam for Sons Of The Forest updates