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只能证明本机进程绑定,不证明公网客户端能加入。

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、价格和库存。
推荐目录结构

/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
本轮只验证同一数据环境重开,没有跨主机恢复,所以不能把它写成完整灾备演练。
更新与回退
- 记录当前版本、存档和模组哈希;
- 公告维护,正常停服;
- 保存服务器外备份;
- 下载新Headless包到release目录;
- 在存档副本加载;
- 同步并核对模组;
- 客户端加入,检查工厂和UPS;
- 通过后切换
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、价格和库存。







