文档章节

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

陈哈哈GO
 陈哈哈GO
发布于 2016/04/11 11:23
字数 1387
阅读 129
收藏 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

祝你游戏愉快!

© 著作权归作者所有

共有 人打赏支持
陈哈哈GO
粉丝 18
博文 6
码字总数 10904
作品 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
2018/03/16
0
0
关于大型多人在线游戏服务端开发

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

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

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

QQ2747044651
2017/11/02
0
0
Canvas+Socket搞出一个多人游玩的“我画你猜”

各位看官,好久不见,这篇文章本应该是在2018年的时候与你们见面的,结果因为种种原因拖到了此时此刻(我的锅啊我的锅),再过一周就要春节了,在这里和大家说一声过年好啊!!! 今天是个好...

chenhongdong
01/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
今天
3
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
4
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
3
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部