想和朋友长期玩《Satisfactory》(幸福工厂),用某位玩家的电脑临时开房会遇到一个很现实的问题:房主下线,工厂就停;房主换电脑,存档还要搬;更新、备份和管理密码也全挤在个人电脑上。把专用服务器部署到 VPS 后,世界可以全天运行,玩家随时上线建设,管理员则能独立安排维护窗口、备份和升级。
本文以 Ubuntu 24.04 x86_64 VPS 为例,使用官方原生 Linux 服务端、SteamCMD 和 systemd,完整走一遍安装、认领服务器、开放新端口、备份、恢复与自动更新。先提醒一个最容易照抄旧教程踩中的变化:Satisfactory 1.0 之后已经不再使用旧的 15000/UDP 和 15777/UDP,当前默认需要 7777/TCP、7777/UDP 与 8888/TCP。
Satisfactory 官方社区 Wiki 的专用服务器文档列出的服务端 Steam App ID 是 1690800。它支持原生 64 位 Windows 和 Linux,但只支持 x86-64,不支持 ARM。
截至 2026 年 8 月,官方 Wiki 的当前版本模板显示默认分支为 1.2.3.1。本文不把补丁号写进安装命令,因为 SteamCMD 会从默认分支下载当前稳定版本;以后小版本更新时,命令仍然可用。
| 项目 | 本文使用值 |
|---|---|
| SteamCMD App ID | 1690800 |
| 系统 | Ubuntu 24.04 LTS x86_64 |
| 服务端程序 | FactoryServer.sh |
| 游戏与查询 | 7777/UDP |
| HTTPS API | 7777/TCP |
| 可靠消息 | 8888/TCP |
购买 VPS 前先在控制台确认架构:
uname -m
lscpu | grep -E 'Architecture|Model name|Virtualization'
uname -m 应输出 x86_64。如果是 aarch64 或 arm64,即使系统能安装 SteamCMD,也不能直接运行官方服务端。官方文档还特别指出,某些 KVM VPS 暴露的通用 kvm64 CPU 模型会导致服务端无法启动;遇到这种情况应让服务商切换到 host-passthrough、较新的 x86-64 CPU 模型,或直接换支持现代指令集的实例,而不是反复重装系统。
Satisfactory 的工厂规模会持续增长,传送带、列车、无人机和大量建筑都会增加 CPU 与内存压力。官方文档给出的最低内存是 8GB,并建议大型存档或超过 4 名玩家时使用 16GB。实际购买时还要给 Ubuntu、SteamCMD、文件缓存和维护操作留余量。
| 使用场景 | 建议起步配置 | NVMe 磁盘 | 说明 |
|---|---|---|---|
| 2–4 人新档 | 4 个高主频 vCPU、8GB 内存 | 50GB | 能开服,但大型工厂前应观察内存 |
| 4–8 人长期档 | 4–6 个高主频 vCPU、16GB 内存 | 80GB | 更适合长期运行与在线备份 |
| 8 人以上或超大型工厂 | 6–8 个高主频 vCPU、16–32GB 内存 | 100GB+ | 需要根据监控数据扩容 |
这些是实用起点,不是人数或性能保证。Satisfactory 服务端很看重单核性能,不要只比较“8 核”“16 核”的宣传数字。共享 CPU 严重超售时,机器总负载看起来不高,游戏仍可能出现橡皮筋、建造延迟和自动保存卡顿。
机房应尽量靠近主要玩家,并确认服务商允许游戏服务器、支持 UDP、有足够月流量和清晰的 DDoS 处理规则。还没有选机器时,可以先看游戏服务器 VPS 配置与线路选择。
先通过 SSH 登录 VPS,更新系统并安装依赖:
sudo apt update
sudo apt upgrade -y
sudo apt install -y curl ca-certificates tar lib32gcc-s1 lib32stdc++6 ufw
不要直接用 root 长期运行游戏服。创建一个没有管理员权限的系统用户,并准备安装与备份目录:
sudo adduser --system --group \
--home /home/satisfactory \
--shell /bin/bash satisfactory
sudo install -d -o satisfactory -g satisfactory /opt/steamcmd
sudo install -d -o satisfactory -g satisfactory /opt/satisfactory
sudo install -d -m 750 -o root -g satisfactory /var/backups/satisfactory
检查目录和磁盘空间:
id satisfactory
df -h /opt /home /var/backups
sudo -u satisfactory test -w /opt/satisfactory && echo 'install dir writable'
如果 /opt 与 /home 位于同一个小系统盘,备份也放在这块盘上并不能防止 VPS 被删除或磁盘损坏。本文先创建本地恢复点,后面仍要把关键备份同步到另一台机器或对象存储。
从 Valve 官方 CDN 下载 Linux 版 SteamCMD:
sudo -u satisfactory curl -fsSL \
https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz \
-o /opt/steamcmd/steamcmd_linux.tar.gz
sudo -u satisfactory tar -xzf \
/opt/steamcmd/steamcmd_linux.tar.gz \
-C /opt/steamcmd
sudo -u satisfactory /opt/steamcmd/steamcmd.sh +quit
第一次运行会更新 SteamCMD 自身。完成后确认脚本和目录所有权:
ls -l /opt/steamcmd/steamcmd.sh
sudo -u satisfactory test -x /opt/steamcmd/steamcmd.sh \
&& echo 'steamcmd ready'
不要从论坛附件、网盘或不明镜像下载打包好的服务端。SteamCMD 可以直接匿名取得官方专用服务器文件,没有必要把个人 Steam 账号和密码写进 VPS。
使用 App ID 1690800 安装当前默认分支:
sudo -u satisfactory /opt/steamcmd/steamcmd.sh \
+force_install_dir /opt/satisfactory \
+login anonymous \
+app_update 1690800 validate \
+quit
下载完成后检查关键文件:
sudo -u satisfactory test -x /opt/satisfactory/FactoryServer.sh \
&& echo 'FactoryServer ready'
du -sh /opt/satisfactory
ls -l /opt/satisfactory/FactoryServer.sh
如果 SteamCMD 报磁盘空间不足,不要只清理下载缓存就继续硬装。存档、日志和后续更新都需要额外空间,应先扩容磁盘,并确保 inode 也没有耗尽:
df -h
df -i
正式配置 systemd 前,先前台启动一次,便于直接看到报错:
sudo -u satisfactory env HOME=/home/satisfactory \
/opt/satisfactory/FactoryServer.sh \
-Port=7777 \
-ReliablePort=8888
第一次启动需要生成配置目录并初始化服务,可能等待几分钟。不要看到终端暂时没有新输出就立即强制结束。在另一个 SSH 窗口检查进程和监听端口:
pgrep -af FactoryServer
sudo ss -lntup | grep -E ':7777|:8888'
curl -k https://127.0.0.1:7777
7777 的 TCP 和 UDP、8888 的 TCP 都应出现。curl 返回找不到对应 API 路由、HTTP 错误或 JSON 错误并不一定是故障;只要能完成 TLS 连接并收到服务端响应,就说明本机 HTTPS API 已经监听。
确认启动成功后,在运行服务端的终端按 Ctrl+C。Linux 版会收到 SIGINT 并正常退出。官方文档提醒:正常退出并不等于自动保存,以后维护前应先在游戏内或 Server Manager 中执行保存,再停服。
Satisfactory 当前默认端口如下:
| 端口 | 协议 | 用途 | 公网入站 |
|---|---|---|---|
7777 | UDP | 游戏与查询流量 | 必须 |
7777 | TCP | HTTPS API | 必须 |
8888 | TCP | 可靠消息通道 | 必须 |
先保证 SSH 规则存在,再启用 UFW:
sudo ufw allow OpenSSH
sudo ufw allow 7777/udp comment 'Satisfactory game and query'
sudo ufw allow 7777/tcp comment 'Satisfactory HTTPS API'
sudo ufw allow 8888/tcp comment 'Satisfactory reliable messaging'
sudo ufw enable
sudo ufw status numbered
然后到 VPS 服务商控制台的安全组或云防火墙中添加完全相同的三条入站规则。系统 UFW 与云安全组是两层过滤,少任何一层都可能出现“进程正常、外网却连不上”。可按端口、防火墙与安全组排查清单逐层检查。
不要继续照抄 1.0 之前的 15000/UDP 与 15777/UDP 规则,它们已经不再使用。也不要为了省事开放所有 TCP/UDP 端口。
如果一台 VPS 同时运行多个 Satisfactory 实例,可以修改端口,例如:
/opt/satisfactory/FactoryServer.sh \
-Port=7778 \
-ReliablePort=8889
标准 Port 的公网端口与服务端监听端口必须一致,不能只靠普通 NAT 把外部 7778 随意转到内部 7777。确实需要对可靠消息端口做外部映射时,再按官方说明使用 -ExternalReliablePort,并同步修改防火墙。
服务端第一次成功运行后,打开 Satisfactory 客户端,在主菜单进入 Server Manager:
- 选择添加服务器,填写 VPS 公网 IP 和默认端口
7777。 - 第一次连接会提示认领服务器,设置服务器名称和管理员密码。
- 管理员密码应随机、唯一,不要复用 SSH、邮箱或 Steam 密码。
- 创建新游戏,或导入已有的
.sav存档。 - 在服务器设置中确认自动保存间隔、断线自动保存和自动加载会话。
- 如需私人服,再设置玩家连接密码,并只通过私密渠道分享。
服务器管理设置会保存在类似下面的位置,其中 PORT 会替换为实例实际使用的端口:
/home/satisfactory/.config/Epic/FactoryGame/Saved/SaveGames/ServerSettings.PORT.sav
Linux 服务端存档目录是:
/home/satisfactory/.config/Epic/FactoryGame/Saved/SaveGames/server
导入旧存档时,先停服,再以 satisfactory 用户复制 .sav 文件,避免 root 所有权导致游戏读不到:
sudo systemctl stop satisfactory 2>/dev/null || true
sudo install -d -o satisfactory -g satisfactory \
/home/satisfactory/.config/Epic/FactoryGame/Saved/SaveGames/server
sudo cp /path/to/your-save.sav \
/home/satisfactory/.config/Epic/FactoryGame/Saved/SaveGames/server/
sudo chown satisfactory:satisfactory \
/home/satisfactory/.config/Epic/FactoryGame/Saved/SaveGames/server/your-save.sav
把 /path/to/your-save.sav 换成真实文件路径。启动后在 Server Manager 中选择加载该存档,不要直接改二进制 .sav 或 ServerSettings.PORT.sav。
前台启动、端口和认领都确认正常后,创建 /etc/systemd/system/satisfactory.service:
[Unit]
Description=Satisfactory dedicated server
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=satisfactory
Group=satisfactory
Environment=HOME=/home/satisfactory
WorkingDirectory=/opt/satisfactory
ExecStartPre=/opt/steamcmd/steamcmd.sh +force_install_dir /opt/satisfactory +login anonymous +app_update 1690800 validate +quit
ExecStart=/opt/satisfactory/FactoryServer.sh -Port=7777 -ReliablePort=8888
Restart=on-failure
RestartSec=60
KillSignal=SIGINT
TimeoutStopSec=180
[Install]
WantedBy=multi-user.target
这一配置参考了官方 Wiki 的作为 systemd 服务运行指南,并明确设置 HOME,保证存档落在预期的服务用户目录。
重新载入 systemd 并启动:
sudo systemctl daemon-reload
sudo systemctl enable --now satisfactory
sudo systemctl status satisfactory --no-pager
sudo journalctl -u satisfactory -n 100 --no-pager
ExecStartPre 会在每次服务启动前运行 SteamCMD,因此重启服务时会先检查更新。这样方便维护,但如果服务因错误反复崩溃,每次重新启动前也会再次执行更新检查。不要把 RestartSec 改成几秒钟,更不要用无限快速循环掩盖真实故障。
查看实时日志:
sudo journalctl -u satisfactory -f
游戏自身日志通常位于:
/opt/satisfactory/FactoryGame/Saved/Logs
如果 systemd 显示 active (running),玩家仍无法加入,先看日志是否完成世界加载,再检查三条端口是否同时监听。不要只根据进程状态判断游戏世界已经可以连接。
不要在服务端进程运行时直接执行 app_update。官方文档列出的 0x606 更新错误,常见原因就是正在运行的 FactoryServer 占用了要替换的文件。
安全更新流程是:
- 在 Server Manager 或游戏内手动保存,例如保存为
before-update。 - 通知玩家下线并等待保存完成。
- 停止服务。
- 运行 SteamCMD 更新并校验。
- 重新启动,检查日志与版本。
命令如下:
sudo systemctl stop satisfactory
sudo -u satisfactory env HOME=/home/satisfactory \
/opt/steamcmd/steamcmd.sh \
+force_install_dir /opt/satisfactory \
+login anonymous \
+app_update 1690800 validate \
+quit
sudo systemctl start satisfactory
sudo journalctl -u satisfactory -n 100 --no-pager
由于本文的 systemd 单元已包含 ExecStartPre,手动执行 SteamCMD 后,systemctl start 会再检查一次,通常很快完成。也可以在完成保存后直接 sudo systemctl restart satisfactory,让 systemd 在停服后自动更新。
大版本更新前不要只依赖一次本机备份。先查看官方补丁说明和社区已知问题,保留可回滚的存档副本,再安排维护窗口。
需要备份的核心目录不是安装目录,而是服务用户 HOME 下的 Saved:
sudo -u satisfactory find \
/home/satisfactory/.config/Epic/FactoryGame/Saved \
-maxdepth 3 -type f -printf '%TY-%Tm-%Td %TH:%TM %p\n' \
| tail -n 30
维护前先在游戏内执行保存,然后停服并创建带时间戳的压缩包:
sudo systemctl stop satisfactory
backup_stamp=$(date +%Y%m%d-%H%M%S)
sudo tar \
-C /home/satisfactory/.config/Epic/FactoryGame \
-czf "/var/backups/satisfactory/satisfactory-${backup_stamp}.tar.gz" \
Saved
sudo systemctl start satisfactory
sudo ls -lh /var/backups/satisfactory
抽查压缩包能否读取:
latest_backup=$(sudo find /var/backups/satisfactory \
-maxdepth 1 -type f -name 'satisfactory-*.tar.gz' \
-print | sort | tail -n 1)
sudo tar -tzf "$latest_backup" | head -n 30
建议至少保留“最近 7 个每日备份、最近 4 个每周备份”,并把副本同步到与 VPS 不同的故障域。备份脚本、对象存储和恢复演练可参考VPS 备份策略指南。
恢复会替换当前 Saved,因此先再做一份现场快照:
sudo systemctl stop satisfactory
restore_stamp=$(date +%Y%m%d-%H%M%S)
sudo mv \
/home/satisfactory/.config/Epic/FactoryGame/Saved \
"/home/satisfactory/.config/Epic/FactoryGame/Saved.before-restore-${restore_stamp}"
sudo -u satisfactory tar \
-C /home/satisfactory/.config/Epic/FactoryGame \
-xzf /var/backups/satisfactory/satisfactory-YYYYMMDD-HHMMSS.tar.gz
sudo chown -R satisfactory:satisfactory \
/home/satisfactory/.config/Epic/FactoryGame/Saved
sudo systemctl start satisfactory
sudo journalctl -u satisfactory -n 100 --no-pager
把文件名替换为要恢复的真实备份。启动后先由管理员进入 Server Manager,确认会话、存档时间和服务器设置,再让其他玩家加入。
先查看完整日志,而不是反复 systemctl restart:
sudo systemctl status satisfactory --no-pager -l
sudo journalctl -u satisfactory -b --no-pager
find /opt/satisfactory/FactoryGame/Saved/Logs \
-maxdepth 1 -type f -printf '%TY-%Tm-%Td %TH:%TM %p\n' \
| sort | tail
确认系统是 x86_64、内存没有被 OOM Killer 杀死、目录归属正确,并检查 VPS 是否使用有兼容问题的 kvm64 CPU 模型:
uname -m
lscpu | grep 'Model name'
sudo journalctl -k | grep -i -E 'out of memory|killed process|oom'
sudo chown -R satisfactory:satisfactory \
/opt/satisfactory /home/satisfactory
先确认本机监听:
sudo ss -lntup | grep -E ':7777|:8888'
sudo ufw status numbered
curl -k https://127.0.0.1:7777
然后检查云安全组三条规则是否齐全。最常见错误是只开 7777/UDP,漏掉 7777/TCP 或 8888/TCP;另一个常见错误是沿用旧教程,只开放 15777/UDP 与 15000/UDP。
先确认服务已经真正停止:
sudo systemctl stop satisfactory
pgrep -af FactoryServer || echo 'server stopped'
sudo -u satisfactory /opt/steamcmd/steamcmd.sh \
+force_install_dir /opt/satisfactory \
+login anonymous \
+app_update 1690800 validate \
+quit
如果还能看到 FactoryServer 进程,不要直接 kill -9。先查明它是否由另一个终端、脚本或重复 systemd 单元启动,并用对应方式发送 SIGINT 正常结束。
检查文件是否放进 Linux 服务端的正确目录、后缀是否为 .sav、所有者是否为 satisfactory:
sudo -u satisfactory find \
/home/satisfactory/.config/Epic/FactoryGame/Saved/SaveGames/server \
-maxdepth 1 -type f -name '*.sav' -ls
如果文件属于 root,修正所有权后重启服务,再从 Server Manager 选择加载。不要在服务端运行时覆盖当前活跃存档。
先记录数据再升级套餐:
free -h
uptime
vmstat 1 10
pid=$(pgrep -n FactoryServer-Linux-Shipping || pgrep -n FactoryServer)
ps -p "$pid" -o pid,%cpu,%mem,rss,etime,cmd
如果单个 vCPU 长时间接近满载,应优先换更高单核性能的实例;如果可用内存很少、持续交换,则增加内存。磁盘等待高时检查 NVMe 性能和备份任务是否与自动保存重叠。长期服可以接入Prometheus 与 Grafana VPS 监控,观察 CPU、内存、磁盘和网络趋势。
uname -m为x86_64,CPU 不是有兼容风险的旧kvm64模型。- SteamCMD 使用专用服务器 App ID
1690800,不是游戏客户端 App ID。 - 服务以独立的
satisfactory用户运行,没有使用 root。 7777/TCP、7777/UDP、8888/TCP已同时放行 UFW 与云安全组。- 已在 Server Manager 中认领服务器,并设置唯一的管理员密码。
- 自动保存、断线保存和自动加载会话已按需求配置。
- systemd 能开机自启,
KillSignal=SIGINT,日志中没有持续崩溃循环。 - 更新前会先保存和停服,不会在 FactoryServer 运行时执行 SteamCMD。
- 已完成一次备份读取测试,并把至少一份备份复制到异地。
- 已实际从外网客户端加入、退出、重连,并确认最新进度仍然存在。
完成这些检查后,这台 VPS 才算从“能启动”进入“可长期维护”的状态。对 Satisfactory 这类存档会不断增长的游戏服来说,稳定的 CPU、正确的新端口、可验证的备份和有节奏的维护,远比一次性把程序跑起来更重要。
