dr4ft 的实现基于 Node.js ,所以需要提前准备好 Node.js 运行环境(也即 node 和 npm 这两个)。如果运行 dr4ft 遇到“Unexpected token ILLEGAL”这类错误信息,那么一般都是 Node.js 的版本不对,升级运行环境到最新版就能解决。

Debian 发行版自带的 Node.js 版本就太老,需要考虑按照 Node.js 官方文档 来升级版本才行。

1.  首先尝试本机成功运行

比较完整的安装配置指令,可参考 Makefile 文件中的内容。

  1. 执行 node --version 检查本机 Node.js 运行环境版本。
  2. 获取最新版本代码:
     git clone https://github.com/dr4fters/dr4ft.git
  3. 如下指令会自动下载所依赖的第三方模块,以及下载最新的卡牌数据。但这时候服务还不能正常运行,因为数据文件还没完全准备好:
     make run
  4. 根据前一步下载得到的卡牌数据,生成本次牌名和系列列表设置文件:
     make cards
  5. 重新执行 make run ,这时候应该一切成功,可以用浏览器访问 http://localhost:1337 成功访问本机架设起来的服务了。
    • 其实这时候服务绑定的是本机 ip 地址,直接用 http://本机_ip_地址:1337 也能访问,也就是其实已经在提供对外服务了。
    • 以后启动服务也可以用 node run 指令,这样就免了 make 脚本执行多余的内容了。

1.1  Debian 下的 Node.js 版本问题解决

Debian 下自带的 Node.js 版本太低, make run 之后会报“Unexpected token ILLEGAL”错误。参考 Installing Node.js via package manager 执行以下两步可以解决:

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
apt-get install -y nodes

2.  通过 lighttpd 中转到 80 端口

在直接运行 node run 一切正常之后,尝试用 httpd 服务器把服务代理到 80 端口。

2.1  仅允许本机访问 Node.js 的服务

修改 dr4ft 源代码中的 app.js ,把其中第 13 行开始的

var server = http.createServer(function(req, res) {
  send(req, req.url, { root: 'public' }).pipe(res)
}).listen(CONFIG.PORT)

改为

var server = http.createServer(function(req, res) {
  send(req, req.url, { root: 'public' }).pipe(res)
}).listen(CONFIG.PORT, CONFIG.IP)

以及编辑 config.server.js 文件的最后部分,把其中的

module.exports = {
  PORT: 1337,
  VERSION,
  STRINGS: {
    BRANDING: {
      DEFAULT_USERNAME: 'dr4fter',
    }
  }
}

改为

module.exports = {
  IP: '127.0.0.1',
  PORT: 1337,
  VERSION,
  STRINGS: {
    BRANDING: {
      DEFAULT_USERNAME: 'dr4fter',
    }
  }
}

之后重新执行 node run 启动服务就行了,dr4ft 服务就只能在本机通过 127.0.0.1 的 1337 端口访问到了。

2.2  配置 lighttpd 的反向代理

编辑 /etc/lighttpd/lighttpd.conf 文件,在其中加入:

$HTTP["host"] == "你的 dr4ft 服务的域名" {
  proxy.server  = ( "" => ("" => ( "host" => "127.0.0.1", "port" => 1337 )))
}

然后重启 lighttpd 服务就行了。

3.  怎样把新系列的牌更新进来

3.1  跟着官方代码更新

如果时间足够久,跟着 dr4ft 官方代码更新程序和数据就行。具体步骤如下:

  1. git pull 更新 dr4ft 代码
  2. make run 从 mtgjson.com 下载最新牌张数据
  3. make cards 更新本地牌张数据缓存
  4. 重新执行 node run 把服务运行起来就行了

3.2  提前手工补充新系列的牌张数据

