7 Days to Die Server on Linux

7 Days to Die is a survival game combining scavenging, crafting, and tower-defense elements. This guide covers complete server installation using SteamCMD, configuration through serverconfig.xml, world generation and seed management, port configuration, admin functions, performance optimization, and systemd management. 7 Days servers are moderately resource-intensive and require careful tuning for optimal multiplayer performance.

Table of Contents

System Requirements

7 Days to Die servers require adequate resources:

  • Ubuntu 20.04 LTS or CentOS 7+
  • 8GB RAM minimum (16GB recommended for 50+ players)
  • 60GB+ disk space (SSD recommended)
  • 4+ CPU cores
  • Stable internet connection
  • Root or sudo access

Server performance heavily depends on world size and player count.

Installing SteamCMD and 7 Days Server

Install system dependencies:

sudo apt-get update
sudo apt-get install -y curl wget file bzip2 gzip unzip python3 util-linux ca-certificates binutils lib32gcc1 lib32stdc++6

Create dedicated steam user:

sudo useradd -m -s /bin/bash steam
sudo -u steam mkdir -p /home/steam/steamcmd

Install SteamCMD:

cd /home/steam/steamcmd
sudo -u steam curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | sudo -u steam tar zxvf -

Verify SteamCMD:

sudo -u steam /home/steam/steamcmd/steamcmd.sh +quit

Create 7 Days directory:

sudo -u steam mkdir -p /home/steam/7dtd

Install 7 Days to Die server (app ID 294420). This takes 15+ minutes:

sudo -u steam /home/steam/steamcmd/steamcmd.sh \
    +force_install_dir /home/steam/7dtd \
    +login anonymous \
    +app_update 294420 \
    +quit

Verify installation:

ls -la /home/steam/7dtd/
file /home/steam/7dtd/7DaysToDieServer.x86_64

Create data directories:

sudo -u steam mkdir -p /home/steam/7dtd-data/{Saves,Logs}

Server Configuration

Create startup script:

sudo tee /home/steam/7dtd/start_server.sh > /dev/null <<'EOF'
#!/bin/bash

GAME_DIR="/home/steam/7dtd"
DATA_DIR="/home/steam/7dtd-data"
WORLD_NAME="${WORLD_NAME:-Navezgane}"
MAX_PLAYERS="${MAX_PLAYERS:-8}"
SERVER_PORT="${SERVER_PORT:-26900}"
QUERY_PORT="${QUERY_PORT:-26900}"

cd "$GAME_DIR"

mkdir -p "$DATA_DIR/Saves"
mkdir -p "$DATA_DIR/Logs"

exec "$GAME_DIR/7DaysToDieServer.x86_64" \
    -configfile="$DATA_DIR/serverconfig.xml" \
    -savedir "$DATA_DIR/Saves" \
    -serverport "$SERVER_PORT" \
    -queryport "$QUERY_PORT" \
    2>&1 | tee "$DATA_DIR/Logs/7dtd_$(date +%Y%m%d).log"
EOF

sudo chmod +x /home/steam/7dtd/start_server.sh
sudo chown steam:steam /home/steam/7dtd/start_server.sh

Serverconfig.xml Setup

Create comprehensive server configuration:

