/slurpee

A suite of built-in and expandable command line tools to help you manage and deploy site environments.

Primary LanguagePHP

SBSR (Share, Build, Sync, Release) is a generic web application deployment recipe and configuration that works with deployer. It uses a common workflow and tasks which can be customized via a simple YAML configuration.

Requirements

It is assumed you have the following installed:

  • Git
  • PHP (Deployer Compatible Version)
  • Composer

Usage

If you're looking for how to install, skip to installing.

Note: All usage commands must be executed in the project folder where deployment was setup (the location of the deploy.yml file). At current, you cannot specify to deploy a specific site from another location.

Deployment

Deploying to a stage:

dep to <stage>

If deployment fails it may be the case that the current release available is already deployed, or that a previous deployment failed or was interrupted. SBSR will try to explain as best it can why the deployment failed and usually suggest to use the -F option to force deployment.

dep to <stage> -F

Database

Create a new database for the stage. This will create a database such as <stage>_<db.name>_new which:

dep db:create <stage>

You can now run whatever manual operations you need to on the database. If you make a mistake you can drop the new database:

dep db:drop <stage>

Note: that this will only drop the new database. Once a database is rolled out, there's no way using SBSR to remove it. You can only ever roll out a new database in its place.

If all your operations were run successfully, you can roll out the new database to the current:

dep db:rollout <stage>

Note: This will move <stage>_<db.name>, if it exists, to <stage>_<db.name>_old and move the new <stage>_<db.name>_new to <stage>_<db.name>, basically cycling the databases.

If you want to import a database you can execute the following:

dep db:import -I <file> <stage>

This will create a new database, and execute the SQL found in <file>. Keep in mind you still will need to roll it out to replace the current database.

To export a database, run:

dep db:export -O <file> <stage>

Syncing

Using the above import / export examples you can sync a database from any environment to any other environment. To sync the database from prod to dev for example, you can run:

dep db:export -O prod.sql prod
dep db:import -I prod.sql dev

Alternatively, if you just want to sync a database from the configured source, you can just run:

dep sync <stage>

NOTE: The sync command will also sync any shares that have been configured to sync from the source, so it is not only going to copy the database but also file storage.

Installing

As root, create a deployment user:

useradd -rm deploy

Become the user:

su - deploy

Clone SBSR:

git clone https://github.com/imarc/sbsr.git

Enter directory:

cd sbsr

Install Deployer and Dependencies:

composer install

Exit to return to root:

exit

Link the proxy command:

ln -s /home/deploy/sbsr/deploy.sh /usr/bin/dep

Initializing a Deployment Space

As root, create a directory for your deployments:

mkdir /var/www/example.com

Give your deploy user full domain over this fold directory. It is strongly suggested that you use ACLs to handle permissions since it enables default permissions to be added automatically:

chown -R deploy:deploy /var/www/example.com
setfacl -R -dm u:deploy:rwx /var/www/example.com
setfacl -R -m u:deploy:rwx /var/www/example.com

Become the deployment user:

su - deploy

Enter the directory:

cd /var/www/example.com

Copy the SBSR deploy.yml example into it:

cp /home/deploy/sbsr/deploy.yml ./

Edit the config accordingly. The deploy.yml example is heavily commented and explains each of the options in detail:

<editor> deploy.yml

Save and exit your editor. You can now set up your stages:

dep setup <stage>

Usually you will begin by setting up the production environment:

dep setup prod

This will create the requisite stage directories for prod, copy out any shares that exist in your version control repository to the shares directory for the stage, and create/rollout a new database for the stage.

Concepts

Build

(v.) The process of compiling a web site or application. In SBSR, this step is completed by a list of arbitrary commands.

Release

(n.) A release is a functional deployment of the web site or application. More strictly speaking, it is a revision of the code exported to a stage. Basically, it is the product of deployment.

(v.) The process in which the web site or application goes live. In SBSR, this step includes data migrations to post-launch cleanup.

Revision

(n.) A revision is a particular version of the web site or application code.

Share

(n.) A share is a file or directory that lives outside of version control and is shared across multiple deployments. Common shares include .env files, session / storage folders, etc.

(v.) The process of linking shares to a release during deployment.

Source

(n.) A source is a stage to which another stage is synchronized during deployment. For example you may wish, upon deploying dev to make sure that it synchronizes its database and user uploaded files from prod.

Stage

(n.) A stage is an environment where a web site or application may be put on display for viewing. A single site or application may have one or more "stages," e.g. dev, uat, prod.

Sync

(v.) The process in which data and shares are synchronized between a stage and its source.

Technical Notes

Postgres

The configured database user (default postgres, the root user) will need permission to create databases. If you're using the postgres user, it is strongly suggested that you use pg_hba.conf to enable the user to connect in a peer or trusted fashion to prevent having the password configured in your deploy.yml.

If you wish to change this user, you can give them permission to create databases with:

ALTER USER {{ user }} CREATDB;