@binpar/mupx
Version:
Production Quality Meteor Deployments
212 lines (174 loc) • 5.52 kB
JavaScript
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'
});
taskList.executeScript('Installing MongoDB', {
script: path.resolve(SCRIPT_DIR, 'install-mongodb.sh')
});
}
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;
};
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);
taskList.copy('Initializing start script', {
src: path.resolve(TEMPLATES_DIR, 'start.sh'),
dest: '/opt/' + appName + '/config/start.sh',
vars: {
appName: appName,
useLocalMongo: config.setupMongo,
port: env.PORT,
sslConfig: config.ssl,
dockerimage: config.dockerimage,
noMail: config.noMail,
mailName: config.mailName,
publishNetwork: config.publishNetwork,
afterRunCommand: config.afterRunCommand
}
});
deployAndVerify(taskList, appName, env.PORT, deployCheckWaitTime, !!config.nextjs);
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);
startAndVerify(taskList, appName, env.PORT, deployCheckWaitTime);
return taskList;
};
exports.restart = function (config) {
var taskList = nodemiral.taskList("Restarting Application (linux)");
var appName = config.appName;
var port = config.env.PORT;
var deployCheckWaitTime = config.deployCheckWaitTime;
startAndVerify(taskList, appName, port, deployCheckWaitTime);
return taskList;
};
exports.stop = function (config) {
var taskList = nodemiral.taskList("Stopping Application (linux)");
//stopping
taskList.executeScript('Stopping app', {
script: path.resolve(SCRIPT_DIR, 'stop.sh'),
vars: {
appName: config.appName
}
});
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;
startAndVerify(taskList, appName, port, deployCheckWaitTime);
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) {
taskList.execute('Starting app', {
command: "bash /opt/" + appName + "/config/start.sh"
});
// verifying deployment
taskList.executeScript('Verifying deployment', {
script: path.resolve(SCRIPT_DIR, 'verify-deployment.sh'),
vars: {
deployCheckWaitTime: deployCheckWaitTime || 10,
appName: appName,
port: port
}
});
}
function deployAndVerify(taskList, appName, port, deployCheckWaitTime, isNextJS) {
// deploying
if(isNextJS) {
taskList.executeScript('Invoking deployment process', {
script: path.resolve(SCRIPT_DIR, 'deployNextJS.sh'),
vars: {
appName: appName
}
});
} else {
taskList.executeScript('Invoking deployment process', {
script: path.resolve(SCRIPT_DIR, 'deploy.sh'),
vars: {
appName: appName
}
});
}
// verifying deployment
taskList.executeScript('Verifying deployment', {
script: path.resolve(SCRIPT_DIR, 'verify-deployment.sh'),
vars: {
deployCheckWaitTime: deployCheckWaitTime || 10,
appName: appName,
port: port
}
});
}