之前写过一篇 使用 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
数据库存放数据,但是这样对于以后拓展服务器会比较麻烦,在服务器运行久了之后也会拖累服务器的运行速度。于是官方支持使用mongodb
和redis
来保存数据,并提供了对应的插件screepsmod-mongo
。虽然叫screepsmod-mogo
,但是游戏服务器对redis
的支持也是它提供的。
需要注意的是,虽然mongo
和redis
会提升你的服务器运行效率,但是同时这两个数据库也会吃掉不少的资源,所以如果你的服务器性能不是很好的话,请酌情考虑要不要进行安装。
接下来我们就着手使用docker-compose
将刚才搭建的原生服务器改造成可以使用mongo
和redis
来保存数据。下面是应用的结构图:
下面开始动手,首先我们先终止正在运行的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
退出终端,之后我们可以通过下面的命令来检查是否已经成功启用了mongo
和redis
数据库:
mongodb - 执行如下命令,出现screeps
数据库即为成功。
docker exec -it screeps_mongo_1 mongo
> show dbs
redis - 执行如下命令,刷新出一大堆screeps
的key
即为成功。
docker exec -it screeps_redis_1 redis-cli
> keys *
至此,使用mongodb
和redis
拓展的 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
中配置其对应的字段:
所以执行 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 - 中文系列教程!