使用Mup部署Rocket.Chat失败原因记录

Meteor Up

Meteor Up(简称Mup)是部署Meteor项目的最常用的两个手段之一(另一种方法是官方的Galaxy,收费),Mup有几个历史版本,现在笔者主要维护的是参考1中的版本。

Mup是一个用于部署Meteor项目到私有服务器(Galaxy是部署到Meteor官方的云中)的命令行工具(Mup需要在配置文件中配置SSH信息),Mup现在由Docket驱动,也就是说我们部署到服务器上的项目是装在Docker中的。和直接用Meteor(不配置数据库的情况下)运行不同,Mup会在服务器上创建两个容器,一个为Meteor项目创建,另一个为MongoDB创建,当然,一切都是可配置的。

部署Rocket.Chat过程一共遇到两个问题。

setup阶段的问题

一个是在setup阶段报错,信息如下:

1
2
3
4
...
When this process is not working you might encounter the following error:
'sudo: no tty present and no askpass program specified'
...

查阅一翻资料后返现出现上述记录的主要原因是因为服务器的权限问题,需要修改Ubuntu的sudoers文件。

在Shell中输入:

1
sudo visudo

把sudoers文件中的:

1
2
3
...
%sudo ALL=(ALL) ALL
...

修改为:

1
2
3
...
%sudo ALL=(ALL) NOPASSWD:ALL
...

即可。

deploy阶段的问题

mup部署的最后一步——检查,总是失败,终端界面输出的错误内容完全看不懂。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[xxx.xxx.xxx] x Verifying Deployment: FAILED
-----------------------------------STDERR-----------------------------------
rror.js:31:11)
at validateDatabaseName (/bundle/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/db.js:1767:70)
at new Db (/bundle/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/db.js:150:3)
at createServer (/bundle/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/mongo_client.js:199:3)
at connect (/bundle/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/mongo_client.js:324:12)
at Function.MongoClient.connect (/bundle/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/mongo_client.js:114:3)
at new MongoConnection (packages/mongo/mongo_driver.js:177:11)
at new MongoInternals.RemoteCollectionDriver (packages/mongo/remote_collection_driver.js:4:16)
at Object.<anonymous> (packages/mongo/remote_collection_driver.js:38:10)
at Object.defaultRemoteCollectionDriver (packages/underscore.js:784:19)
-----------------------------------STDOUT-----------------------------------
To see more logs type 'mup logs --tail=50'
----------------------------------------------------------------------------

而且由于时间Rocket.Chat项目特别大,有四五百兆,导致每次部署实验时间都要花上十几二十分钟(主要时间用于打包和上传),每次失败了都特别头痛。

而笔者又一直以为是Mup的Docker容器配置有问题,怀疑官方推荐的容器哪里没配置好。

这个事上个月就开始折腾了,最后试了几次以后放弃了,一个月的时间都改成手动部署(使用lszrz上传压缩包,手动解压部署)。

一直到今天下午,下班前空余时间拿自己的笔记本做测试,又失败了N次以后生无可恋,绝望地只能一行一行看mup的错误日志。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/bundle/bundle/programs/server/node_modules/fibers/future.js:280
throw(ex);
^
MongoError: database names cannot contain the character '.'
at Function.MongoError.create (/bundle/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb-core/lib/error.js:31:11)
at validateDatabaseName (/bundle/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/db.js:1767:70)
at new Db (/bundle/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/db.js:150:3)
at createServer (/bundle/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/mongo_client.js:199:3)
at connect (/bundle/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/mongo_client.js:324:12)
at Function.MongoClient.connect (/bundle/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/mongo_client.js:114:3)
at new MongoConnection (packages/mongo/mongo_driver.js:177:11)
at new MongoInternals.RemoteCollectionDriver (packages/mongo/remote_collection_driver.js:4:16)
at Object.<anonymous> (packages/mongo/remote_collection_driver.js:38:10)
at Object.defaultRemoteCollectionDriver (packages/underscore.js:784:19)

看到一行说数据库名中不能有点号,想了一下我这项目怎么会用在数据名中用点号,一瞬间触电,Rocket.Chat天坑啊,你说好好的一个项目名为什么要加个点号,导致测试部署用的mup配置文件也跟着写Rocket.Chat。

把mup配置文件中点号去掉,为了以防万一把本地的项目的文件目录名也改成了RocketChat,一切OK。

参考

  1. kadirahq/meteor-up - GitHub
  2. arunoda/meteor-up issue#335 - GitHub
  3. Rocket.Chat