2015-04-28 2 views
9

Ich habe eine Datei "ecosystem.json" für meine Knoten-App, die ich mithilfe von PM2 bereitstellen kann.Wie kann ich mithilfe von PM2 meine node.js-App in mehreren Umgebungen und auf demselben Server bereitstellen?

Ich habe versucht, es eine Reihe von verschiedenen Möglichkeiten, die Konfiguration, haben aber kein Glück hatte mein Ziel zu erreichen, das ist:

  • der Lage sein, entweder die Produktion oder Staging-Umgebung bereitstellen (derzeit beide auf demselben Server).
  • Bei der Bereitstellung sollte die andere ebenfalls ausgeführt werden.
  • Die 2 verschiedenen Umgebungen sollten

auf verschiedenen Ports (prod = 8000, staging = 3000) sein Was je nachdem, was Befehl bereitstellen passiert ist, ich zum ersten Mal Gewinne laufen.

Also wenn ich pm2 deploy production und dann pm2 deploy staging, nur die Produktion App/Port Combo läuft auf dem Server, und umgekehrt, wenn ich die Reihenfolge wechseln.

EDIT: Wenn ich das conf unten verwende, wird es 2 apps laufen in pm2 status, aber wenn ich eine netstat mache, sehe ich nur den ersten Port. (centos 6)

Ich fühle mich wie ich muss etwas offensichtlich fehlen. Hier ist meine ecosystem.json Datei, ich habe es mit und ohne mehrere App-Deklarationen oben versucht.

{ 
    /** 
    * Here we declare the apps that must be managed by PM2 
    * All options are listed here: 
    * https://github.com/Unitech/PM2/blob/master/ADVANCED_README.md#json-app-declaration 
    * 
    */ 
    apps : [ 
    { 
     "name"  : "myapp-staging", 
     "script"  : "app.js", 
     "instances" : "1", 
     "error_file" : "/var/log/nodejs/myapp.mydomain.com-staging-err.log", 
     "out_file" : "/var/log/nodejs/myapp.mydomain.com-staging-out.log", 
     "pid_file" : "/home/node/myapp.mydomain.com-staging.pid", 
     "exec_mode" : "cluster_mode", 
     "env_staging" : { 
     "NODE_ENV": "staging", "PORT": 3000 
     }, 
     "env_production" : { 
     "NODE_ENV": "production", "PORT": 8000 
     } 
    }, 
    { 
     "name"  : "myapp-production", 
     "script"  : "app.js", 
     "instances" : "1", 
     "error_file" : "/var/log/nodejs/myapp.mydomain.com-staging-err.log", 
     "out_file" : "/var/log/nodejs/myapp.mydomain.com-staging-out.log", 
     "pid_file" : "/home/node/myapp.mydomain.com-staging.pid", 
     "exec_mode" : "cluster_mode", 
     "env_production" : { 
     "NODE_ENV": "production", "PORT": 8000 
     } 
    } 

    ], 


    /** 
    * PM2 help you to deploy apps over your servers 
    * For more help go to : 
    * https://github.com/Unitech/PM2/blob/master/ADVANCED_README.md#deployment-pm2--090 
    */ 
    deploy : { 
    production : { 
     user : "node", 
     host : "node01.mydomain.com", 
     ref : "origin/master", 
     repo : "[email protected]:mydomain/mydomain-myapp.git", 
     path : "/var/production/myapp.mydomain.com-production/", 
     "post-deploy" : "npm prune && npm install -l && pm2 startOrGracefulReload ecosystem.json --env production", 
     env : { 
     NODE_ENV: "production", 
     PORT: 8000 
     } 
    }, 
    staging : { 
     user : "node", 
     host : "node01.mydomain.com", 
     ref : "origin/master", 
     repo : "[email protected]:mydomain/mydomain-myapp.git", 
     path : "/var/production/myapp.mydomain.com-staging/", 
     "post-deploy" : "npm prune && npm install -l && pm2 startOrGracefulReload ecosystem.json --env staging", 
     env : { 
     NODE_ENV: "staging", 
     PORT: 3000 
     } 
    } 
    } 
} 

Antwort

6

Beantworten Sie meine eigene Frage hier. Obwohl dies keine perfekte Lösung ist, besteht die Art und Weise, wie ich dies erreicht habe (vorerst), darin, dass ich zwei separate ökosystem.json-Dateien verwende, eine für jede Umgebung. Ich habe ecosystem.json Setup für Staging und Ökosystem-prod.json Setup für die Produktion.

jetzt also zum Staging implementieren ich einen Standard: pm2 deploy staging und für die Produktion muss ich eine etwas wortreich: pm2 deploy ecosystem-prod.json production

Offensichtlich nicht ideal, aber bis mir jemand anders sagt, ist vielleicht der einzige Weg, es zu tun auf der gleichen Box mit verschiedenen Ports.

+0

Ich kam zu der gleichen Schlussfolgerung und würde mich freuen, eine bessere Lösung zu finden. Vorteil ist, dass die Namen in pm2 unter verschiedenen Namen erscheinen. Z.B. App-Staging und App-Prod – Bryan

0

Was ist Ihre Version von nodejs?
Ich kann sehen, dass Sie PM2 im Cluster-Modus mit 1 Instanz betreiben.
Pm2 im Cluster-Modus verwendet Custer-Modul von Nodejs, die bis Version 0.12.x nicht sehr effektiv entwickelt wurde.
Wenn dies der Fall ist, ist Ihre Knotenversion < 0.12.x dann ein bekanntes Problem.

Aktualisieren Sie Ihre Knotenversion und das Problem wird gelöst.

0

Sie können eine Shell-Umgebungsvariable verwenden und dann Javascript in der pm2-Konfigurationsdatei verwenden. Zum Beispiel, wenn Sie Ihre Konfigurationsdatei hat ...

"apps": [ 
    { 
     "script": "app/server.js", 
     "PORT" : process.env.NODE_ENV == "development" ? 8888 : 9999, 
     "name": "MemsharpWeb-" + process.env.NODE_ENV, 

Und Sie PM2 von der Kommandozeile wie diese

NODE_ENV=production pm2 start config.json 

die Portnummer wird bis 9999 eingestellt werden.

Verwandte Themen