2017-03-06 62 views
0

我有一個Node.js項目對我們的客戶端機器是本地的,我希望能夠監控遠程位置以更改兩個文件(server.js & logging.js),自動停止節點服務器,在本地複製遠程更改的文件,並使用新複製的本地文件重新啓動服務器。監控遠程更改並自動將它們複製到本地

這將在我們的生產環境中用於部署經過sprint測試的更改,以便我們不必定期爲我們的服務部門運行安裝。

我永遠使用& Nodemon,兩者愉快地監控更改遠程文件(S),但只有重新啓動本地(不變)嘗試複製,所以這些變化沒有得到傳播到本地複製。

我打算在生產環境中使用Forever來幫助偶爾遇到本地服務器崩潰,所以理想情況下,任何解決方案都可以通過Forever的-c交換機運行。我也調查過使用他們的底層代碼chokidar,但沒有看到在複製上覆制文件的能力。

我們的部署環境都是基於Windows的,所以我使用的是Forever-Win,但是我們試圖通過我們正在運行的應用程序成爲平臺不可知論者。

可能類似於:

forever start --watch \\server\share\server.js --watch \\server\share\logging.js -c [remote monitoring copy locally package name] server.js

,我希望能找到一個已經存在,所以我沒有推出自己的NPM包。

This SO answer接近我在找什麼,但他正在監視一個日誌文件,而不是服務器本身。

This is another SO question這與我想解決的問題非常相似。

回答

0

我們結束了使用上永遠放棄,我不能讓它與Nodemon正常工作,並在同一時間觀看遠程目錄。我們認爲能夠在命令上推送代碼更改比在服務器崩潰時重啓服務更爲重要(根本不會經常發生這種情況)。當我們執行代碼推送時,無論如何都會重新啓動服務器。

我創建了一個名爲serverMon.js服務器監控文件,其中包含(見下面的鏈接代碼,我修改爲我自己的用途引文):

const fs = require('fs'); 
const child_process = require('child_process'); 

//production path 
var widgetPath = '\\\\server\\share\\sbSerialWidget\\'; 

var widgetFiles = ['sbNodeLog.js', 'server.js']; 
var passedInFileName, infile, outfile; 

for(var i = 0; i < widgetFiles.length; i++){ 
    fs.createReadStream(widgetPath + widgetFiles[i]).pipe(fs.createWriteStream(widgetFiles[i])); 
} 
//spawn server.js passing it's stdio, stderr, stdout back through this node instance 
server = child_process.spawn('node', ['server.js'], {stdio: 'inherit'}, function (error, stdout, stderr) { 
    if (error) { 
     console.log(error.stack); 
     console.log('Error code: ' + error.code); 
     console.log('Server.js error received: ' + error.signal); 
    } 
    console.log('Server.js STDOUT: ' + stdout); 
    console.log('Server.js STDERR: ' + stderr); 
}); 

server.on('exit', function (code) { 
    server.kill('SIGTERM'); 
    console.log('Child process exited with exit code '+code); 
}); 

這是通過包含在一個nodemon腳本觀看。 VBS文件:

CreateObject("Wscript.Shell").Run "nodemon serverMon.js --exitcrash --watch \\server\share\sbSerialWidget", 0, True

這又是由放置在一個%ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup CMD腳本運行,因此它會在開機.VBS腳本,所以我們的小部件串聯在後臺始終運行:

REM @echo off 
REM cls 
GOTO START 

:START 
IF EXIST "%ProgramFiles%\sbserialwidget\server.js" GOTO WIN32 
IF EXIST "%ProgramFiles(x86)%\sbSerialWidget\server.js" GOTO WIN64 
ECHO End start 
GOTO END 

:WIN32 
cls 
echo Inside 32 bit 
PUSHD "%ProgramFiles%"\sbserialwidget 
GOTO RUNVBS 
GOTO END 

:WIN64 
echo Inside 64 bit 
PUSHD "%ProgramFiles(x86)%"\sbSerialWidget 
GOTO RUNVBS 
GOTO END 

:RUNVBS 
echo Inside RUNVBS 
start runNodemon.vbs 
GOTO END 

:END 
popd 
EXIT 

我們最終在任務管理器運行node.exe,一個運行nodemon的三個實例,這是監控第二,serverMon.js,同時觀察上的遠程文件的更改,然後第三個服務器。 js作爲serverMon.js的子進程啓動。

引文:
Copying node files with streams and pipes

Spawning a node child server

0

你真的需要在這裏兩件事情:

  1. 同步您的文件有一些位置偏遠
  2. 重新啓動服務器時,他們改變

有幾個方法可以做到這一點。

例如,您可以在您的服務器上託管一個git repo,並從某處遠程推送它以更新代碼並觸發將重新部署和重新啓動服務器的git掛鉤。

或者您可以定期在您的服務器上運行腳本來檢查遠程回購,更新本地回購並重新啓動服務器。

或者您可以使用掛鉤到您正在更改的回購庫的CI服務,在測試通過時運行測試和部署。

請注意,在大多數這些方式中,我討論的是代碼回購,而不僅僅是具有硬編碼名稱的兩個文件,因爲它能夠重構代碼,添加文件等等的未來證明更多。但是,您也可以使用rsync,scp或sftp複製文件。有很多方法可以做到這一點,但爲此添加一些結構並使用一些經過測試的工具可以進行擴展並且從長遠來看很容易維護。

無論你做什麼,只要記住一件事:確保你可以驗證你下載之前,你運行它。所以絕對不要通過HTTP下載任何東西,除非你有一切加密簽名。並確保siggning過程也是安全的。 Git對此非常有用,因爲您可以驗證您要下載的內容。