sudo tee /home/steam/7dtd-data/serverconfig.xml > /dev/null <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<ServerSettings>
    <property name="ServerName" value="My 7 Days Server" />
    <property name="ServerDescription" value="Cooperative survival server" />
    <property name="ServerPassword" value="" />
    <property name="ServerAdminPassword" value="adminpass123" />
    <property name="ServerPort" value="26900" />
    <property name="QueryPort" value="26901" />
    <property name="ServerIsPublic" value="true" />
    <property name="GameWorld" value="Navezgane" />
    <property name="GameName" value="My Game" />
    <property name="GameDifficulty" value="2" />
    <property name="MaxPlayers" value="8" />
    <property name="PersistentPlayerProfiles" value="true" />
    <property name="PlayerKillingMode" value="3" />
    <property name="ControlPanelEnabled" value="false" />
    <property name="ControlPanelPort" value="8080" />
    <property name="TelnetEnabled" value="true" />
    <property name="TelnetPort" value="8081" />
    <property name="TelnetPassword" value="telnetpass" />
    <property name="TerminalWindowEnabled" value="true" />
    
    <!-- Gameplay Settings -->
    <property name="DayNightLength" value="60" />
    <property name="DayLightLength" value="18" />
    <property name="DropOnDeath" value="1" />
    <property name="DropOnQuit" value="1" />
    <property name="BedrollDeadZoneSize" value="10" />
    <property name="AllowCheats" value="false" />
    <property name="LandClaimSize" value="41" />
    <property name="LandClaimDeadZone" value="30" />
    <property name="LandClaimExpiryTime" value="3" />
    <property name="SafeZoneLevel" value="5" />
    
    <!-- Performance Settings -->
    <property name="MaxSpawnedZombies" value="64" />
    <property name="MaxSpawnedAnimals" value="50" />
    <property name="ResetHWAccel" value="true" />
    <property name="EAC" value="true" />
    <property name="SaveGameFolder" value="" />
    
    <!-- Voice Communication -->
    <property name="VoiceEnabled" value="true" />
    
    <!-- Admin & Moderation -->
    <property name="BanAdmins" value="true" />
    <property name="AdminFileName" value="admin.xml" />
    <property name="UserDataFolder" value="" />
</ServerSettings>
EOF

sudo chown steam:steam /home/steam/7dtd-data/serverconfig.xml

Configuration options explained:

  • GameWorld: Map to use (Navezgane, random seed number, or custom)
  • GameDifficulty: 0=Scavenger, 1=Nomad, 2=Survivor, 3=Hardcore, 4=Nightmare
  • MaxPlayers: Maximum concurrent players (8, 16, 32, 64)
  • PlayerKillingMode: 0=No PvP, 1=Kill Allowed, 2=Kill Friendly, 3=Kill All
  • LandClaimSize: Land protection area (smaller = less CPU intensive)
  • MaxSpawnedZombies: Maximum zombies in world (higher = more challenging but resource-heavy)
  • TelnetEnabled: Enable remote console access
  • EAC: Easy Anti-Cheat enabled

World Generation

Configure world generation options:

sudo tee /home/steam/7dtd-data/world-gen-settings.xml > /dev/null <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<WorldGenSettings>
    <!-- Map Settings -->
    <WorldName value="CustomWorld" />
    <Seed value="0" />
    <WorldSize value="512" />
    
    <!-- Terrain Generation -->
    <TerrainRadius value="256" />
    <HeightScale value="60" />
    <TerrainScale value="32" />
    
    <!-- POI (Points of Interest) -->
    <POIMaxDistance value="1000" />
    <POIMinDistance value="100" />
    <POIDensity value="5" />
    
    <!-- Biome Settings -->
    <BiomesScale value="128" />
    <BiomesBlend value="32" />
    
    <!-- Water Settings -->
    <WaterLevel value="32" />
</WorldGenSettings>
EOF

sudo chown steam:steam /home/steam/7dtd-data/world-gen-settings.xml

Create new world with custom seed:

# Stop server
sudo systemctl stop 7dtd.service

# Delete old world
rm -rf /home/steam/7dtd-data/Saves/Navezgane

# Server will generate new world on next start with provided seed
# Modify serverconfig.xml GameWorld value to: RandomSeed123456

sudo systemctl start 7dtd.service

Admin and Moderation

Create admin configuration file:

sudo tee /home/steam/7dtd-data/admin.xml > /dev/null <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<AdminTools>
    <permission name="kick">
        <require_permission name="admin" />
    </permission>
    <permission name="ban">
        <require_permission name="admin" />
    </permission>
    <permission name="unban">
        <require_permission name="admin" />
    </permission>
    <permission name="say">
        <require_permission name="moderator" />
    </permission>
    <permission name="teleport">
        <require_permission name="admin" />
    </permission>
    <permission name="give">
        <require_permission name="admin" />
    </permission>
    <permission name="god">
        <require_permission name="admin" />
    </permission>
    <permission name="heal">
        <require_permission name="admin" />
    </permission>
    
    <!-- Define admin users -->
    <user steamid="76561198000000000" name="AdminName" permission_level="0" />
    <user steamid="76561198000000001" name="ModeratorName" permission_level="1" />
