属于大家的
VPS知识分享站

Factorio服务器搭建教程:Linux无头服、UDP 34197、模组与存档

Factorio 开服,最重要的不是“几核带几个人”,是服务端、客户端、DLC、模组组合完全一致,再用真实工厂存档验证 UPS。官方 Linux Headless 包不需要图形界面,默认只用 UDP 34197;启动前必须先有一个存档,可以传现有世界,也可以用 –create 生成。

这次我下载了官方 stable Headless 包,做了最小验证:Factorio 2.0.77 Build 84539 创建世界、两次加载、UDP 34197 启动、SIGINT 正常保存和重开。

本轮验证了什么

项目 结果
版本 Factorio 2.0.77 Build 84539 linux64 headless
官方包 57,225,308字节
包SHA-256 c4efc11529f74d37c96933e291e0db73fd9f5aa4738913d9301b24680b3e947f
世界创建 --create完成,日志Done.
第一次启动 加载792,134字节存档,UDP 34197进入Hosting
正常停服 保存100%、socket关闭、Goodbye
第二次启动 加载792,137字节存档,再次进入Hosting
最终存档 792,137字节,SHA-256已记录

验证在Apple Silicon上的Docker

linux/amd64

隔离环境运行,程序和世界使用容器原生Linux文件系统。日志里打开UDP socket只能证明本机进程绑定,不证明公网客户端能加入。

Factorio 2.0.77官方无头包创建世界、UDP 34197启动、正常保存和重开的G012证据

Headless、普通Linux包和SteamCMD怎么选

Factorio官方Wiki建议第三方服务器优先使用Headless包:

  • 不初始化图形;
  • 不包含与纯服务端无关的图形和声音资源;
  • 不依赖Xlib、libGL和libasound;
  • 启动后直接加载指定存档;
  • 无玩家时默认暂停,可在配置中改变;
  • 退出时保存,并继续执行自动保存策略。

普通Linux游戏包也能以headless模式运行,但纯服务器没有必要携带完整客户端资源。这篇使用Factorio.com官方下载,不使用非官方Docker镜像作为事实来源。

系统和配置怎么选

官方Wiki当前写明Factorio需要glibc 2.31,CentOS/RHEL 7默认2.17不满足。新部署可优先选择当前Ubuntu或Debian稳定版。

配置只能给测试起点:

场景 采购测试起点 真正决定扩容的指标
新世界、2—4人原版 2核4GB、40GB SSD 单核、保存耗时、晚高峰网络
中型长期工厂/少量模组 4核8GB、60GB SSD update time、UPS、模组耗时、存档增长
大型megabase或Space Age多星球 8核16GB起,先benchmark 目标存档tick耗时、单核、内存和保存暂停

玩家数量不是主要容量变量。一个人运行巨型工厂可能比十个人的新世界更重。Factorio的模拟通常受单核和内存访问影响,应使用目标存档benchmark,而不是购买页人数表。

准备游戏版本、是否Space Age、模组清单、真实存档、玩家地域和目标UPS,再到萤光云VPS页面核对实时Linux镜像、CPU、SSD、价格和库存。

推荐目录结构

Factorio相同版本客户端通过UDP 34197连接Linux Headless并持久化存档和模组的架构
/opt/factorio/current/              # 当前Headless程序
/opt/factorio/releases/             # 可回退程序版本
/srv/factorio/saves/                # 世界ZIP
/srv/factorio/config/               # server-settings等配置
/srv/factorio/mods/                 # 固定模组组合
/srv/factorio/logs/                 # 运行与更新日志
/srv/factorio/backups/              # 本机临时归档,另有异机副本

使用独立

factorio

普通用户运行。程序目录、存档和密钥分开,更新程序时不要覆盖唯一世界。

下载官方Headless包

Factorio stable地址会重定向到当前版本:

sudo adduser --system --home /opt/factorio --group factorio
sudo mkdir -p /opt/factorio/releases /srv/factorio/{saves,config,mods,logs,backups}

