想和朋友长期玩 7 Days to Die(七日杀),最烦的通常不是装游戏,而是房主下线后世界也跟着停、血月前突然更新、随机地图生成到一半内存爆掉。把专用服务器放在 VPS 上,世界和角色数据独立保存,队友不需要等房主上线,备份与维护也更可控。
本文以 Ubuntu 24.04 LTS、SteamCMD、当前 V3.1 稳定分支和 systemd 为例,从零安装七日杀专用服务器,配置 serverconfig.xml、26900 端口、随机地图、管理员、离线备份、恢复和自动更新。所有管理接口默认不暴露公网,正文也不使用来源不明的 Docker 镜像或整合包。
截至 2026 年 8 月,The Fun Pimps 已发布 V3.1.0 Henpocalypse 稳定版。官方还特别提醒:专用服务器连不上时,应确认服务器选择的是 Default Public Version,也就是当前 V3.1.0 稳定分支。
所以新服务器不需要添加 latest_experimental 或旧 Alpha 分支参数。客户端与服务端必须使用兼容版本;如果队友留在实验分支,而服务器走默认稳定分支,最常见的结果就是版本不匹配或无法加入。
V3.1 调整了昼夜敌人与动物密度、刷新率等沙盒选项,旧预设代码可能失效。升级已有服务器前先备份,不要在唯一存档上直接测试。本文按新服务器设计,已有 V2.6/V3.0 世界应先在副本上验证。
官方支持 FAQ 给出的最低起点是四核 2.8GHz、8GB 内存和 20GB 可用空间,推荐四核 3.2GHz、16GB 内存。它同时提醒,大型随机地图本身可能占用约 15GB,玩家越多,内存和带宽需求越高。
下面是更适合购买 VPS 时使用的起步建议,不是性能保证:
| 场景 | 建议配置起点 | 磁盘 | 说明 |
|---|---|---|---|
| 2–4 人 Navezgane 原版服 | 4 个高性能 vCPU、8GB 内存 | 50GB NVMe | 适合小队长期档 |
| 4–8 人 6144 随机地图 | 4–6 个高性能 vCPU、16GB 内存 | 80GB NVMe | 留出地图生成与血月余量 |
| 8 人以上或模组服 | 6–8 个高性能核心、24GB+ 内存 | 120GB+ NVMe | 必须按实际峰值压测 |
七日杀对单核性能、内存和磁盘延迟都敏感。不要只看“8 核”字样,超售严重的廉价节点在生成地图、加载新区块或血月时很容易卡顿。购买前可先看游戏服务器 VPS 配置与线路选择。
| 方案 | 优点 | 代价 | 适合谁 |
|---|---|---|---|
| SteamCMD + systemd | 路径透明、更新直接、额外开销低 | 主要通过 SSH 管理 | 单台 VPS、一个服务器 |
| Docker 镜像 | 目录隔离、迁移方便 | 镜像版本、启动参数和权限多一层 | 已有可靠镜像维护流程 |
| Pterodactyl | Web 面板、多实例、配额和用户管理 | 需要维护 Panel、Wings、数据库 | 多游戏或多人运维 |
本文使用 SteamCMD + systemd,因为遇到版本、端口或存档问题时,能直接看到官方文件和日志。如果同一台机器还要运行 Minecraft、Rust 或 Project Zomboid,可以再考虑Pterodactyl 游戏服务器面板。
默认基础端口是 26900。官方支持 FAQ 当前列出的入站端口为:
| 端口 | 协议 | 用途 | 是否开放公网 |
|---|---|---|---|
| 26900 | TCP | 游戏详情查询 | 是 |
| 26900 | UDP | Steam 服务器列表 | 是 |
| 26901 | UDP | Steam 通信 | 是 |
| 26902 | UDP | LiteNetLib 游戏网络 | 是 |
| 26903 | UDP | 预留;不开放可能影响加入 | 是 |
| 8080 | TCP | Web Dashboard | 不直接开放,只走 SSH 隧道 |
| 8081 | TCP | Telnet 控制 | 默认关闭 |
因此防火墙最小规则是 26900/tcp 和 26900:26903/udp。不要为了省事开放全部高位端口,也不要把 Web Dashboard 或 Telnet 暴露给整个互联网。
如果改变 ServerPort,相关 UDP 端口也会跟着基础端口偏移。本文保持 26900,避免服务器配置、UFW 与云安全组三处数字不一致。
先更新系统并安装基础组件:
sudo apt update
sudo apt upgrade -y
sudo apt install -y curl ca-certificates tar lib32gcc-s1 ufw
创建不能使用密码直接登录的服务账号:
sudo adduser --system --group --home /home/sdtd --shell /bin/bash sdtd
sudo install -d -o sdtd -g sdtd /opt/steamcmd
sudo install -d -o sdtd -g sdtd /opt/7dtd-server
sudo install -d -o sdtd -g sdtd /srv/7dtd-data
sudo install -d -m 750 -o root -g sdtd /var/backups/7dtd
不要用 root 运行游戏。独立账号能限制服务权限,也能避免 SteamCMD 更新后产生 root 所有文件,导致下次更新或保存失败。
切换到 sdtd 用户,下载 Valve 官方 SteamCMD:
sudo -iu sdtd
cd /opt/steamcmd
curl -fsSL https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz \
-o steamcmd_linux.tar.gz
tar -xzf steamcmd_linux.tar.gz
./steamcmd.sh +quit
确认入口可执行:
test -x /opt/steamcmd/steamcmd.sh
7 Days to Die Dedicated Server 的 Steam App ID 是 294420。匿名登录即可下载:
/opt/steamcmd/steamcmd.sh \
+force_install_dir /opt/7dtd-server \
+login anonymous \
+app_update 294420 validate \
+quit
命令没有 -beta 参数,因此取得当前默认稳定分支。安装后检查关键文件:
test -x /opt/7dtd-server/startserver.sh
test -f /opt/7dtd-server/serverconfig.xml
grep -n 'buildid' /opt/7dtd-server/steamapps/appmanifest_294420.acf
du -sh /opt/7dtd-server
退出服务账号:
exit
SteamCMD 更新可能覆盖安装目录里的示例配置。先把当前版本自带的文件复制到数据目录:
sudo -u sdtd cp /opt/7dtd-server/serverconfig.xml \
/srv/7dtd-data/serverconfig.xml
sudo -u sdtd cp /srv/7dtd-data/serverconfig.xml \
/srv/7dtd-data/serverconfig.xml.initial
sudo -u sdtd nano /srv/7dtd-data/serverconfig.xml
只修改当前文件里已经存在的属性,不要用旧版教程整份覆盖。至少检查这些项目:
<property name="ServerName" value="My 7 Days to Die Server"/>
<property name="ServerDescription" value="Private V3.1 survival server"/>
<property name="ServerWebsiteURL" value=""/>
<property name="ServerPassword" value="REPLACE_WITH_PLAYER_PASSWORD"/>
<property name="ServerLoginConfirmationText" value=""/>
<property name="Region" value="Asia"/>
<property name="Language" value="Chinese"/>
<property name="ServerPort" value="26900"/>
<property name="ServerVisibility" value="2"/>
<property name="ServerMaxPlayerCount" value="8"/>
<property name="ServerReservedSlots" value="0"/>
<property name="ServerAdminSlots" value="1"/>
<property name="EACEnabled" value="true"/>
<property name="WebDashboardEnabled" value="true"/>
<property name="WebDashboardPort" value="8080"/>
<property name="TelnetEnabled" value="false"/>
生成独立玩家密码:
openssl rand -base64 24
把结果替换进 ServerPassword。这是加入服务器的公共密码,不是 Steam 密码,也不应与 SSH 密钥、面板账号或管理员密码复用。
配置文件里还有网络协议、跨平台、玩家档案和沙盒选项。先保留 V3.1 当前默认值,等原版服务器能够稳定加入后再改。特别是 ServerDisabledNetworkProtocols,不要从旧教程复制一个值覆盖当前配置。
第一次部署建议使用官方 Navezgane 世界:
<property name="GameWorld" value="Navezgane"/>
<property name="GameName" value="MyV31World"/>
<property name="GameDifficulty" value="2"/>
<property name="DayNightLength" value="60"/>
<property name="DayLightLength" value="18"/>
这样能先验证版本、端口、EAC 和玩家登录,把网络问题与随机地图生成问题分开。
确认 Navezgane 正常后,再在维护窗口切换随机地图。V3.1 配置文件中的随机世界属性应以当前示例为准,常见思路是设置随机世界类型、唯一种子和 6144 尺寸。生成时 CPU、内存和磁盘占用都会明显上升,不要在玩家在线时进行。
GameName 决定存档标识。正式开服后不要随便修改,否则服务端可能看起来像“存档丢了”,实际上只是启动了另一个游戏目录。
先前台运行,能直接看到世界生成、EAC、端口和配置错误:
sudo -u sdtd /opt/7dtd-server/startserver.sh \
-configfile=/srv/7dtd-data/serverconfig.xml \
-UserDataFolder=/srv/7dtd-data
第一次启动可能需要几分钟。不要只看到 Java/Unity 进程就认为开服成功,应等待日志显示游戏世界加载完成并监听服务器端口。
在控制台中创建 Web Dashboard 用户:
createwebuser
按提示创建独立管理账号和强密码。之后在控制台输入:
saveworld
shutdown
等待世界保存并正常退出。不要直接关闭 SSH,也不要使用 kill -9。检查数据目录:
sudo -u sdtd find /srv/7dtd-data -maxdepth 3 -type f | sort | head -n 120
sudo du -sh /srv/7dtd-data
创建服务单元:
sudo nano /etc/systemd/system/7dtd.service
写入:
[Unit]
Description=7 Days to Die Dedicated Server
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=sdtd
Group=sdtd
WorkingDirectory=/opt/7dtd-server
ExecStart=/opt/7dtd-server/startserver.sh -configfile=/srv/7dtd-data/serverconfig.xml -UserDataFolder=/srv/7dtd-data
Restart=on-failure
RestartSec=20
KillSignal=SIGINT
TimeoutStopSec=300
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
加载并启动:
sudo systemctl daemon-reload
sudo systemctl enable --now 7dtd
sudo systemctl status 7dtd --no-pager
sudo journalctl -u 7dtd -n 250 --no-pager
LimitNOFILE=65535 用来避免大型世界或多玩家时触发 Linux 打开文件数过低。官方支持 FAQ 也专门记录过 nofile=1024 导致服务启动失败的问题。
停止服务后,确认进程已经退出再做备份:
sudo systemctl stop 7dtd
sudo systemctl status 7dtd --no-pager
如果 300 秒后仍没有退出,先看日志与磁盘空间,不要立即强杀。强制终止可能损坏正在写入的区块或玩家数据。
保持当前 SSH 会话不要关闭,先放行 SSH,再添加游戏端口:
sudo ufw allow OpenSSH
sudo ufw allow 26900/tcp
sudo ufw allow 26900:26903/udp
sudo ufw status numbered
sudo ufw enable
云厂商安全组也必须添加相同规则。检查监听:
sudo ss -lntup | grep -E ':26900|:26901|:26902|:26903'
不要添加 8080/tcp 或 8081/tcp 公网规则。Web Dashboard 通过 SSH 隧道访问,Telnet 保持关闭。
在自己的电脑执行:
ssh -L 8080:127.0.0.1:8080 [email protected]
保持 SSH 会话,然后打开:
http://127.0.0.1:8080
使用第一次前台启动创建的 Web 用户登录。因为 UFW 和云安全组没有开放 8080,公网扫描器不能直接访问这个管理入口。
如果本机 8080 已被占用,可以改成本地 18080:
ssh -L 18080:127.0.0.1:8080 [email protected]
然后访问 http://127.0.0.1:18080。
不要把加入服务器的公共密码当成权限系统。管理员应使用自己的 Steam/EOS 身份,并只给确实需要的人权限。
在服务器控制台或受 SSH 隧道保护的 Web Dashboard 中添加管理员:
admin add STEAM64_ID 0
添加白名单:
whitelist add STEAM64_ID
查看当前列表:
admin list
whitelist list
ban list
具体身份格式与命令帮助可能随版本和网络平台变化,执行前先在当前 V3.1 控制台输入 help admin、help whitelist。不要直接复制陌生服务器的 serveradmin.xml,里面可能包含错误身份、旧平台 ID 或不需要的高权限账号。
先让一名玩家使用公网 IP 直接连接:
IP: 203.0.113.20
Port: 26900
Password: serverconfig.xml 中的 ServerPassword
把示例 IP 换成 VPS 真实地址。直接连接成功后,再检查服务器列表与跨平台加入,这样更容易区分列表刷新、EOS/Steam 和基础网络问题。
域名可以创建普通 A 记录指向 VPS IPv4,但 Cloudflare 普通橙云 HTTP 代理不能转发七日杀游戏端口,应设为 DNS only。
本文显式使用:
-UserDataFolder=/srv/7dtd-data
因此配置之外的世界、玩家、日志和生成地图都集中在 /srv/7dtd-data。不同版本与世界类型的子目录可能有变化,不要只凭教程猜路径,先用实际文件确认:
sudo -u sdtd find /srv/7dtd-data -maxdepth 4 -type f | sort | head -n 200
sudo du -h -d 3 /srv/7dtd-data | sort -h | tail -n 40
/opt/7dtd-server 是可以通过 SteamCMD 重装的程序文件,/srv/7dtd-data 才是不能丢的世界、玩家、权限、日志与生成地图。
最稳妥的做法是维护窗口停服,打包整个数据目录:
sudo systemctl stop 7dtd
sudo tar -C /srv -czf \
"/var/backups/7dtd/7dtd-data-$(date -u +%Y%m%dT%H%M%SZ).tar.gz" \
7dtd-data
sudo systemctl start 7dtd
sudo systemctl is-active 7dtd
检查归档:
sudo ls -lh /var/backups/7dtd
sudo tar -tzf /var/backups/7dtd/7dtd-data-YYYYMMDDTHHMMSSZ.tar.gz | head -n 120
把示例文件名替换成实际归档。至少保留一份异机或对象存储副本,并设置保留周期;只把备份放在同一块 VPS 磁盘上,机器损坏时仍会一起丢失。完整方案可参考VPS 备份与恢复演练。
恢复前停服,并保留当前目录作为临时回退:
sudo systemctl stop 7dtd
sudo tar -tzf /var/backups/7dtd/7dtd-data-YYYYMMDDTHHMMSSZ.tar.gz | head -n 120
sudo mv /srv/7dtd-data \
"/srv/7dtd-data.before-restore-$(date -u +%Y%m%dT%H%M%SZ)"
sudo tar -C /srv -xzf \
/var/backups/7dtd/7dtd-data-YYYYMMDDTHHMMSSZ.tar.gz
sudo chown -R sdtd:sdtd /srv/7dtd-data
sudo systemctl start 7dtd
恢复后验证:
sudo systemctl status 7dtd --no-pager
sudo journalctl -u 7dtd -n 300 --no-pager
sudo du -sh /srv/7dtd-data
让测试玩家加入,检查角色、物品栏、基地、领地块、任务、地图探索和管理员权限。验收完成前不要删除 7dtd-data.before-restore-*,它是这次演练的回退点。
更新前停服并备份,之后只更新默认稳定分支。创建脚本:
sudo nano /usr/local/sbin/update-7dtd-server
写入:
#!/usr/bin/env bash
set -euo pipefail
backup_dir=/var/backups/7dtd
stamp=$(date -u +%Y%m%dT%H%M%SZ)
was_active=0
install -d -m 750 -o root -g sdtd "$backup_dir"
if systemctl is-active --quiet 7dtd; then
was_active=1
systemctl stop 7dtd
fi
restart_service() {
if [ "$was_active" -eq 1 ]; then
systemctl start 7dtd
fi
}
trap restart_service EXIT
tar -C /srv -czf \
"$backup_dir/7dtd-before-update-$stamp.tar.gz" \
7dtd-data
sudo -u sdtd /opt/steamcmd/steamcmd.sh \
+force_install_dir /opt/7dtd-server \
+login anonymous \
+app_update 294420 \
+quit
test -x /opt/7dtd-server/startserver.sh
test -f /srv/7dtd-data/serverconfig.xml
设置权限并手动执行:
sudo chown root:root /usr/local/sbin/update-7dtd-server
sudo chmod 750 /usr/local/sbin/update-7dtd-server
sudo /usr/local/sbin/update-7dtd-server
sudo systemctl is-active 7dtd
sudo journalctl -u 7dtd -n 250 --no-pager
脚本没有 -beta latest_experimental,不会主动切到实验分支。更新成功后要确认日志中的版本、世界加载和玩家加入,不要只看到 SteamCMD 返回成功就结束维护。
原版私人服可以每天在固定窗口检查更新;模组服和公开服更适合手动维护,避免服务端先更新、客户端或模组还没跟上。
创建 oneshot service:
sudo nano /etc/systemd/system/7dtd-update.service
[Unit]
Description=Update 7 Days to Die Dedicated Server
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/update-7dtd-server
创建 timer:
sudo nano /etc/systemd/system/7dtd-update.timer
[Unit]
Description=7 Days to Die daily maintenance window
[Timer]
OnCalendar=*-*-* 05:40:00
RandomizedDelaySec=10m
Persistent=true
[Install]
WantedBy=timers.target
加载并查看:
sudo systemctl daemon-reload
sudo systemctl enable --now 7dtd-update.timer
systemctl list-timers 7dtd-update.timer
大型稳定版发布、世界转换或模组兼容不明时,先停用 timer:
sudo systemctl disable --now 7dtd-update.timer
官方 V3.1 公告说明旧存档通常可以升级,但同时建议备份;新的昼夜密度和刷新选项也可能让旧沙盒预设代码失效。安全流程是:
- 停止旧服务并备份整个用户数据目录。
- 记录旧服务端 build、模组清单和
serverconfig.xml。 - 在独立目录复制存档,不碰唯一正式世界。
- 先关闭第三方模组,以当前稳定版加载副本。
- 检查自定义沙盒预设、玩家、基地、区块和任务。
- 只有副本验收完成后,才安排正式切换。
不要通过删除存档来“修复”版本不匹配。服务端与客户端分支不同,应先统一版本;区块损坏、预设失效和模组冲突则需要日志与备份来判断。
同类开放世界服务器的停服、完整数据归档与恢复检查,也可以对照Project Zomboid 专用服务器备份流程,建立一套固定维护习惯。
先让原版 V3.1 服务器稳定运行,再添加模组。每次只加少量,并记录来源、版本和配置。模组页面写“支持 V3”不等于已经兼容 V3.1。
EACEnabled=true 适合原版和需要反作弊的服务器。某些模组要求关闭 EAC,但这会改变安全边界。只有模组文档明确要求、所有玩家都了解风险时才修改,并且不要把“关 EAC”当作任何启动错误的通用修复。
模组更新前应完成:
- 备份世界和玩家数据。
- 保存当前模组文件与版本清单。
- 在副本世界测试启动与加入。
- 查看日志中的 XML、Harmony、EAC 和网络错误。
- 保留能快速回滚的上一版文件。
在随机地图生成、血月和多人分散探索时记录数据:
free -h
df -h /opt/7dtd-server /srv/7dtd-data /var/backups/7dtd
uptime
ps -eo pid,%cpu,%mem,rss,etime,cmd | grep '[7]DaysToDieServer'
sudo journalctl -u 7dtd --since "30 minutes ago" --no-pager
常见现象:
- 地图生成时内存和 CPU 长时间很高:先等待生成完成,不要频繁重启。
- 血月单核满载:降低玩家数、敌人密度或换单核更强的 VPS。
- 玩家分散探索时卡顿:检查磁盘延迟、内存和新区块加载。
- 存档越来越大:给本地备份、异地同步和恢复解压留出空间。
- 晚高峰延迟明显:比较 UDP 丢包与机房线路,不要只增加内存。
先看完整日志,不要反复重启:
sudo systemctl status 7dtd --no-pager
sudo journalctl -u 7dtd -n 350 --no-pager
sudo -u sdtd test -r /srv/7dtd-data/serverconfig.xml
sudo -u sdtd test -w /srv/7dtd-data
重点检查 XML 是否少了引号或闭合标签、目录所有者是否为 sdtd、磁盘是否写满,以及 LimitNOFILE 是否生效。
检查 Steam 安装清单并更新:
grep -n 'buildid' /opt/7dtd-server/steamapps/appmanifest_294420.acf
sudo /usr/local/sbin/update-7dtd-server
sudo journalctl -u 7dtd -n 250 --no-pager
让客户端退出实验分支并选择默认公开版本。当前 V3.1 官方公告明确要求专用服务器使用 Default Public Version。
依次检查监听、UFW、云安全组和配置:
sudo ss -lntup | grep -E ':26900|:26901|:26902|:26903'
sudo ufw status numbered
sudo grep -E 'ServerPort|ServerVisibility|Region|Language' \
/srv/7dtd-data/serverconfig.xml
sudo journalctl -u 7dtd -n 300 --no-pager | \
grep -iE 'network|steam|eos|litenetlib|error|failed'
确认 26900/tcp 与 26900:26903/udp 同时在 UFW 和云安全组开放。不要用普通 TCP 端口检测网站判断 UDP 一定正常。
确认 ServerVisibility、Region 和 Language 使用当前配置文件中的有效值,端口没有被另一个进程占用。先用公网 IP 直连排除列表刷新问题,再查看 Steam/EOS 日志。
查看 CPU、内存、磁盘和日志是否仍在变化:
free -h
df -h /srv/7dtd-data
ps -eo pid,%cpu,%mem,rss,etime,cmd | grep '[7]DaysToDieServer'
sudo journalctl -u 7dtd -f
6144 或更大地图在低性能 VPS 上会花较长时间。只有日志明确报错、进程退出或资源耗尽时才处理;盲目重启会让生成从头开始。
恢复模组前备份,用纯净 V3.1 服务端复现。确认原版能启动和加入后,再逐批放回模组。不要同时更新游戏、地图、十几个模组和 EAC 设置,否则无法知道是哪一层出问题。
立即停止服务,保留当前数据目录,不要让玩家继续写入。检查最近的正常关服、磁盘空间、强制终止和备份时间;在副本上恢复并验证,确认角色和基地正常后再替换正式世界。
- SteamCMD 安装 App ID 294420,没有使用实验分支参数。
- 客户端与服务端都在当前 V3.1 默认公开稳定分支。
- 服务使用独立
sdtd用户,不以 root 运行。 - 配置来自当前版本自带
serverconfig.xml,没有整份覆盖旧模板。 -
systemctl is-active 7dtd返回active。 -
LimitNOFILE=65535已在 systemd 生效。 - 26900 TCP 与 26900–26903 UDP 已在 UFW 和安全组开放。
- Web Dashboard 只通过 SSH 隧道访问,Telnet 没有暴露公网。
- 玩家能用公网 IP:26900 加入,服务器列表问题单独排查。
- 管理员使用个人身份,未共享最高权限账号。
-
/srv/7dtd-data已完整备份到另一台机器或对象存储。 - 已做一次恢复演练并检查角色、基地、区块和权限。
- 大版本和模组更新前会停服备份并保留回滚副本。
七日杀服务器真正容易翻车的地方不是 SteamCMD,而是版本分支、端口、随机地图和备份。先用 Navezgane 原版世界跑通 V3.1、26900 TCP 与 26900–26903 UDP,再加入随机地图和模组,排障会简单很多。
长期运行时,把 /srv/7dtd-data 当作核心资产:更新前正常停服、完整备份、实际恢复一次。这样即使遇到沙盒预设变化、模组冲突或区块损坏,也能回到一个确认可用的世界,而不是在唯一存档上碰运气。