dr4ft 依赖的卡牌数据来自 mtgjson.com ,他家更新不算快。在新系列预览结束、售前现开还没开始的时候,其实完整的卡牌数据已经公开了,可以手工更新到 dr4ft 程序中。

  1. 访问 https://github.com/Cockatrice/Magic-Spoiler/tree/files 下载最新系列的 json 文件,比如依夏兰对应的是 XLN.json 。
  2. 编辑下载的这个 json 文件,搜索关键字“"Basic"”找到里头的 5 张基本地,把每张地的
     "rarity":"Common",
    行改为
     "rarity":"Basic Land",
    这样基本地就不会被当做普通稀有度的牌出现在补充包里了。
  3. 继续编辑下载的这个 json 文件,在文件内容末尾加入一个英文逗号“,”,在文件内容最开头加入“ "新系列缩写": ”,以 XLN.json 为例,编辑后的 json 文件大致长这样:
    "XLN":{
    ....
    },
  4. 编辑 data/AllSets.json 文件,把刚才修改完的新系列 json 文件的内容贴到 AllSets.json 文件中第一个 { 符号的后边。
  5. 编辑 public/src/app.js 文件,把其中第 30 行左右的
     sets: [
    后边跟的 6 个系列缩写名改成最新系列的,这样在 dr4ft 系统上默认开的就是最新系列呃包。
  6. 编辑 public/src/data.js 文件,在第 2 行
     expansion: {
    后边加入最新系列的全称和缩写,比如
     "Hour of Devastation": "HOU",
  7. 编辑 src/make/cards.js 文件,在第 315 行左右加入对最新系列牌张总数的调整,例如
     removeBonusCards("HOU", 199)
    这是因为从卡拉德许开始,系列中会有少量新手包中的牌,这些牌是不会出现在补充包里的,所以要干掉这些牌(这里写的数字应该包括本系列中地牌的数量,比如 依夏兰 系列对应的数字是 279)。
  8. 执行 make cards 更新本地卡牌缓存。
  9. 杀死旧服务进程,用 node run 重新启动服务即可。

4.  用 Supervisor 来启动 dr4ft 服务

参考类似文档 利用 Supervisor 配置 Servatrice 自动启动

编辑 /etc/supervisor/conf.d/dr4ft.conf 文件,加入如下内容(原先应该不存在这个文件):

[program:dr4ft]
command=node run
directory=/var/www/dr4ft/dr4ft
autorestart=true
user=nobody

其中 directory 是 dr4ft 源代码所在目录,需要 nobody 账号具有读权限(可能不需要写权限)。如果移动过 dr4ft 源代码的目录位置,那么有可能要重新执行一次 make install ,来修正安装过程中生成的一些文件软链接的位置。

  • 让 Supervisor 重新载入设置:
    supervisorctl reload
  • 如果遇到问题,可以检查日志:
    supervisorctl tail -f dr4ft

在重启 dr4ft 服务的时候,只要手工 kill 掉

 ps aux | grep node
看到的 带 app.js 的那个进程 就行了。因为 dr4ft 的 node 主进程会自动重启 app.js 服务,而 Supervisor 似乎管不了 node 主进程跑起来的 app.js 子进程。

如果不放心,可以检查一下 Supervisor 中与 dr4ft 相关的日志,看是否有持续不断的出错信息。如果杀掉的 node 进程不对,那么 Supervisor 在重启 dr4ft 服务的时候,会由于 1337 端口已经被占用而不断报错。

5.  稍微改善 Dr4ft 容易掉线的问题

有时候在 room 里排队,排一会儿就掉线了,这是服务器底层 engine.io 的 Polling 机制稳定性的问题,按这里的调整方法,似乎能稍稍改善一些。

  • 注意:Safari 似乎怎么调都没用。。Chrome 和 Firefox 基本上没啥问题。

编辑 app.js 文件的第 16 行,把

var eioServer = eio(server).on('connection', router)

改成

var eioServer = eio(server, { pingTimeout: 14000, pingInterval: 2500 }).on('connection', router)

这样改完之后,Dr4ft 似乎对浏览器与服务器之间长连接的网络稳定性容忍得更好了,因而掉线的概率也就变低了。

6.  其他可能要调整的

  • 删除 gcc 包和 cmake 包,以避免服务器万一被黑时,黑客能比较容易地编译自己的工具包。
    apt-get remove gcc make
    apt-get auto remove
GlossyBlue theme adapted by David Gilbert
Powered by PmWiki