</AdminTools>
EOF

sudo chown steam:steam /home/steam/7dtd-data/admin.xml

Common admin commands (via Telnet console):

# Player management
kick playername reason
ban playername
unban playername
banlist
adminadd playername

# Server control
say "Message to all players"
pm playername "Private message"
teleport playername x y z

# Game control
kick-inactive 5           # Kick players inactive 5+ days
reset-land-protections   # Reset all land claims
remove-land-claim x y    # Remove specific claim

# Info commands
players                  # List all players
list-players            # Show player IDs
listknown               # Show known players
getgameinfo             # Server info
stats                   # Show statistics

# Difficulty commands
setgamedifficulty 3     # Change difficulty (0-4)

Connect to Telnet console:

telnet localhost 8081
# Enter password when prompted
help  # Show all available commands
quit  # Disconnect

Port Configuration

7 Days to Die uses specific ports:

# Game port (UDP)
GAME_PORT=26900

# Query port (UDP)
QUERY_PORT=26901

# Telnet console (TCP)
TELNET_PORT=8081

# Control panel (TCP, if enabled)
CONTROL_PANEL_PORT=8080

# Configure firewall
sudo ufw allow 26900/udp
sudo ufw allow 26901/udp
sudo ufw allow 8081/tcp
sudo ufw allow 8080/tcp

# For iptables
sudo iptables -A INPUT -p udp --dport 26900 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 26901 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8081 -j ACCEPT

# Verify ports
sudo netstat -tulnp | grep -E "26900|26901|8081"

Running with Systemd

Create systemd service:

sudo tee /etc/systemd/system/7dtd.service > /dev/null <<'EOF'
[Unit]
Description=7 Days to Die Server
After=network.target
Wants=network-online.target

[Service]
Type=simple
User=steam
Group=steam
WorkingDirectory=/home/steam/7dtd
EnvironmentFile=/home/steam/7dtd/server.env

ExecStart=/home/steam/7dtd/start_server.sh

Restart=on-failure
RestartSec=15
StandardOutput=journal
StandardError=journal

# Resource limits
LimitNOFILE=65536
LimitNPROC=16384
MemoryMax=20G

# Security
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/home/steam/7dtd-data

[Install]
WantedBy=multi-user.target
EOF

Create environment file:

sudo tee /home/steam/7dtd/server.env > /dev/null <<'EOF'
WORLD_NAME=Navezgane
MAX_PLAYERS=8
SERVER_PORT=26900
QUERY_PORT=26901
EOF

sudo chown steam:steam /home/steam/7dtd/server.env
sudo chmod 600 /home/steam/7dtd/server.env

Enable and start:

sudo systemctl daemon-reload
sudo systemctl enable 7dtd.service
sudo systemctl start 7dtd.service
sudo systemctl status 7dtd.service

Monitor logs:

sudo journalctl -u 7dtd.service -f
tail -f /home/steam/7dtd-data/Logs/7dtd_$(date +%Y%m%d).log

Performance Optimization

Optimize system for 7 Days performance:

# Increase file limits
sudo sysctl -w fs.file-max=2097152
echo "fs.file-max=2097152" | sudo tee -a /etc/sysctl.conf

# Network optimization
sudo sysctl -w net.core.rmem_max=134217728
sudo sysctl -w net.core.wmem_max=134217728

# UDP optimization
sudo sysctl -w net.core.rmem_default=131072
sudo sysctl -w net.core.wmem_default=131072

# Apply changes
sudo sysctl -p

Monitor performance:

# CPU and memory usage
watch -n 1 'ps aux | grep 7DaysToDieServer | grep -v grep'
htop -p $(pgrep -f 7DaysToDieServer)

# Detailed process info
ps -o pid,vsz,rss,pcpu,pmem,comm $(pgrep -f 7DaysToDieServer)

