##Setup your server (this would ideally be done with automated provisioning)
- add a deploy user with password-less ssh see this gist
- install forever
npm install -g forever
##Install flightplan
npm install -g flightplan
- in your project folder
npm install flightplan --save-dev
- create a flightplan.js file
var plan = require('flightplan');
var appName = 'node-app';
var username = 'deploy';
var startFile = 'bin/www';
var tmpDir = appName+'-' + new Date().getTime();
// configuration
plan.target('staging', [
{
host: '104.131.93.214',
username: username,
agent: process.env.SSH_AUTH_SOCK
}
]);
plan.target('production', [
{
host: '104.131.93.215',
username: username,
agent: process.env.SSH_AUTH_SOCK
},
//add in another server if you have more than one
// {
// host: '104.131.93.216',
// username: username,
// agent: process.env.SSH_AUTH_SOCK
// }
]);
// run commands on localhost
plan.local(function(local) {
// uncomment these if you need to run a build on your machine first
// local.log('Run build');
// local.exec('gulp build');
local.log('Copy files to remote hosts');
var filesToCopy = local.exec('git ls-files', {silent: true});
// rsync files to all the destination's hosts
local.transfer(filesToCopy, '/tmp/' + tmpDir);
});
// run commands on remote hosts (destinations)
plan.remote(function(remote) {
remote.log('Move folder to root');
remote.sudo('cp -R /tmp/' + tmpDir + ' ~', {user: username});
remote.rm('-rf /tmp/' + tmpDir);
remote.log('Install dependencies');
remote.sudo('npm --production --prefix ~/' + tmpDir + ' install ~/' + tmpDir, {user: username});
remote.log('Reload application');
remote.sudo('ln -snf ~/' + tmpDir + ' ~/'+appName, {user: username});
remote.exec('forever stop ~/'+appName+'/'+startFile, {failsafe: true});
remote.exec('forever start ~/'+appName+'/'+startFile);
});
##Deploy!
fly staging
orfly production
##Take it to the next level Run your node app as a system service so it runs after server reboots
I was working on my Vagrant Box and got these issues
localhost ● ok
✈ Local task finished after 16 s
✈ Connecting to 'XXX.XXX.XX.XX'
● Error connecting to 'XXX.XXX.XXX.XX': All configured authentication methods failed
The issue was with ssh connection, so I went up to my vagrant config file and added
config.ssh.forward_agent = true
Then I was able to run fly production and deploy to my vagrant box. Also, make sure to check your production server has node and forever installed correctly or else it will not work.