CloudFoundry 中部署 Node.js+MongoDB


大約記錄一下部署到 CloudFoundry 的情況

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# 建立一個獨立的環境來安裝需要的 VMC 指令
rvm gemset create cloudfoundry
rvm gemset use cloudfoundry
gem install vmc --no-rdoc --no-ri

# 安裝完成後可以查看可用指令
vmc --help

# 先設定 API 位置之後登入
vmc target api.cloudfoundry.com
vmc login

# 登入時會出現以下介面
Email: [輸入註冊時的電郵]
Password: [輸入註冊時的位置]
Successfully logged into [http://api.cloudfoundry.com]

# 之後進入到自己的專案位置
# 同時通過 NPM 安裝依賴套件
cd ~/Project/Path
npm install

# 第一次新建的應用通過以下指令部署
vmc push

# 第一次時會有以下問題出現
Would you like to deploy from the current directory? [yN]: y
Application Name: [ProjectName] (應用名字)
Application Deployed URL: '[ProjectName] (應用名字).cloudfoundry.com'?
Detected a Node.js Application, is this correct? [yN]: y
Memory Reservation [Default:64M] (64M, 128M, 256M, 512M, 1G or 2G)
Creating Application: OK
Would you like to bind any services to '[ProjectName] (應用名字)'? [yN]: y
The following system services are available
1: mongodb
2: mysql
3: postgresql
4: rabbitmq
5: redis
Please select one you wish to provision: 1
Specify the name of the service [mongodb-隨機數]:
Creating Service: OK
Binding Service [mongodb-隨機數]: OK
Uploading Application:
Checking for available resources: OK
Processing resources: OK
Packing application: OK
Uploading (2K): OK
Push Status: OK
Staging Application: OK
Starting Application: OK

# 當部署完成後可以通過以下網址查看
http://[ProjectName].cloudfoundry.com

# 當需要更新整個應用時,進入相應目錄後用以下指令
vmc update [ProjectName]

# 當需要查看相關應用文件時(應用的檔案,日誌記錄)
vmc files [ProjectName]

# 上面的指令就會列出關於這個專案的目錄
- app (整個應用存放於此)
- logs (應用的日誌記錄)

# 輸入以下指令就可以進入對應目錄查看有什麼檔案
vmc files [ProjectName] logs
- stdout.log
- stderr.log

# 執行以下指令則會列出這檔案的內容
vmc files [ProjectName] logs/stdout.log

# 當部署應用屬於 Node.js 時需要注意以下幾點
1. 應用的 port, host 需要由 ENV 中取得
2. 目前測試時 require("abc.json") 會發生錯 (可能版本不同)

關於第一點可以通過以下方法修改 (以 expressjs 為例)

var port = (process.env.VMC_APP_PORT || 3000);
var host = (process.env.VCAP_APP_HOST || 'localhost');

app.listen(port, host);

否則可能會出現以下情況
Application state is undetermined, not enough information available.

如果還是解決不了可以再看上面的方法查看 stderr.log 了解

# 再者當部署的資料庫是 Node.js 時需要注意連結部份
if(process.env.VCAP_SERVICES){
var env = JSON.parse(process.env.VCAP_SERVICES);
var dsnObject = env['mongodb-1.8'][0]['credentials'];
var mongoDSN = "mongodb://" + dsnObject.username + ":" + dsnObject.password + "@" + dsnObject.hostname + ":" + dsnObject.port + "/" + dsnObject.db;
}else{
var mongoDSN = "mongodb://localhost/database";
}