文档章节

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

陈小锅
 陈小锅
发布于 2016/04/11 11:23
字数 1387
阅读 113
收藏 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
关于大型多人在线游戏服务端开发

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

尼莫
2011/03/10
1K
1
html5斗地主棋牌架设

html5斗地主棋牌架设 一、简介   多人对战游戏,我用Nodejs做开发服务端,使用socket.io做通讯。整个斗地主游戏流程是一样的,只是单机版啥都要自己做,网络版更多交给服务器,自己主要就是...

QQ2747044651
2017/11/02
0
0
开源分布式游戏服务端引擎kbengine

开源分布式游戏服务端引擎kbengine 一款开源的支持多人同时在线实时游戏的服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互,使用KBEngine插件能够快速与(Unity3D、OGRE、Coc...

goodksd
2014/10/23
125
0

没有更多内容

加载失败,请刷新页面

加载更多

线下工坊|Blockchain Coding Day:零基础教你开发DAPP(北京)

我们的目标是通过编程学习让你更了解区块链技术。这将对区块链开发初学者一次很好的体验。这里需要强调一下,编程零基础也能学会。 我们将以小组的形式,由教练带领学员完成DAPP开发。每位学...

HiBlock
24分钟前
2
0
查看内存情况

jinfo:可以输出并修改运行时的java 进程的opts。 jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 jstat:一个极强的监视VM内存工具。...

Canaan_
25分钟前
2
0
基于对象特征的推荐

(本实验选用数据为真实电商脱敏数据,仅用于学习,请勿商用) 在上一期基于协同过滤的的推荐场景中,我们介绍了如何通过PAI快速搭建一个基于协同过滤方案的推荐系统,这一节会介绍一些如何基...

阿里云官方博客
33分钟前
1
0
Ugly Number(leetcode263)

Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. Example 1: Input: 6Output: true......

woshixin
57分钟前
2
0
深度模型从研者 眼里的 似然估计 & Hessain 海森矩阵 & Fisher Information (费雪信息)

深度模型的训练的基本依据是最小化模型拟合数据的误差。旨在不仅知其然(如何构建和训练一个深度模型),还应知其所以然(为什么这样训练,可以做哪些优化)。我们就会发现,有很多研究者,在...

刘小米_思聪
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部