想和朋友长期探索英灵神殿、建造基地,又不想让某位玩家一直开着电脑,自建 Valheim 专用服务器是更稳定的选择。服务器全天在线,世界文件、访问密码、管理员名单、备份和更新时间都由自己控制,也更适合跨时区的小队。
本文以 Ubuntu 24.04 LTS、SteamCMD、Valheim 官方 Linux 服务端和 systemd 为例,完成安装、2456–2457 端口、Steam 与 Crossplay 后端、世界迁移、管理员名单、自动备份、更新和故障排查。正文不依赖第三方游戏镜像;涉及模组的部分只说明风险,不把社区模组当成官方功能。
Valheim 官方 FAQ 说明服务器最多支持 10 名玩家,但没有给 VPS 场景发布一套能保证并发人数的最低配置。下面是便于购买和压测的实战起点,不是 Iron Gate 的性能承诺:
| 使用规模 | 建议 VPS 起点 | 磁盘 | 适用场景 |
|---|---|---|---|
| 2–5 人原版服 | 2–4 个高性能 vCPU、4–8GB 内存 | 40GB NVMe | 私人世界、轻度建造 |
| 6–10 人长期服 | 4 个高性能 vCPU、8GB 内存 | 60GB NVMe | 大型基地、多人探索 |
| 模组服或多实例 | 6 核以上、12–16GB 内存 | 80GB+ NVMe | 多世界、额外日志与备份 |
Valheim 的世界模拟和大型基地会放大 CPU 单核、网络抖动和存储延迟问题。不要只看 vCPU 数量,还应关注晚高峰是否超售、UDP 丢包、快照价格、DDoS 处理方式和更换故障节点的成本。选机房时优先靠近主要玩家,可先参考游戏服务器 VPS 配置与线路选择。
服务器无需独立显卡。磁盘要同时容纳服务端、SteamCMD 更新临时空间、世界文件和异地备份缓存;不要为了省几美元把根分区压到只剩几 GB。
| 方案 | 优点 | 代价 | 适合谁 |
|---|---|---|---|
| SteamCMD + systemd | 路径透明、依赖少、方便看日志和恢复 | 主要通过 SSH 管理 | 单台 VPS、一个 Valheim 世界 |
| 官方 Docker 脚本 | 可绕开过旧的 GLIBC/GLIBCXX | 需要理解卷和容器权限 | 老系统或已有 Docker 运维经验 |
| Pterodactyl | Web 面板、配额、多实例和用户管理 | 额外维护 Panel、Wings 与数据库 | 托管多个游戏服或多人运维 |
Valheim 官方服务端自带 docker_start_server.sh,但 Ubuntu 24.04 已满足官方列出的 GLIBC 要求。本文选择原生 SteamCMD + systemd,便于清楚看到启动参数、保存目录和停止信号。若你要同时托管 Minecraft、CS2、Rust 与 Valheim,可改用Pterodactyl 游戏服务器面板部署指南。
Valheim 有两种连接方式:
| 后端 | 启动方式 | 网络要求 | 适用玩家 |
|---|---|---|---|
| Steam | 不添加 -crossplay | 2456–2457 UDP 必须能从公网访问 | 全员 Steam |
| Crossplay | 添加 -crossplay | 通过 PlayFab 中继,不要求路由器端口转发 | Steam 与其他平台混合 |
官方指南说明,Crossplay 服务器可通过公网 IP、端口、加入代码或服务器列表连接,但不能使用本机回环地址或局域网 IP 连接。VPS 没有家庭宽带 NAT,Steam 后端通常更直接;只有队伍确实包含非 Steam 平台玩家时再启用 Crossplay。
本文先部署 Steam 后端并开放 2456–2457 UDP,后面单独说明如何切换 Crossplay。不要同时混用多个来源不明的网络插件,以免把版本或连接问题复杂化。
使用有 sudo 权限的管理员账号更新系统并安装 SteamCMD 与 Valheim 官方指南列出的 Linux 依赖:
sudo apt update
sudo apt upgrade -y
sudo apt install -y curl ca-certificates tar lib32gcc-s1 libatomic1 libpulse0 libpulse-dev ufw
创建不用于日常登录的 valheim 账号和固定目录:
sudo adduser --disabled-password --gecos "" valheim
sudo install -d -o valheim -g valheim /opt/steamcmd
sudo install -d -o valheim -g valheim /opt/valheim
sudo install -d -o valheim -g valheim /var/lib/valheim
sudo install -d -m 750 -o root -g valheim /var/backups/valheim
服务端不应以 root 运行。独立账号既能限制进程权限,也能避免 SteamCMD 更新后的文件归属混乱。
切换到服务账号,从 Valve 的 Steam CDN 下载 Linux 版 SteamCMD:
sudo -iu valheim
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
首次运行会更新 SteamCMD。确认入口可执行:
test -x /opt/steamcmd/steamcmd.sh
Valheim Dedicated Server 的 Steam App ID 是 896660。先尝试匿名登录安装;如果你刚完成其他生存游戏服,也可以对照Palworld 专用服务器 SteamCMD 教程,避免混用 App ID、端口和保存目录。
/opt/steamcmd/steamcmd.sh \
+force_install_dir /opt/valheim \
+login anonymous \
+app_update 896660 validate \
+quit
validate 适合首次安装或修复损坏文件;日常更新通常不必每次校验所有文件。若 Steam 当前返回无许可、无 App 信息或匿名下载失败,不要把个人账号密码写进脚本。准备一个拥有 Valheim 的独立 Steam 账号,交互式登录 SteamCMD 并完成 Steam Guard 验证,再执行 app_update 896660 validate。
检查 Linux 服务端和官方启动脚本:
test -x /opt/valheim/valheim_server.x86_64
test -f /opt/valheim/start_server.sh
ls -lh /opt/valheim/valheim_server.x86_64
du -sh /opt/valheim
exit
不要直接修改官方 start_server.sh。官方指南提醒该文件可能在 Steam 更新时被覆盖;systemd unit 应独立保存自定义参数。
游戏密码不应写进公开仓库或文章命令。创建环境文件:
sudo install -d -m 700 -o root -g root /etc/valheim
sudo nano /etc/valheim/valheim.env
写入:
SERVER_NAME="My Valheim Server"
WORLD_NAME="Dedicated"
SERVER_PASSWORD="REPLACE_WITH_A_LONG_RANDOM_PASSWORD"
生成随机密码:
openssl rand -base64 24
将结果替换到 SERVER_PASSWORD,然后限制权限:
sudo chown root:root /etc/valheim/valheim.env
sudo chmod 600 /etc/valheim/valheim.env
systemd 会由 PID 1 读取该文件,再以 valheim 用户启动游戏。具有 root 权限的管理员仍能看到服务启动参数,因此不要把服务器账号开放给不可信用户。
创建 unit:
sudo nano /etc/systemd/system/valheim.service
写入:
[Unit]
Description=Valheim Dedicated Server
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=valheim
Group=valheim
WorkingDirectory=/opt/valheim
EnvironmentFile=/etc/valheim/valheim.env
Environment=SteamAppId=892970
Environment=LD_LIBRARY_PATH=/opt/valheim/linux64
ExecStart=/opt/valheim/valheim_server.x86_64 -nographics -batchmode -name ${SERVER_NAME} -port 2456 -world ${WORLD_NAME} -password ${SERVER_PASSWORD} -savedir /var/lib/valheim -public 1 -saveinterval 1800 -backups 4 -backupshort 7200 -backuplong 43200
Restart=on-failure
RestartSec=10
KillSignal=SIGINT
TimeoutStopSec=120
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
这里显式设置 -savedir /var/lib/valheim,避免世界文件散落在服务账号的默认 Unity 目录。官方说明 -port 2456 会同时使用指定端口和 port+1,即默认的 2456–2457;KillSignal=SIGINT 则让 systemd 模拟官方推荐的 Ctrl+C 停服方式,给世界保存留出时间。
加载并启动:
sudo systemctl daemon-reload
sudo systemctl enable --now valheim
sudo systemctl status valheim --no-pager
sudo journalctl -u valheim -n 150 --no-pager
日志出现 Game server connected 后,官方认为服务已可接受连接。首次创建世界可能需要一点时间,不要在初始化过程中强制终止进程。
保持当前 SSH 会话不要关闭,先确认 SSH 已放行,再开放 Valheim 默认端口:
sudo ufw allow OpenSSH
sudo ufw allow 2456:2457/udp
sudo ufw status numbered
sudo ufw enable
云厂商安全组也要添加相同的 UDP 端口范围。检查服务实际监听:
sudo ss -lunp | grep -E ':2456|:2457'
最常见错误是只改 UFW、漏掉云安全组,或误把规则写成仅 TCP。单个 Steam 后端实例先开放 2456–2457 UDP,不要无依据地放行一整段高位端口。
如果域名 valheim.example.com 指向 VPS,使用普通 A 记录即可。Cloudflare 橙云 HTTP 代理不能代理 Valheim 游戏 UDP 流量,应设为 DNS only,或让玩家直接使用公网 IP。
在 Valheim 的加入游戏界面添加服务器,输入:
203.0.113.20:2456
把示例地址换成 VPS 公网 IPv4。域名方式为:
valheim.example.com:2456
服务器列表可能需要时间刷新。若搜索不到,优先使用直接加入,并同时查看:
sudo systemctl is-active valheim
sudo journalctl -u valheim -n 200 --no-pager
sudo ss -lunp | grep -E ':2456|:2457'
sudo ufw status numbered
当队伍包含非 Steam 平台玩家时,在 ExecStart 末尾添加:
-crossplay
重新加载并重启:
sudo systemctl daemon-reload
sudo systemctl restart valheim
sudo journalctl -u valheim -n 200 --no-pager
官方说明 Crossplay 使用 PlayFab 中继,不要求端口转发,并支持公网 IP、端口、加入代码或服务器列表连接。但是,Crossplay 不能通过本机回环地址或局域网 IP 连接;测试时应使用外部客户端和官方显示的加入信息。
如果全员都是 Steam 玩家,不要为了“可能更快”盲目启用 Crossplay。两种后端的发现、连接和故障表现不同,先固定一种方案完成验收,再考虑切换。
官方定义了三个权限文件:
adminlist.txt:管理员。bannedlist.txt:禁止加入的玩家。permittedlist.txt:允许加入的玩家;一旦写入名单,其他人会被拒绝。
因为本文使用了 -savedir /var/lib/valheim,先定位实际生成的文件:
sudo find /var/lib/valheim -maxdepth 2 -type f \
\( -name 'adminlist.txt' -o -name 'bannedlist.txt' -o -name 'permittedlist.txt' \) \
-print
每行填写一个 Platform User ID,格式为 [Platform]_[User ID],大小写敏感。该 ID 可从服务器日志或游戏内 F2 面板获取。不要凭昵称猜 ID,也不要把 permittedlist.txt 当成普通备注文件,否则会意外拒绝所有未列出的玩家。
修改完成后重启并回看日志:
sudo systemctl restart valheim
sudo journalctl -u valheim -n 120 --no-pager
世界通常由同名的 .db 和 .fwl 文件组成。迁移前先在原电脑把云存档改为本地存档并退出游戏,再成对复制文件,不要只上传其中一个。
在 VPS 上停止服务并查看当前保存结构:
sudo systemctl stop valheim
sudo find /var/lib/valheim -maxdepth 3 -type f | sort
把现有世界文件上传到服务端生成的 worlds_local 目录;假设世界名为 MyWorld:
sudo install -d -o valheim -g valheim /var/lib/valheim/worlds_local
sudo cp /tmp/MyWorld.db /var/lib/valheim/worlds_local/MyWorld.db
sudo cp /tmp/MyWorld.fwl /var/lib/valheim/worlds_local/MyWorld.fwl
sudo chown valheim:valheim /var/lib/valheim/worlds_local/MyWorld.db
sudo chown valheim:valheim /var/lib/valheim/worlds_local/MyWorld.fwl
将 /etc/valheim/valheim.env 中的 WORLD_NAME 改为 MyWorld,启动并验证:
sudo systemctl start valheim
sudo journalctl -u valheim -n 200 --no-pager
如果服务器生成了新世界,通常是文件放错目录、文件名大小写不一致、.db 与 .fwl 不成对,或 WORLD_NAME 与文件名不一致。保留原始副本,确认世界建筑和角色出生点正确后再清理临时上传文件。
本文的 systemd 启动参数已经包含:
-saveinterval 1800 -backups 4 -backupshort 7200 -backuplong 43200
官方含义如下:
- 每 1800 秒保存一次世界。
- 保留 4 份自动备份。
- 第一份短周期备份间隔 7200 秒。
- 后续长周期备份间隔 43200 秒。
这些自动备份能应对近期误操作,但不能替代异机备份。磁盘损坏、账号被入侵或整台 VPS 被删除时,同盘备份会一起丢失。
先手动做一次一致性备份:
sudo systemctl stop valheim
sudo tar -C /var/lib/valheim -czf \
"/var/backups/valheim/valheim-save-$(date -u +%Y%m%dT%H%M%SZ).tar.gz" \
.
sudo systemctl start valheim
sudo systemctl is-active valheim
检查归档内容:
sudo ls -lh /var/backups/valheim
sudo tar -tzf /var/backups/valheim/valheim-save-YYYYMMDDTHHMMSSZ.tar.gz | head -n 80
将示例文件名替换为真实文件。至少把一份备份同步到另一台机器或对象存储,并设置保留周期。更完整的异地方案可参考VPS 备份与恢复演练指南。
恢复前停止服务,并先保留当前保存目录:
sudo systemctl stop valheim
sudo tar -tzf /var/backups/valheim/valheim-save-YYYYMMDDTHHMMSSZ.tar.gz | head -n 80
sudo mv /var/lib/valheim \
"/var/lib/valheim.before-restore-$(date -u +%Y%m%dT%H%M%SZ)"
sudo install -d -o valheim -g valheim /var/lib/valheim
sudo tar -C /var/lib/valheim -xzf \
/var/backups/valheim/valheim-save-YYYYMMDDTHHMMSSZ.tar.gz
sudo chown -R valheim:valheim /var/lib/valheim
sudo systemctl start valheim
验证日志、世界名称、建筑和权限名单:
sudo systemctl status valheim --no-pager
sudo journalctl -u valheim -n 200 --no-pager
sudo find /var/lib/valheim -maxdepth 3 -type f | sort
确认多人连接和世界进度正确后,恢复才算完成。验收前保留 valheim.before-restore-*,不要立即删除唯一回退副本。
客户端和服务端版本不一致时,玩家会遇到 incompatible version。创建只允许 root 执行的维护脚本:
sudo nano /usr/local/sbin/update-valheim-server
写入:
#!/usr/bin/env bash
set -euo pipefail
backup_dir=/var/backups/valheim
stamp=$(date -u +%Y%m%dT%H%M%SZ)
was_active=0
install -d -m 750 -o root -g valheim "$backup_dir"
if systemctl is-active --quiet valheim; then
was_active=1
systemctl stop valheim
fi
restart_service() {
if [ "$was_active" -eq 1 ]; then
systemctl start valheim
fi
}
trap restart_service EXIT
tar -C /var/lib/valheim -czf \
"$backup_dir/valheim-before-update-$stamp.tar.gz" \
.
sudo -u valheim /opt/steamcmd/steamcmd.sh \
+force_install_dir /opt/valheim \
+login anonymous \
+app_update 896660 \
+quit
设置权限并在维护窗口测试:
sudo chown root:root /usr/local/sbin/update-valheim-server
sudo chmod 750 /usr/local/sbin/update-valheim-server
sudo /usr/local/sbin/update-valheim-server
sudo systemctl is-active valheim
sudo journalctl -u valheim -n 150 --no-pager
脚本会先停服并打包整个保存目录,SteamCMD 失败时退出处理仍会尝试恢复原服务状态。若匿名登录不可用,不要在脚本里硬编码 Steam 密码;应在维护窗口交互更新,或使用凭据隔离更严格的专用账号方案。
只有确认匿名 SteamCMD 长期可用,并且玩家接受固定维护窗口时,才启用 timer。创建 service:
sudo nano /etc/systemd/system/valheim-update.service
[Unit]
Description=Update Valheim Dedicated Server
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/update-valheim-server
创建 timer:
sudo nano /etc/systemd/system/valheim-update.timer
[Unit]
Description=Daily Valheim update maintenance window
[Timer]
OnCalendar=*-*-* 05:40:00
RandomizedDelaySec=10m
Persistent=true
[Install]
WantedBy=timers.target
启用并查看下一次执行:
sudo systemctl daemon-reload
sudo systemctl enable --now valheim-update.timer
systemctl list-timers valheim-update.timer
大型更新前更稳妥的做法是通知玩家、手动备份、更新服务端,再用测试客户端确认世界可进入。定时任务不应在 Boss 战或多人建造时突然停服。
Valheim 官方 FAQ 说明,新增地形、建筑或地下城等固定内容通常只会出现在此前未探索的区域;已探索区域还包括玩家足迹周围约 500 米范围。大型版本发布前应:
- 停服并做异地备份。
- 阅读官方补丁说明,确认服务端和客户端版本。
- 更新后先由管理员进入测试。
- 想体验新内容时前往未探索区域,或评估是否创建新世界。
不要为了刷新新内容直接删除 .db、.fwl 或备份文件。世界重置是不可逆的业务决定,应由全体玩家确认。
Valheim 官方 FAQ 明确表示不提供模组官方支持。运行 BepInEx 或其他社区模组时,应额外记录模组版本、配置文件和安装来源,并在游戏更新前停用自动更新。
出现版本不兼容、角色无法进入或世界异常时,先在备份副本上测试原版服务端。不要让更新脚本自动覆盖模组文件,也不要把未经验证的服务端程序集当成官方二进制。
先记录真实高峰数据:
free -h
df -h /opt/valheim /var/lib/valheim /var/backups/valheim
uptime
ps -C valheim_server -o pid,%cpu,%mem,rss,etime,cmd
sudo journalctl -u valheim --since "30 minutes ago" --no-pager
重点观察:
- 大型基地附近 CPU 单核持续满载:优先换单核更强、超售更低的节点。
- 多人同时探索时延迟和回档:检查 UDP 丢包、磁盘延迟与保存日志。
- 内存不断增长或出现 OOM:先停用模组,再评估扩容。
- 世界与备份快速增长:检查保存目录、保留数量和异地同步策略。
- 晚高峰卡顿而白天正常:更可能是邻居超售或线路拥塞,不只是配置不足。
不要只根据面板的平均 CPU 判断。Valheim 卡顿常发生在特定基地、保存瞬间或多人分散探索时,应结合时间点、日志和玩家位置复现。
查看状态、完整 unit 和日志:
sudo systemctl status valheim --no-pager
sudo journalctl -u valheim -n 250 --no-pager
sudo systemctl cat valheim
重点检查 libatomic1、libpulse0、libpulse-dev 是否存在,LD_LIBRARY_PATH 是否指向 /opt/valheim/linux64,服务账号是否拥有 /opt/valheim 和 /var/lib/valheim。
确认二进制、网络和 Steam 服务状态:
test -x /opt/valheim/valheim_server.x86_64
sudo -u valheim test -w /var/lib/valheim
sudo journalctl -u valheim -n 250 --no-pager | grep -iE 'error|steam|connected|failed'
首次启动先等待世界生成。如果日志显示库缺失,不要反复重启,应按缺失名称安装依赖;如果 Steam 后端暂时不可用,保留世界文件并等待服务恢复。
依次检查服务、监听、防火墙和云安全组:
sudo systemctl is-active valheim
sudo ss -lunp | grep -E ':2456|:2457'
sudo ufw status numbered
sudo journalctl -u valheim -n 200 --no-pager
使用公网 IP 直连排除 DNS。Steam 后端要确认 2456–2457 UDP 均已开放;Crossplay 则检查是否错误地使用了内网或回环地址,以及 PlayFab 连接日志。
先停服更新 App ID 896660:
sudo /usr/local/sbin/update-valheim-server
sudo systemctl is-active valheim
sudo journalctl -u valheim -n 200 --no-pager
确认客户端和服务端都在相同的稳定或测试分支。模组服还要核对 BepInEx 与每个模组版本;不要通过删除世界文件解决版本不一致。
停止服务并检查世界名和文件:
sudo systemctl stop valheim
sudo grep '^WORLD_NAME=' /etc/valheim/valheim.env
sudo find /var/lib/valheim -maxdepth 3 -type f \
\( -name '*.db' -o -name '*.fwl' \) -print
确保 WORLD_NAME 与 .db/.fwl 基础文件名完全一致,文件位于服务实际使用的保存目录,并归 valheim:valheim 所有。修正后先备份新旧两套文件,再启动验证。
环境文件变化后必须重启服务:
sudo systemctl restart valheim
sudo systemctl show valheim -p EnvironmentFiles
sudo journalctl -u valheim -n 120 --no-pager
修改 systemd unit 本身时还要先执行 systemctl daemon-reload。不要在多个启动脚本、unit 和面板里重复定义同一参数,否则很难判断哪个值最终生效。
- SteamCMD 安装的是 Valheim Dedicated Server App ID 896660。
- 服务以独立
valheim用户运行,不使用 root。 -
systemctl is-active valheim返回active。 - 日志出现
Game server connected。 - Steam 后端的 2456–2457 UDP 已在 UFW 与云安全组放行。
- Crossplay 只在确有跨平台玩家时启用,并使用外部客户端测试。
-
/etc/valheim/valheim.env权限为 600、所有者为 root。 - 世界
.db与.fwl文件成对存在,名称与WORLD_NAME一致。 - 管理员和白名单填写的是大小写敏感的 Platform User ID。
- 官方自动保存参数已经生效。
- 更新前会停服备份,且异机至少保留一份。
- 已实际恢复一次世界,并验证建筑、角色出生点和权限名单。
- 模组服关闭了未经测试的自动更新。
在 VPS 上稳定运行 Valheim,关键不是只把服务端启动起来,而是固定保存目录、正确区分 Steam 与 Crossplay 后端、开放 2456–2457 UDP、使用 SIGINT 优雅停服,并把世界备份和恢复演练放进更新流程。
2–5 人原版世界可以从高性能 2–4 vCPU、4–8GB 内存起步,接近 10 人、大型基地或模组服则应根据真实 CPU 峰值、内存和网络抖动逐步扩容。上线前完成一次外网连接、世界迁移、版本更新和恢复测试,比盲目增加端口或自动化更能减少回档与停服。
