Tech

在Dotcloud上搭建NodeJS+MongoDB环境

主要目的是练习KnockoutJS和Bootstrap,后台为了保持一致就用现成的NodeJS + MongoDB了。写好需要的功能,本地测试通过之后想试着布置一下,正好也可以了解Dotcloud架设这种环境的方法,网上没有现成的文档,有相关的文章,但不是用ExpressMongoskin写的,所以自己动手搭建了一个,现在把方法分享一下。

Dotcloud Configure

新建一个项目,目录结构和其他应用基本相同。忘了的话可以参考这篇架设Django的文章。根目录是kanoya-on-dotcloud,kanoya是NodeJS项目目录,目录中的文件列表如下:


kanoya-on-dotcloud/
├── kanoya
│   ├── app.js
│   ├── node_modules
│   ├── package.json
│   ├── public
│   ├── supervisord.conf
│   └── views
└── dotcloud.yml


kanoya-on-dotcloud下的dotcloud.yml文件指定使用什么语言和数据库:


www:
    type: nodejs
    approot: kanoya
data:
    type: mongodb

编辑supervisord.conf,指定NodeJS执行的主文件,目录(directory)通常不需要改:


[program:node]
command = node app.js
directory = /home/dotcloud/current

这两个是dotcloud用到的配置文件,注意它们的位置不在同一级。它们只和dotcloud有关,和NodeJS没关系。

NodeJS真正会用上的,主文件(app.js)不用说,没人会把本地都跑不起来的项目传上去,唯一要注意的是,listen端口必须是8080,不然会报502错误。关键是package.json文件,只是多加一个逗号就会导致出错,所以要仔细检查


{
  "name": "kanoya",
  "description": "Knockoutjs and nodejs",
  "version": "0.0.1",
  "homepage": "http://www.dmyz.org",
  "author": "Perchouli",
  "private": true,
  "main": "app.js",
  "dependencies": {
    "express": ">= 0.0.3",
    "mongodb": ">= 0.x",
    "mongoskin": ">= 0.x"
  },
  "engines": { "node": ">= 0.4.7" }
}

将整个项目文件push上去。

$ dotcloud push kanoya kanoya-on-dotcloud/
# upload kanoya-on-dotcloud/ ssh://dotcloud@uploader.dotcloud.com:443/kanoya
# rsync
building file list … done
上传的文件列表
……
03:15:17 —> All services have been initialized. Deploying code…
03:15:17 [www.0] The build started
03:15:18 [www.0] Fetched code revision rsync-1325733312349
03:15:21 [www.0]
03:15:21 [www.0]
03:27:32 [www.0] node: started
03:15:24 [www.0] The build finished successfully
03:15:24 —> Deploy finished

Deployment finished. Your application is available at the following URLs
www: http://kanoya-perchouli.dotcloud.com/

Log

顺便分享log文件的类型和查看方法,已经熟悉了可以跳过这一段。

Dotcloud上运行的服务看不到输出,所以log文件是很重要的记录。NodeJS主要是两种log文件。一是Deploy时,如果npm安装相应模块失败——通常都是package.json错误导致的——会直接给出log地址,比如:

10:47:28 [www.0] npm ERR! File: /home/dotcloud/rsync-1325760431049/kanoya/package.json
10:47:28 [www.0]
10:47:28 [www.0] npm ERR! JSON.parse Failed to parse package.json data.
10:47:28 [www.0] npm ERR! /home/dotcloud/rsync-1325760431049/kanoya/npm-debug.log

另一种是NodeJS用console.log命令输出的调试信息,位置在/var/log/supervior 下。可以用dotcloud ssh命令登录上去查看,也可以直接输出到本地:

$ dotcloud run kanoya.www “ls /var/log/supervisor/*.log | xargs cat” > local.log
$ dotcloud run kanoya.www “cat /home/dotcloud/rsync-1325760431049/kanoya/npm-debug.log” > local.log

MongoDB

经过上面的设置、调试,至少NodeJS是已经跑起来了,接着配置MongoDB。流程是:先用root帐号登录,创建一个新数据库,然后添加一个可以访问这个数据库的用户。

$ dotcloud info kanoya.data #如果dotcloud.yml里写的是db,这里就是kanoya.db
config:
    mongodb_password: dSTqWEhUzdrJcwHXXXXX #root的密码
datacenter: Amazon-us-east-1b
ports:
   -name: mongodb
    url: mongodb://root:dSTqWEhUzdrJcwHXXXXX@kanoya-perchouli-data-0.dotcloud.com:20661 #在NodeJS里要用到这个URL
type: mongodb
$ dotcloud run kanoya.data mongo
kanoya.data:PRIMARY> use admin
kanoya.data:PRIMARY> db.auth(“root”,”dSTqWEhUzdrJcwHXXXXX”)
1
kanoya.data:PRIMARY> use kanoya #建立一个名为kanoya的collection(当数据库理解吧…)
kanoya.data:PRIMARY> db.addUser(“perchouli”,”mypassword”) #密码不要有@符号,至少我是失败了的…
kanoya.data:PRIMARY> db.items.insert({JSON格式的数据})
kanoya.data:PRIMARY> db.items.find() #查看数据插入是否成功

最后修改app.js。主要就是其中的mongourl了,SO上有回答说设置为 mongo:// 形式,但我加上前缀以后完全连接不上,最终成功运行的代码如下:


var mongoskin = require('mongoskin');
var express = require('express');
var app = express.createServer();
var mongourl = "perchouli:mypassword@kanoya-perchouli-data-0.dotcloud.com:20661/kanoya?auto_reconnect";
var db = mongoskin.db(mongourl);

//中间是各种app.configure

app.get('/', function(req, res){
    db.collection('items').find().toArray(function(err, items){
        res.render('item', { 'shopItems' :JSON.stringify(items) });
    })
});

app.listen(8080)

搭建结束,前台效果可以看 http://kanoya-perchouli.dotcloud.com/ ,后台代码在github上,还有其他问题欢迎评论。

0 0 投票数
文章评分
订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

2 评论
最新
最旧 最多投票
内联反馈
查看所有评论
沈振宇
12 年 前

新年快乐呀。有空更新一下插件吧,尤其是把style拿出来。

多说项目里用了三个nodejs项目,lessc, handlebarsjs, uglifyjs.
未来可能还会用node搭socket.io