# Disk I/O
iostat -x 1

# Network stats
iftop -i eth0

Reduce resource consumption:

# Lower MaxSpawnedZombies in serverconfig.xml
# Reduce LandClaimSize for faster performance
# Lower MaxPlayers if CPU becomes bottleneck

Backup and Recovery

Create automated backup script:

sudo tee /home/steam/backup_7dtd.sh > /dev/null <<'EOF'
#!/bin/bash

DATA_DIR="/home/steam/7dtd-data"
BACKUP_DIR="$DATA_DIR/backups"
RETENTION_DAYS=30
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

mkdir -p "$BACKUP_DIR"

# Backup world saves
tar -czf "$BACKUP_DIR/7dtd_backup_${TIMESTAMP}.tar.gz" \
    -C "$DATA_DIR" Saves/ \
    2>/dev/null

if [ $? -eq 0 ]; then
    SIZE=$(du -sh "$BACKUP_DIR/7dtd_backup_${TIMESTAMP}.tar.gz" | awk '{print $1}')
    echo "[$(date)] Backup created: $SIZE"
else
    echo "[$(date)] Backup failed!" >&2
    exit 1
fi

# Cleanup old backups
find "$BACKUP_DIR" -name "7dtd_backup_*.tar.gz" -mtime +${RETENTION_DAYS} -delete
EOF

sudo chmod +x /home/steam/backup_7dtd.sh
sudo chown steam:steam /home/steam/backup_7dtd.sh

Add to crontab:

sudo tee -a /var/spool/cron/crontabs/steam > /dev/null <<'EOF'
0 2 * * * /home/steam/backup_7dtd.sh >> /home/steam/7dtd-data/Logs/backup.log 2>&1
EOF

Restore backup:

sudo systemctl stop 7dtd.service
BACKUP="/home/steam/7dtd-data/backups/7dtd_backup_20240101_020000.tar.gz"
sudo -u steam tar -xzf "$BACKUP" -C /home/steam/7dtd-data/
sudo systemctl start 7dtd.service

Monitoring

Create monitoring script:

sudo tee /home/steam/monitor_7dtd.sh > /dev/null <<'EOF'
#!/bin/bash

echo "=== 7 Days to Die Server Status ==="
echo ""

# Service status
if systemctl is-active --quiet 7dtd.service; then
    echo "✓ Service is running"
else
    echo "✗ Service is NOT running"
    exit 1
fi

# Process info
PID=$(pgrep -f 7DaysToDieServer)
if [ ! -z "$PID" ]; then
    MEM=$(ps -p $PID -o rss= | awk '{print $1/1024 " MB"}')
    CPU=$(ps -p $PID -o %cpu= | awk '{print $1 "%"}')
    echo "Memory: $MEM"
    echo "CPU: $CPU"
fi

# Port status
echo ""
if ss -ulnp | grep -q "26900"; then
    echo "✓ Game port 26900 listening"
else
    echo "✗ Game port not listening"
fi

# Disk usage
echo ""
USAGE=$(df -h /home/steam/7dtd-data | awk 'NR==2 {print $5}')
echo "Disk usage: $USAGE"

# Recent errors
echo ""
ERRORS=$(tail -20 /home/steam/7dtd-data/Logs/7dtd_*.log 2>/dev/null | grep -i "error\|fatal" | wc -l)
echo "Recent errors: $ERRORS"
EOF

sudo chmod +x /home/steam/monitor_7dtd.sh

Conclusion

Your 7 Days to Die server is now fully configured with admin controls, world generation support, and automated backups. 7 Days to Die provides intense survival experiences with horde mechanics and cooperative gameplay.

Key takeaways:

  • Configure difficulty and zombie spawning for your community
  • Use Telnet console for easy admin management
  • Implement regular backups before major updates
  • Monitor server performance, especially zombie count
  • Keep server updated with latest patches
  • Use land claims to protect player creations
  • Plan world resets periodically to refresh gameplay

A well-maintained 7 Days server can support engaging long-term survival experiences for your player community.