文档章节

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

陈小锅
 陈小锅
发布于 2016/04/11 11:23
字数 1387
阅读 86
收藏 0
点赞 1
评论 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
OSChina 技术周刊第二十三期 —— 每周技术精粹

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

OSC编辑部
2015/03/02
0
0
开源分布式游戏服务端引擎kbengine

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

开源中国部长_柯标
2014/07/01
338
0
html5斗地主棋牌架设

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

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

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

goodksd
2014/10/23
201
0
开源unity3d、cocos2dx分布式游戏服务端引擎

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

goodksd
2014/10/23
2.1K
0
开源分布式游戏服务端引擎kbengine

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

goodksd
2014/10/23
84
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

数据结构与算法2

一个数组的例子,实现查找,显示和删除的功能。 public class array {public static void main(String[] args){long[] arr;arr = new long[100];int nElems = 0;int j;...

沉迷于编程的小菜菜
9分钟前
0
0
Python3 基于 requests 批量下载图片

Python3 基于 requests 批量下载图片 import requestsheaders = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encod......

leeyi
10分钟前
0
0
Sparkstreaming and Kafka

简介 Kafka 0.10的Spark Streaming集成设计与0.8 Direct Stream方法类似。 它提供了简单的并行性,Kafka分区和Spark分区之间的1:1对应关系,以及对偏移量和元数据的访问。 但是,由于较新的...

刺猬一号
14分钟前
0
0
java获取当前时间所在一周的周一和周日日期

/** * 当前时间所在一周的周一和周日时间 * @param time 当前时间 * @return */ public static Map getWeekDate(String time) { Map map = new HashedMap(); SimpleDateFormat sdf = new Si......

小弱鸡
42分钟前
0
0
Redis数据的导出和导入(dump和load方式)

网上有些文章已经不再适用,本人也是踩了些坑,在此记录下。 迁移redis数据一般有如下3种方式: 第三方工具redis-dump,redis-load aof机制,需要开启aof功能 rdb存储机制 这里介绍第一种方式...

iplusx
47分钟前
1
0
ElasticSearch 高亮显示大文档搜索结果

2016年12月,我们开始研究Ambar——一个文档搜索系统。Ambar使用ElasticSearch作为核心搜索引擎。 在Ambar开发的过程中,我们处理了很多与ES相关的问题,我们想分享我们得到的宝贵经验。让我...

九州暮云
今天
1
0
Python 使用 pywifi 模块 破解wifi密码

git https://github.com/awkman/pywifi 常见常量 from pywifi import const# Define interface status.IFACE_DISCONNECTED = 0IFACE_SCANNING = 1IFACE_INACTIVE = 2IFACE_CONNEC......

阿豪boy
今天
1
0
phpstorm使用Iedis

phpstorm的redis插件Iedis是真好用 看了网上挺多的文章,但是由于我系统还是ubuntu,就有点尴尬了,现在破解之后,留个笔记,即使自己之后有需要也可以很快翻阅 先下载资源 资源下载 zip压缩...

贤郎--均灵
今天
0
0
第三章 spring-bean之FactoryBeanRegistrySupport(4)

前言 从FactoryBeanRegistrySupport类的名字可以看出FactoryBeanRegistrySupport负责FactoryBean的注册与支持。如果想知道FactoryBean相关的资料,请阅读spring-bean中关于FactoryBean的解读...

鸟菜啊
今天
0
0
CentOS “Destination Host Unreachable”问题解决办法

挑战极速安装CentOS时遇到局域网主机不能通信的情况: [root@zjd network-scripts]# ping 8.8.8.8PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.64 bytes from 8.8.8.8: icmp_seq=1 ttl=......

wffger
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部