Screeps 使用 docker 部署服务器(新)

之前写过一篇 使用 docker 部署 screeps 服务器 的教程了,但是由于里边使用了很久都没有更新的 官方镜像,导致了就算有教程也必须自行修改之后才能正常跑起来,也间接的导致了很多自行尝试的同学备受困扰,所以本文的目的就是真正的简化这个流程,让你什么都不用想,跟着教程做就可以部署好 Screeps 的私服。那么现在就让我们开始吧!

准备工作

  • 一台 linux 服务器
    我使用的是 Ubuntu 16.04 x86_64,需要特别注意的是系统架构,例如华为云的轻量应用服务器,基本都是基于 armV8 架构,而很多主流镜像并不支持这个架构(例如下文中要使用的 redis ),就可能会导致安装麻烦些,不过如果你动手能力强的话自己手动构建对应的镜像也是没有问题的,这里不再赘述。

  • 确保内存大于 2G
    如果你的服务器内存不够 2G 或者刚刚够的话,可以按照 这里 提到的方法启动 swap 内存,不然在安装游戏服务器的时候有可能会内存不足然后安装失败。

  • 已经安装完成的 git

步骤1 - 安装 docker

接下来我们正式开始安装,首先需要有 docker,这一步很简单,执行如下命令进行安装:

curl -fsSL get.docker.com -o get-docker.sh && \
sudo sh get-docker.sh --mirror Aliyun

然后将/etc/docker/daemon.json的内容修改成如下来更换为国内源,提高下载速度(如果你在用阿里腾讯云之类的云服务器的话可以改成对应服务商提供的免费镜像源,有效提高下载速度):

{
  "registry-mirrors": [
    "https://reg-mirror.qiniu.com",
    "https://quay-mirror.qiniu.com"
  ]
}

最后重启 docker 即可:

systemctl daemon-reload && \
systemctl restart docker

进行验证:

docker -v
# Docker version 18.09.5, build e8ff056

如果安装有问题的话请参阅 docker 官方安装流程

为了让后续的操作更加简单,我把主要的操作都做成了 shell 脚本并上传到了 github - docker-screeps-toolbox,接下来我们先执行如下命令来下载这些脚本。

git clone git@github.com:HoPGoldy/docker-screeps-toolbox.git && \
cd docker-screeps-toolbox

如果你有兴趣的话可以自己翻阅一下脚本代码,基本都只有一条 run 命令,非常简单。

步骤2:构建游戏运行时镜像

不要一听到构建就觉得很麻烦,只需要执行下面的命令即可:

./build.sh

当看到以下内容时就代表构建成功了:

Sending build context to Docker daemon    108kB
Step 1/6 : FROM node:10.16.3-stretch
 ---> a68faf70e589
Step 2/6 : VOLUME /screeps
 ---> Using cache
 ---> 6e8d0da89d6b
Step 3/6 : WORKDIR /screeps
 ---> Using cache
 ---> 6b33e68b319c
Step 4/6 : COPY "docker-entrypoint.sh" /
 ---> Using cache
 ---> ad0eed0c23b1
Step 5/6 : ENTRYPOINT ["/docker-entrypoint.sh"]
 ---> Using cache
 ---> 491085a9d2ba
Step 6/6 : CMD ["run"]
 ---> Using cache
 ---> 5cb19815e8c8
Successfully built 5cb19815e8c8
Successfully tagged hopgoldy-screeps-server:latest

步骤3:部署游戏服务器

镜像构建完成后我们执行如下命令来安装游戏服务器:

./install.sh

随后脚本会在当前目录下创建 screeps-server 的文件夹,并开始在其中安装依赖,并且这个文件夹也是游戏服务器的根目录,稍等几分钟后游戏会让输入你的Steam api key,你可以在 这里 获得你的 key (可能需要翻墙),将 key 粘贴到终端然后回车,服务器就安装完成啦。

# 很长一溜依赖项 ...
Done in 111.08s.
A Steam Web API key is required to run the server without the Steam client installed.
You can obtain a key on this page: https://steamcommunity.com/dev/apikey
Enter your Steam API key: 在这里输入你的 key
Screeps world data created in "/screeps".
Run "screeps start" to launch your server.

如果你发现你的安装一直卡在 isolated-vm 构建阶段(十多分钟还没好 ),或者好不容易等到结束了却报了错。如下图所示。

