如果你只想要一个已经安装完毕的Docker版Factorio服务端,可以直接跳到文章结尾。
我已将Docker版本Factorio的所有文件打包到GitHub中: https://github.com/yoojia/Docker-Factorio,包括Factorio最新服务端版本文件、启动脚本、Dockerfile。
这里要说说Docker神器啊,对于部署或者安装某一个服务的简单程度,简!直!了!不信你直接跳到文章结尾提供的一行代码部署Factorio服务器。最重要是,各个服务之间、服务主机之间可以互不影响啊!
一、安装Docker
安装Docker只需要一行代码:
curl -fsSL https://get.docker.com/ | sh
二、创建Docker的基础镜像
在这里,让Factorio服务端运行在Ubuntu Server 14.04环境中。
Ubuntu的Docker镜像,可以使用Docker的官方镜像,也可以使用我已创建好并内置阿里云mirrors的镜像yoojia/ubuntu
。
阿里云的mirrors是我所在网络环境里更新网速最快的源
sudo docker run -ti yoojia/ubuntu:14.04
三、下载Factorio服务端
Factorio提供了Windows和Linux两个平台的服务端。服务端与客户端不同,它只处理游戏逻辑和数据保存及多人数据同步,没有游戏UI和音效的处理。 另外值得一说的是Factorio使用的是UDP协议而非TCP协议来传输数据,据官方的说法是,Factorio使用了可靠的通讯层来保证数据丢包问题?咦!难道他们应用了Google QUIC?
Windows版本的安装很简单,下载后双击打开就完成安装了。这里介绍的是Linux的版本。
执行上面的命令,等待镜像的各层下载完成后,你就进入到yoojia/ubuntu
镜像的容器中,命令提示符是这样的:
root@10b496af46e:/#
yoojia/ubuntu:14.04
只是一个简洁的Ubuntu内核,并没有其它工具。例如 cURL 或者 wget 等命令是不存在的,需要我们自己安装。
非常简单,更新Ubuntu系统,然后安装cURL:
apt-get update
apt-get install -y curl
在Factorio官网下载Headless版本,即服务端。地址为https://www.factorio.com/download-headless/stable
当前最新版本为0.12.29 (headless)
,使用上面安装的cURL下载,并解压它:
cd /
curl -fkOL https://www.factorio.com/get-download/0.12.29/headless/linux64 | tar -xzf
到此为止,Factorio服务端已经安装完成。上面这么多,其实就是下载Factorio的服务端文件并解压到 /factorio 目录中。 运行 /factorio/bin/x64/factorio
文件就可以启动服务端了。
四、Factorio服务端启动脚本
配置参数作用于:/factorio/bin/x64/factorio。
-c PATH
或者--config PATH
: 指定配置文件路径--create MAP-NAME
创建一个随机地图,并指定文件名;--start-server MAP-NAME
使用指定地图启动服务端;
Factorio服务端的参数解析:
--latency N
: 网络相关参数,暂时没明白这个参数是作用;--latency-ms N
: 网络相关参数,暂时没明白这个参数是作用;--autosave-interval N
: 服务端自动保存游戏进度时间,单位:分钟;--autosave-slots N
: 服务端自动保存;--disallow-commands
: 禁止使用控制台命令;--peer-to-peer
: 客户端之间使用点对点通讯;这个选项的前提是各个客户端之间的网络通讯比客户端与服务端通讯要用的情况下使用;--no-auto-pause
: 当没有用户连接时,不要自动暂停游戏。
启动脚本
启动脚本用于在启动Factorio服务端时,判断地图是否存在,并查找到最新的autosave文件来加载地图。
目前Factorio的地图保存和读取策略是,--start-server
参数指定的地图只是作为基础数据。服务端启动后,游戏进度数据保存到_autosave1.zip
,_autosave2.zip
,_autosave3.zip
文件中。所以启动脚本要解决服务端重启问题,在重启后,读取最新的游戏进度。
具体实现脚本文件:
SAVE_NAME="ourworld"
SAVE_MAP="${SAVE_NAME}.zip"
AUTOSAVE_INTERVAL="--autosave-interval 30"
AUTOSAVE_SLOTS="--autosave-slots 3"
DISABLED_COMMANDS="--disallow-commands"
EXEC_DIR="/factorio"
EXEC_BIN="${EXEC_DIR}/bin/x64/factorio"
EXEC_ARGS="${DISABLED_COMMANDS} ${AUTOSAVE_INTERVAL} ${AUTOSAVE_SLOTS}"
AUTOSAVE_DIR="${EXEC_DIR}/saves"
echo "# Factorio Server launcher start..."
# find the latest autosaveN.zip
LATEST_MAP=`ls -t ${AUTOSAVE_DIR}/*.zip 2> /dev/null | head -1`
echo "# Latest autosave map: ${LATEST_MAP}"
if [ "${LATEST_MAP}" == "${AUTOSAVE_DIR}/${SAVE_MAP}" ]; then
echo "- Using origin map: ${LATEST_MAP}"
else
echo "- Using latest map: ${LATEST_MAP}"
mv ${LATEST_MAP} ${AUTOSAVE_DIR}/${SAVE_MAP}
fi
# Check save map
if [ ! -f ${LATEST_MAP} ]; then
${EXEC_BIN} --create ${SAVE_NAME}
fi
# Run server with args
${EXEC_BIN} --start-server ${SAVE_NAME} ${EXEC_ARGS} $@
五、构建Docker镜像
Factorio官网下载似乎抽风,使用CURL下载经常失败。为了方便,我把服务端文件下载到本地,在Dockerfile中读取本地文件来构建。
FROM yoojia/ubuntu:14.04
MAINTAINER Yoojia Chen <yoojiachen@gmail.com>
ADD factorio-0_12_29.tar.gz /
WORKDIR /factorio
ADD start.sh ./
RUN chmod +x start.sh
VOLUME ["/factorio/saves"]
EXPOSE 34197/udp
ENTRYPOINT ["./start.sh"]
首先创建一个目录,如factorio
将上面代码保存为 Dockerfile 文件,在目录的上一级运行:
sudo docker build -t factorio-server factorio
在-t
之后的第一个参数是镜像名称,第二个参数是目录名
即可构建你的Docker镜像。
六、一行代码部署Factorio服务器
sudo docker run -d
-v <your-local-save-dir>:/opt/factorio/saves
-p 34197:34197/udp
--restart=always
--name my-factorio-server
yoojia/factorio:latest
<your-local-save-dir>
这个是你保存服务端地图的目录,例如我的服务器,数据都保存在 /datadisk 中。那我的地址就是 /datadisk/factorio
祝你游戏愉快!