A server deploy script designed to quickly deploy a site with release versions while simultaneously limiting downtime due to rollbacks, failed deploys, and simultaneous deploys.
The script creates a cache on the server and updates it via rsync
. After updating the cache, the build is copied into a numerically-ordered release folder then sym-linked a consistent directory for public access. This allows for rollbacks and recovery from failed deploys.
Throughout the entire deploy process, a lockfile is present to prevent simultaneous deploys.
I use rsync-deploy
to deploy chauncey.io; it's worked great for me! Still, I'd like some more eyes on the code before I make this release a v1
so if you have suggestions after trying out rsync-deploy
, please submit an issue and I'll take it into consideration.
In particular, notice the directory structure.
$ rsync-deploy --help
Usage : usage [options] [--]
If using .rsync-deploy-rc, run the script from the same directory.
Options:
-h|--help Display this message
-v|--version Display script version
-i|--init Initialize the deploy location
-d|--deploy Deploy the site
-r|--rollback Rollback to a previous version of the site
-u|--unlock Remove lockfile
Directory structure:
/var/www/chauncey.io/ # path_deploy_to
|- cache/ # dir_deploy_cache - rsync to save bandwidth
|- current # a symlink to the current release in releases/
|- deploy.lock # lock_file - help prevent multiple ongoing deploys
|- last_version # contains the number of the last release
'- releases/ # dir_deploy_releases - one subdir per release
|- 1/
|- 2/
|- 3/
'- ...
Be sure to first run rsync-deploy --init
, which will setup the site on your server!
Of course! However, if you're on OS X you may wish to use Bombich's rsync for improvements related to resource forks.
For better security, an ssh-key is required for use of this script. If you don't already use one, see this tutorial.
Add rsync-deploy.zsh
to one of the following:
- To
/usr/local/bin
, or similar - As a dependency in the root level of your project
Ensure it is executable:
chmod +x rsync-deploy.zsh
Customize then add .rsync-deploy-rc
to the root level of any project you wish to deploy, one file per project. Every variable seen here is required. Set them accordingly.
path_deploy_from="${PWD}" # read in the dir of the config file
path_deploy_to="/var/www/your-site-path-here" # important!
dir_deploy_cache="cache"
dir_local_stage="_builds/production"
username="ChaunceyGarrett" # important!
hostname="chauncey.io" # important!
port="22" # important!
ssh_key="$HOME/.ssh/id_rsa" # important!
dir_deploy_releases="releases"
keep_releases="9" # important!
lock_file="deploy.lock"
If you have feature suggestions, please open an issue. If you have contributions, open a pull request. I appreciate any and all feedback.
This script was inspired by Capistrano, Mina, and the like.
The author(s) of this module should be contacted via the issue tracker.