UNPKG

@binpar/mupx

Version:

Production Quality Meteor / NodeJS Deployments

270 lines (234 loc) 7.92 kB
var nodemiral = require('nodemiral'); var fs = require('fs'); var path = require('path'); var util = require('util'); var _ = require('underscore'); var SCRIPT_DIR = path.resolve(__dirname, '../../scripts/linux'); var TEMPLATES_DIR = path.resolve(__dirname, '../../templates/linux'); exports.setup = function (config) { var taskList = nodemiral.taskList('Setup (linux)'); if (!config.containersConfig) { taskList.executeScript('Installing Docker', { script: path.resolve(SCRIPT_DIR, 'install-docker.sh') }); } taskList.executeScript('Setting up Environment', { script: path.resolve(SCRIPT_DIR, 'setup-env.sh'), vars: { appName: config.appName, port: config.env && config.env.PORT, host: ((config.env && config.env.ROOT_URL) || '').split('//').pop().replace(/\//g, ''), containersConfig: !!config.containersConfig, } }); if (config.setupMongo) { taskList.copy('Copying MongoDB configuration', { src: path.resolve(TEMPLATES_DIR, 'mongodb.conf'), dest: '/opt/mongodb/mongodb.conf', vars: { maxGBWiredTiger: config.maxGBWiredTiger } }); taskList.executeScript('Installing MongoDB', { script: path.resolve(SCRIPT_DIR, 'install-mongodb.sh'), vars: { mongoVersion: config.mongoVersion, mongoForceUpdate: config.mongoForceUpdate } }); } if (config.ssl) { taskList.copy('Copying SSL certificate bundle', { src: config.ssl.certificate, dest: '/opt/' + config.appName + '/config/bundle.crt' }); taskList.copy('Copying SSL private key', { src: config.ssl.key, dest: '/opt/' + config.appName + '/config/private.key' }); taskList.executeScript('Verifying SSL configurations', { script: path.resolve(SCRIPT_DIR, 'verify-ssl-configurations.sh'), vars: { appName: config.appName } }); } return taskList; }; function copyStartScriptAndDeployVerify(taskList, env, config, appName, deployCheckWaitTime, port, nDeploy) { const nDeployStr = (nDeploy && nDeploy > 1 ? nDeploy.toString() : ''); taskList.copy(nDeploy + '. Initializing start script port ' + port, { src: path.resolve(TEMPLATES_DIR, 'start.sh'), dest: '/opt/' + appName + '/config/start' + nDeployStr + '.sh', vars: { appName: appName, useLocalMongo: config.setupMongo, port: port, sslConfig: config.ssl, dockerimage: config.dockerimage, additionalDockerRunOptions: config.additionalDockerRunOptions, noMail: config.noMail, mupxNodeVersion: config.mupxNodeVersion, linkMongo: config.linkMongo, mongoVersion: config.mongoVersion, mongoForceUpdate: config.mongoForceUpdate, mailName: config.mailName, publishNetwork: config.publishNetwork, afterRunCommand: config.afterRunCommand, mongoUrlConfig: config.env['MONGO_URL'] || 'mongodb://mongodb:27017/' + appName, volumes: config.volumes, dockerName: appName + nDeployStr, } }); if (nDeploy && nDeploy > 1) { startAndVerify(taskList, appName, port, deployCheckWaitTime, nDeploy); } else { deployAndVerify(taskList, appName, port, deployCheckWaitTime, !!config.nextjs, config.mupxNodeVersion, nDeploy); } } exports.deploy = function (bundlePath, env, config) { var deployCheckWaitTime = config.deployCheckWaitTime; var appName = config.appName; var taskList = nodemiral.taskList("Deploy app '" + appName + "' (linux)"); taskList.copy('Uploading bundle', { src: bundlePath, dest: '/opt/' + appName + '/tmp/bundle.tar.gz', progressBar: config.enableUploadProgressBar }); copyEnvVars(taskList, env, appName); const ports = config.env['PORT']; for (var i = 0; i < ports.length; i += 1) { var port = ports[i]; if (port) { copyStartScriptAndDeployVerify(taskList, env, config, appName, deployCheckWaitTime, port, i + 1); } } return taskList; }; exports.reconfig = function (env, config) { var appName = config.appName; var deployCheckWaitTime = config.deployCheckWaitTime; var taskList = nodemiral.taskList("Updating configurations (linux)"); copyEnvVars(taskList, env, appName); const ports = config.env['PORT']; for (var i = 0; i < ports.length; i += 1) { var port = ports[i]; if (port) { startAndVerify(taskList, appName, port, deployCheckWaitTime, i + 1); } } return taskList; }; exports.restart = function (config) { var taskList = nodemiral.taskList("Restarting Application (linux)"); var appName = config.appName; var deployCheckWaitTime = config.deployCheckWaitTime; const ports = config.env['PORT']; for (var i = 0; i < ports.length; i += 1) { var port = ports[i]; if (port) { startAndVerify(taskList, appName, port, deployCheckWaitTime, i + 1); } } return taskList; }; exports.stop = function (config) { var taskList = nodemiral.taskList("Stopping Application (linux)"); const ports = config.env['PORT']; for (var i = 0; i < ports.length; i += 1) { var port = ports[i]; if (port) { //stopping port var nDeploy = i + 1; const nDeployStr = (nDeploy && nDeploy > 1 ? nDeploy.toString() : ''); taskList.executeScript(nDeploy + '. Stopping app port ' + port, { script: path.resolve(SCRIPT_DIR, 'stop.sh'), vars: { appName: config.appName + nDeployStr } }); } } return taskList; }; exports.start = function (config) { var taskList = nodemiral.taskList("Starting Application (linux)"); var appName = config.appName; var port = config.env.PORT; var deployCheckWaitTime = config.deployCheckWaitTime; const ports = config.env['PORT']; for (var i = 0; i < ports.length; i += 1) { var port = ports[i]; if (port) { startAndVerify(taskList, appName, port, deployCheckWaitTime, i + 1); } } return taskList; }; function installStud(taskList) { taskList.executeScript('Installing Stud', { script: path.resolve(SCRIPT_DIR, 'install-stud.sh') }); } function copyEnvVars(taskList, env, appName) { var env = _.clone(env); // sending PORT to the docker container is useless. // It'll run on PORT 80 and we can't override it // Changing the port is done via the start.sh script delete env.PORT; taskList.copy('Sending environment variables', { src: path.resolve(TEMPLATES_DIR, 'env.list'), dest: '/opt/' + appName + '/config/env.list', vars: { env: env || {}, appName: appName } }); } function startAndVerify(taskList, appName, port, deployCheckWaitTime, nDeploy) { const nDeployStr = (nDeploy && nDeploy > 1 ? nDeploy.toString() : ''); taskList.execute(nDeploy + '. Starting app port ' + port, { command: 'bash /opt/' + appName + '/config/start' + nDeployStr + '.sh' }); // verifying deployment taskList.executeScript(nDeploy + '. Verifying deployment port ' + port, { script: path.resolve(SCRIPT_DIR, 'verify-deployment.sh'), vars: { deployCheckWaitTime: deployCheckWaitTime || 10, appName: appName, port: port } }); } function deployAndVerify(taskList, appName, port, deployCheckWaitTime, isNextJS, mupxNodeVersion, nDeploy) { // deploying const nDeployStr = (nDeploy && nDeploy > 1 ? nDeploy.toString() : ''); if(isNextJS) { taskList.executeScript(nDeploy + '. Invoking deployment process (Node) port ' + port, { script: path.resolve(SCRIPT_DIR, 'deployNextJS.sh'), vars: { appName: appName, mupxNodeVersion: mupxNodeVersion, nDeploy: nDeployStr } }); } else { taskList.executeScript(nDeploy + '. Invoking deployment process (Meteor) port ' + port, { script: path.resolve(SCRIPT_DIR, 'deploy.sh'), vars: { appName: appName, mupxNodeVersion: mupxNodeVersion, nDeploy: nDeployStr } }); } // verifying deployment taskList.executeScript(nDeploy + '. Verifying deployment port ' + port, { script: path.resolve(SCRIPT_DIR, 'verify-deployment.sh'), vars: { deployCheckWaitTime: deployCheckWaitTime || 10, appName: appName, port: port } }); }