文档章节

在Docker中架设Factorio多人游戏服务端

陈小锅
 陈小锅
发布于 2016/04/11 11:23
字数 1387
阅读 96
收藏 0

如果你只想要一个已经安装完毕的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

祝你游戏愉快!

© 著作权归作者所有

共有 人打赏支持
陈小锅
粉丝 18
博文 5
码字总数 9963
作品 3
深圳
高级程序员
本人作品-〉VPS应用->Discuz网页斗地主插件

Discuz网页斗地主插件V2SP3正式稳定版,消耗会员积分,支持多人联机和X2.5版本! 下载地址已发布:http://qipai.wdmir.net/downloads/discuzddzv2sp3.zip 语音录像教程 http://qipai.wdmir.n...

付翔
2013/01/03
0
0
Agones:一款基于Kubernetes的开源游戏服务器

在分布式系统领域,支持在线弹性扩展,实时多人专属游戏服务器意味着特殊的挑战。随着游戏专业人士创造的各种特殊方案,Kubernetes被整合成跨云和物理机,支持复杂工作流的开源分布式标准。今...

Docker
03/16
0
0
OSChina 技术周刊第23期 —— .NET Core 开源更新报告

每周技术抢先看,总有你想要的! 移动开发 【软件】Android 调试工具 Stetho 前端开发 【翻译】25 个超棒的 HTML5 & JavaScript 游戏引擎开发库 【翻译】什么时候 AngularJS 会超越 jQuery 【...

OSC编辑部
2015/03/02
3.5K
5
关于大型多人在线游戏服务端开发

请问有没有关于大型多人在线游戏服务端开发的开源项目?或者说想学大型多人在线游戏服务端开发要关注哪些开源项目或技术,我是新菜鸟,谢谢:)

尼莫
2011/03/10
1K
1
开源分布式游戏服务端引擎kbengine

开源分布式游戏服务端引擎kbengine http://www.kbengine.org/cn/ 一款开源的支持多人同时在线实时游戏的服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互,使用KBEngine插件能...

开源中国部长_柯标
2014/07/01
338
0

没有更多内容

加载失败,请刷新页面

加载更多

八月新增开源项目:假装自己是图形界面的 Git 命令行工具

每月新增开源项目。顾名思义,每月更新一期。我们会从社区上个月新收录的开源项目中,挑选出有价值的、有用的、优秀的、或者好玩的开源项目来和大家分享。数量不多,但我们力求推荐的都是精品...

编辑部的故事
3分钟前
1
0
20180918 find命令与Linux文件扩展名

命令find 用来查找搜索文件。 搜索文件相关命令: which 从环境变量里的目录中去搜索 whereis(不常用) 从一个固定的库中搜索 locate(需要单独安装 yum install -y mlocate) 查询时会从/var/...

野雪球
6分钟前
0
0
一步步编写自己的PHP爬取代理IP项目(二)

这一章节我们正式开展我们的爬虫项目,首先我们先要知道哪个网站能获取到免费代理IP,目前比较火的网站有西刺代理,快代理等,这里我们拿西刺代理作为例子。 西刺代理官网: http://www.xic...

NateHuang
26分钟前
0
0
GO 数组相关操作

package mainimport("fmt""math/rand""time")func main() {//数组的几种定义方式var arr1 [3]int = [3]int{1,2,3}var arr2 = [3]int{4,5,6}arr3 := [3]string{"h", "w", ......

汤汤圆圆
52分钟前
1
0
JAVA 中interrupt、interrupted和isInterrupted的区别

首先,我们说明下三个方法的功能 interrupt() 向当前调用者线程发出中断信号 isinterrupted() 查看当前中断信号是true还是false interrupted() 是静态方法,查看返回当前中断信号并将中断信号...

我爱春天的毛毛雨
57分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部