[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@2.3.1: The platform "linux" is incompatible with this module.
info "fsevents@2.3.1" is an optional dependency and failed compatibility check. Excluding it from installation.
info fsevents@1.2.13: The platform "linux" is incompatible with this module.
info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
[4/4] Building fresh packages...
[1/3] ⠁ isolated-vm              <<<<<< 注意这一行,安装会一直卡在这里 <<<<<<
[-/3] ⠁ waiting...
[-/3] ⠂ waiting...

遇到这种问题大多是由于服务器的内存不足导致的(比如你正在使用阿里或腾讯的学生主机),2G 的内存编译起来有点难度,你可以按照 这里 提到的方法增加 swap 内存后再安装试一下。

步骤4:启动游戏服务器

安装完成后我们执行如下命令即可运行游戏服务器。

./start.sh

游戏服务将会开放在 21025 端口上,这时候我们用 curl 访问一下就可以看到游戏服务器的输出啦:

> curl -s http://localhost:21025

<html><body>
  Screeps server  v3.4.3  is running on 0.0.0.0:21025.
  Use your <a href="http://store.steampowered.com/app/464350">Steam game client</a> to connect.
</body></html>

然后你就可以通过游戏客户端,点击Private server并输入你的游戏服务器ip和端口号,在点击connect即可连接,我这里是在本地部署的所以填了localhost。服务器密码置空即可,默认的游戏服务器没有身份验证。注意,如果你使用的是云服务器的话,需要先到对应的服务器控制台网页上开放游戏需要的 21025 端口

登录服务器
成功登入

至此,游戏服务器部署完成。接下来你可以直接开玩,或者考虑按如下步骤升级你的私服:

使用 mongo 和 redis

screeps 服务器默认是使用自带的LokiJS数据库存放数据,但是这样对于以后拓展服务器会比较麻烦,在服务器运行久了之后也会拖累服务器的运行速度。于是官方支持使用mongodbredis来保存数据,并提供了对应的插件screepsmod-mongo虽然叫screepsmod-mogo,但是游戏服务器对redis的支持也是它提供的

需要注意的是,虽然mongoredis会提升你的服务器运行效率,但是同时这两个数据库也会吃掉不少的资源,所以如果你的服务器性能不是很好的话,请酌情考虑要不要进行安装。

接下来我们就着手使用docker-compose将刚才搭建的原生服务器改造成可以使用mongoredis来保存数据。下面是应用的结构图:

docker-compose 应用结构

下面开始动手,首先我们先终止正在运行的screeps-server,执行如下命令即可,一会我们会用docker-compose重新部署它:

./stop.sh

然后安装数据库拓展插件screepsmod-mongo

./add.sh screepsmod-mongo
success Saved 13 new dependencies.
info Direct dependencies
└─ screepsmod-mongo@2.10.1
info All dependencies
# 一堆依赖 ...
Done in 131.50s.

安装了插件还没完,因为我们是用docker-network将 screeps 服务器和数据库连接在一起的,所以 screeps 默认的使用localhost地址来访问数据库就行不通了。接下来我们就配置一下数据库连接地址,在/home/screeps里执行下面命令即可。详细的配置说明参加 npmjs - screepsmod-mongo

# 这是一条命令 直接复制完执行即可
cat >> ./screeps-server/.screepsrc << EOF

[mongo]
host = mongo
[redis]
host = redis
EOF

然后我们就要在服务器开启时启用这个 mod,执行 vi ./screeps-server/mods.json,里面mods字段的值可能为空,将 mod 的访问路径node_modules/screepsmod-mongo/index.js添加进去,然后 esc + :wq 保存退出:

{
  "mods": [
    "node_modules/screepsmod-mongo/index.js"
  ],
  "bots": {
    "simplebot": "node_modules/@screeps/simplebot/src"
  }
}

好了,做到这一步 mod 的安装和配置就已经完成了,接下来我们就用docker-compose部署应用,首先来安装docker-compose,直接执行如下命令即可,下载有可能比较慢,可以先手动下载然后上传至服务器

sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose

安装完成后使用如下命令进行验证:

docker-compose --version
# docker-compose version 1.25.1, build a82fef07

之后就可以开始部署应用了,确认你在 docker-screeps-toolbox 路径下,然后执行如下命令就可以了:

./start_with_mongo.sh

当出现下面输出时即为部署成功,你也可以通过 docker ps 看到你所部署的镜像:

Creating screeps_mongo_1 ... done
Creating screeps_redis_1 ... done
Creating screeps_server_1 ... done

root@server:~/screeps/docker-screeps-toolbox# docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                      NAMES
ffb672263b5c        hopgoldy-screeps-server   "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes        0.0.0.0:21025->21025/tcp   screeps-server
029297bada4b        mongo:2.6.4               "/entrypoint.sh mong…"   3 minutes ago       Up 3 minutes        27017/tcp                  screeps_mongo_1
9e707fc9e483        redis:3.0.6               "/entrypoint.sh redi…"   3 minutes ago       Up 3 minutes        6379/tcp                   screeps_redis_1

游戏服务器启动之后还是使用的默认的LokiJS,我们来启用数据库,执行如下命令打开服务器终端,然后输入mongo.importDB()来启用数据库,终端输出OK后就代表启用成功,你可以再执行一下system.resetAllData()来重置服务器:

# 打开服务器控制台
./cli.sh
# 导入数据库到 mongo
> mongo.importDB()
"OK"

然后按两次ctrl + c退出终端,之后我们可以通过下面的命令来检查是否已经成功启用了mongoredis数据库:

mongodb - 执行如下命令,出现screeps数据库即为成功。

docker exec -it screeps_mongo_1 mongo

> show dbs

redis - 执行如下命令,刷新出一大堆screepskey即为成功。

docker exec -it screeps_redis_1 redis-cli

> keys *

至此,使用mongodbredis拓展的 screeps 服务器就搭建好了,如果你想停止服务器的话执行 ./stop_with_mongo.sh 即可。

安装 mod

其实上一小节安装screepsmod-mongo就是个安装 mod 的具体例子,接下来我们就讲一下通用的安装过程是什么样的。注意!每次安装 mod 前都要先使用如下命令停用服务器。

# 仅服务器本体运行时
./stop.sh

# 使用 mongo 和 redis 运行时
./stop_with_mongo.sh

所有 screeps 的 mod 在npm上都是以screepsmod-前缀开头的,安装共分为三步:安装 mod、配置 mod启用 mod。咱们一步一步的讲:

1. 安装 mod

这一步很简单,比如你想安装 screepsmod-history(官方 mod,用于提供房间回放功能),只需要执行如下命令即可:

./add.sh screepsmod-history

将参数替换成你想安装的 mod 名即可。当你看到如下输出时即为安装成功:

info Direct dependencies
└─ screepsmod-history@1.4.0
info All dependencies
# 依旧是一堆依赖 ...
Done in 122.15s.

然后就可以进行下一步了。

2. 配置 mod

一些 mod 是需要进行配置才能使用的,比如上一小节的screepsmod-mongo当然大部分 mod 都有默认配置项可以直接使用。建议在安装完之后先访问 npmjs 或者 github.com - ScreepsMods 搜索你想安装的 mod,然后阅读一下官方提供的 readme 来获得更详细的信息。

例如我们刚才安装的screepsmod-history,文档地址为 github - screepsmod-history。我们可以发现,使用这个 mod 需要我们在 .screepsrc 中配置其对应的字段:

配置 history mod

所以执行 vi ./screeps-server/.screepsrc,然后把这一段添加在最后面即可,这里不再赘述。注意是在 screeps-server/ 里,不要加错位置了。你还可以在 .screepsrc 最后看到我们刚才添加的 screepsmod-mongo 的配置项

3. 启用 mod

如果你使用npm安装的 mod 的话这一步会自动执行,但是我们是使用的yarn安装的 mod,所以需要手动配置一下,输入vi ./screeps-server/mods.json打开 mod 配置文件,然后 mods字段里添加你的 mod 启动文件路径即可,启动文件的路径格式一般为node_modules/mod名称/index.js

例如我们安装的screepsmod-admin-history,其路径就为"node_modules/screepsmod-history/index.js"注意mods数组的最后一个值后面不能有逗号,不然会无法解析。

{
  "mods": [
    "node_modules/screepsmod-mongo/index.js",
    "node_modules/screepsmod-history/index.js"
  ],
  "bots": {
    "simplebot": "node_modules/@screeps/simplebot/src"
  }
}

添加完之后:wq保存即可。

安装完成,重新启动

经过以上三步之后,我们已经完成了 mod 的安装,接下来就可以重启服务器看一下效果了:

# 仅服务器本体运行时
./start.sh

# 使用 mongo 和 redis 运行时
./start_with_mongo.sh

启动完成之后输入下面命令来查看服务器启动日志,只要没有出现无限重启的情况,mod 基本上就算安装成功了:

root@server:~/screeps/docker-screeps-toolbox# docker logs -f screeps-server
Server version 4.2.11
Starting all processes. Ports: 21025 (game), 21026 (cli)
[storage] process 16 started
[backend] process 27 started
[engine_main] process 28 started
[engine_runner1] process 30 started
[engine_processor1] process 32 started
[engine_processor2] process 38 started

然后我们就可以登陆游戏服务器点开 history 检查一下 mod 是否安装成功了:

回放正常加载

可以看到回放,至此,mod 安装完成。

如何通过命令行提交代码到个人私服?

架设私服如果想要使用 rollup 来提交代码到服务器的话需要安装 mod:screepsmod-auth。登录私服后在左侧边栏中找到 Change Password,点进去修改密码即可。设置完成后将第一次进入游戏时的邮箱、刚才的密码写在本地项目 screeps.json 里的 email 和 password 字段里,然后就可以正常 push 代码了。

并且 IOS 的 screeps 非官方客户端不支持域名解析,只能输入 IP 访问私服。

本方法由 MiHack大佬葫芦大佬 (hafuhafu.cn) 联合提供~

写在最后

其实对于前端同学来说,这个流程可以是很熟悉了,无非就是使用 yarn 安装 screeps 和一些相关的 mod,只不过执行主体被搬到了 docker 容器中。在 ./screeps-server/ 文件夹里就是一个标准的 node 项目。

并且,如果你之前有 docker 部署经验的话估计也能感觉到 screeps 的部署流程并不标准,这种把整个应用暴露到宿主机的操作多少让人有些困惑。不过这也算是一种妥协吧,毕竟 dev 的精力也辐射不到所有地方。 并且 screeps 可以自定义安装 mod、动不动还要升级版本,对于单纯测试代码用的我们来说,也没必要用过于标准的流程来自找麻烦。

那么这篇文章就到这里,了解更多 Screeps 的中文教程?欢迎访问 Screeps - 中文系列教程

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容