curl -fL \
  https://factorio.com/get-download/stable/headless/linux64 \
  -o /tmp/factorio-headless-linux64.tar.xz

sha256sum /tmp/factorio-headless-linux64.tar.xz
sudo tar -xJf /tmp/factorio-headless-linux64.tar.xz -C /opt/factorio/releases

压缩包内部通常带顶层

factorio/

目录。解压后检查真实路径,再建立

current

符号链接,不要假设所有版本目录名完全一样。

/opt/factorio/current/bin/x64/factorio --version

发布时应把“当前下载版本”和“本文2.0.77历史实测”分开:官方更新后不能悄悄把旧日志写成新版本证据。

创建或上传存档

Factorio专用服务器必须提供存档。创建新世界:

sudo -u factorio /opt/factorio/current/bin/x64/factorio \
  --create /srv/factorio/saves/main.zip

使用自定义地图生成配置:

sudo -u factorio /opt/factorio/current/bin/x64/factorio \
  --create /srv/factorio/saves/main.zip \
  --map-gen-settings /srv/factorio/config/map-gen-settings.json \
  --map-settings /srv/factorio/config/map-settings.json

上传已有世界前记录客户端版本、DLC状态、模组列表、文件大小和SHA-256。服务端程序、客户端和模组必须完全匹配。

server-settings.json

复制当前包内

data/server-settings.example.json

,不要从旧文章凭记忆重写全部字段:

sudo -u factorio cp \
  /opt/factorio/current/data/server-settings.example.json \
  /srv/factorio/config/server-settings.json

私人IP直连最小思路:

{
  "name": "Private Factorio",
  "description": "Friends only",
  "max_players": 8,
  "visibility": {
    "public": false,
    "lan": false
  },
  "game_password": "CHANGE_ME",
  "require_user_verification": true,
  "autosave_interval": 10,
  "autosave_slots": 5,
  "auto_pause": true
}

字段和单位发布时以当前example为准。公共列表需要Factorio.com用户名/令牌;令牌是敏感信息,应放入权限受控配置或密钥流程,不进入文章、工单、截图和Git。

启动服务端

sudo -u factorio /opt/factorio/current/bin/x64/factorio \
  --start-server /srv/factorio/saves/main.zip \
  --server-settings /srv/factorio/config/server-settings.json \
  --port 34197

本轮日志的关键链路:

Loading map ...
Opening socket at 0.0.0.0:34197
Hosting game at 0.0.0.0:34197
Received SIGINT
Saving progress: 100%
Socket closed
Goodbye

日志不可替代客户端验收。正式上线还要从玩家网络连接、重连、检查版本/模组同步和实际游戏推进。

防火墙只开UDP 34197

Factorio官方Wiki明确默认端口34197并只使用UDP:

sudo ufw allow 34197/udp
sudo ufw reload
ss -lunp | grep ':34197'

安全组同样只放行UDP。SSH限制管理员来源IP。若修改端口,启动参数、防火墙、安全组和客户端地址必须同步。

NAT环境还要防止路由器随机修改34197的源端口;云VPS有公网IP时通常不需要家庭路由器端口转发,但仍有云安全组和主机防火墙两层。

systemd服务

[Unit]
Description=Factorio Headless Server
Wants=network-online.target
After=network-online.target

[Service]
User=factorio
Group=factorio
WorkingDirectory=/opt/factorio/current
ExecStart=/opt/factorio/current/bin/x64/factorio --start-server /srv/factorio/saves/main.zip --server-settings /srv/factorio/config/server-settings.json --port 34197
Restart=on-failure
RestartSec=10
NoNewPrivileges=true
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target

先手工验证SIGTERM/SIGINT能正常保存,再交给systemd。不能用

kill -9

模拟正常维护。

模组怎么同步

Factorio要求服务端与客户端使用相同版本和模组组合。保存:

  • mod-list.json
  • 每个模组文件、版本、来源和SHA-256;
  • DLC/Space Age启用状态;
  • 对应服务端版本;
  • 更新前存档副本;
  • 失败回退的程序+模组+存档组合。

官方命令提供

--sync-mods SAVE

