轉自: https://www.douban.com/note/321815809/
其實node.js的部署並不是什么特別大的問題,有nvm,有npm,多數情況下其實部署並不是什么令人感到頭痛的問題。
實體機上的部署可以參考:
1、node.js部署最佳實踐
http://www.douban.com/note/265207425/
2、forever結合chkconfig將網站啟動和關閉都開機自服務化
http://www.douban.com/note/318448663/
3、mean.io的BUG
http://www.douban.com/note/318584640/
============================================
但是如果想做到稍稍自動化一些,docker可能是最近的一個比較好的選擇。
那么思路上來說,將你的node.js app打包成docker的image的手工步驟應該分解成幾步呢?
1、創建一個最小的裸image
2、安裝必要的依賴,比如g++
3、安裝node.js本身,並且要選擇好版本,必要時可以使用nvm
4、將app的裸代碼拷貝的建立的image當中去
5、運行npm install加載依賴(在這之前可以修改npm的repos為http模式,加快速度)
6、運行必要的自動化測試並報告結果
7、按照某種約定暴露該服務的端口號給host機
8、使用pm2或者是forever將該app服務化,並配置為開機啟動
9、調整express等模塊的運行模式,生產模式或其它
10、復雜的項目如果依賴JAVA,那么自動化部署java到image就是第一步了
11、導出剛才的那個image為打包文件?
see,很簡單吧?
好吧。。。。。。。。。。。。
==========================================
看來主要要從Dockfile入手了,說起來就像Makefile一樣簡單的東西,不是么
OK,讓我們來看看有沒有現成的項目
https://github.com/adamalex/docker-urlarchiver/blob/master/Dockerfile
http://oskarhane.com/create-a-nodejs-docker-io-image/
OK,抽出共性
得到第一版本的Dockfile就是
#從12.10開始搞
FROM ubuntu:12.10
#這里改成自己的
MAINTAINER lemonhall, lemonhall@gmail.com
#升級系統本身
RUN apt-get update && apt-get upgrade
#搞定大多數的c和c++模塊所需要的東西(不過這容易讓image變得很大)
RUN apt-get install python-software-properties python g++ make software-properties-common
#OK,加入node的二進制包倉庫,我們並不想從源碼編譯
RUN add-apt-repository ppa:chris-lea/node.js && apt-get update
#安裝 node.js
RUN apt-get install nodejs
==============================
將host機器上的項目首先打包好
tar zc --exclude node_modules --exclude .git -f app.tar.gz app
--exclude命令不打包node_modules和.git,這樣壓縮包的大小會非常小
然后
Dockfile里面開始添加用戶:
RUN useradd -m -d /home/node node
RUN usermod -a -G nobody node
接下來拷貝必要文件到虛擬機里:(這里需要變量化)
ADD app.tar.gz /home/node/
RUN su node
RUN cd /home/node/
RUN tar zxf app.tar.gz
RUN cd app
RUN npm install
===============================================
解析來的事情又需要ROOT權限了:
RUN npm install forever -g
a)在/etc/rc.d/init.d里面加上app這個文件
b)chmod +x app #使得文件可運行
c)chkconfig --add app #用這個命令來加入新的服務
app這個腳本文件可能需要代碼來生成,將某些變量加入進去,另外如果是express的項目,還得然該用戶可以選擇是否將環境變量先設置為生產模式
【NODE_ENV=production】
#!/bin/bash
# chkconfig: 2345 70 30
# description: app service
# processname: app #第一個進程名,后邊設置自啟動的時候會用到
PATH=/usr/local/bin/
start() {
echo "Starting app ..."
forever start /home/node/app/server.js
}
stop() {
echo "Stopping mean ..."
forever stop /home/node/app/server.js
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|force-reload)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart|force-reload}"
exit 2
esac
======================================
以上腳本存在幾個問題:
1、如果可以,最好還是將forever生成的log暴露給宿主機,這樣可以方便查看問題。
2、該腳本有一個注定的main.js的入口才可以,這個腳本的生成和修改看上去並不是那么自動化,比如如果項目依賴mongod等等,該怎樣搞的事情,從中間配置服務器哪里讀取某些依賴的配置項?
3、另外如果可以的話,應該是一條命令就可以出發目標image里面的service star和service stop這類的命令。
4、監控