,Headless需要在

player-data.json

配置service username/token才能下载缺失模组。令牌必须单独限权。

不要在生产启动脚本中每次自动升级所有模组。先在存档副本同步和启动,再用客户端检查实体、配方、科技和脚本状态。

UPS和CPU怎么实测

Factorio有官方命令参数:

factorio \
  --benchmark /srv/factorio/saves/real-factory.zip \
  --benchmark-ticks 10000 \
  --benchmark-runs 5

比较候选机器时固定:

  • 同一Factorio版本;
  • 同一存档和模组;
  • 相同tick、runs和系统后台负载;
  • 记录平均值和波动,不只看最好一次;
  • 同时记录内存和CPU频率。

新空白世界测试不能代表megabase。这篇没有做benchmark,因此不提供“某套餐稳定60 UPS”的结论。

备份和恢复

备份内容:

saves/*.zip
server-settings.json(敏感令牌单独加密)
map-gen-settings.json / map-settings.json
mods/与mod-list.json
程序版本、下载哈希和启动脚本
systemd与防火墙说明

恢复流程:

通知玩家 → 正常停服 → 确认Goodbye
→ 归档存档/配置/模组 → 生成SHA-256
→ 复制到服务器外多代存储 → 新目录安装匹配版本
→ 加载存档 → 客户端检查工厂、科技、模组和UPS

本轮只验证同一数据环境重开,没有跨主机恢复,所以不能把它写成完整灾备演练。

更新与回退

  1. 记录当前版本、存档和模组哈希;
  2. 公告维护,正常停服;
  3. 保存服务器外备份;
  4. 下载新Headless包到release目录;
  5. 在存档副本加载;
  6. 同步并核对模组;
  7. 客户端加入,检查工厂和UPS;
  8. 通过后切换current;失败恢复旧release组合。

常见故障

提示glibc版本不足

官方当前要求glibc 2.31。不要在CentOS/RHEL 7上随意替换系统glibc,优先选择满足要求的发行版或隔离环境。

服务端启动说找不到存档

--start-server

后必须是实际ZIP路径。检查文件权限、绝对路径、扩展名和运行用户,或先用

--create

生成。

玩家提示版本或模组不一致

核对服务端版本、Space Age/DLC状态、mod-list和每个模组文件。只更新客户端或只更新服务端都会失败。

日志显示Hosting但外网连不上

检查UDP协议、34197安全组、UFW、公网IP和客户端地址。本轮只验证本地日志,没有验证公网。

大工厂UPS下降

用目标存档benchmark,检查单核、模组、机器人/物流规模和后台任务。增加玩家数并不是唯一原因。

FAQ

Factorio服务端要图形界面吗?

不需要。官方Headless包不初始化图形,适合纯Linux服务器。

34197需要TCP吗?

默认只需要UDP。Factorio官方说明它只使用UDP并自己实现可靠传输。

服务端能自动生成世界吗?

可以先用

--create saves/main.zip

生成,再用

--start-server

加载。

2核4GB能带多少人?

不能按人数保证。真实负载主要取决于工厂规模、模组和目标UPS,必须用存档benchmark。

本文已经证明存档可恢复吗?

只证明最小世界正常保存并在同一隔离环境重开,未完成跨主机恢复和客户端世界验收。

购买前清单

  • Factorio版本、Space Age/DLC和模组组合;
  • 新世界还是现有大型存档;
  • 目标UPS和benchmark样本;
  • 玩家地域、运营商和晚高峰网络;
  • Ubuntu/Debian版本及glibc;
  • UDP 34197和公网IP;
  • SSD、自动保存、多代异机备份;
  • CPU型号、扩容、退款和迁移条款。

继续阅读:服务器配置怎么选海外地域选择测试IP方法安全组设置备份恢复方法。准备好真实存档后,再到萤光云VPS页面核对实时Linux镜像、CPU、SSD、价格和库存。

赞(0)
未经允许不得转载:VPS知识分享站 » Factorio服务器搭建教程:Linux无头服、UDP 34197、模组与存档