Shell Ruby PowerShell HTML Other
seth-reeser Merge pull request #832 from seth-reeser/develop-catapult
RedHat: Define software error reporting.
Latest commit ae8698b Jul 20, 2018

README.md

Catapult

Catapult

Catapult defines a best-practice infrastructure so you don't have to - it also aligns with Agile methodologies, like Scrum, to afford you everything you need to develop, deploy, and maintain a website with ease.

Catapult Infrastructure

πŸ’₯ Catapult is a complete website and workflow management platform built from leading and affordable technologies.

🌎 Our mission is to create a lean platform which orchestrates DevOps for website lifecycles with familiar technologies.

πŸš€ Our vision is to afford organizations reduced risk and improved performance while lowering barriers to entry.


Do you need a website and workflow management platform? Here are a few triggers.

  • Production is down.
  • We need a test site.
  • Why is this costing so much?
  • Are my environments safe?
  • Is my website backed up?
  • How quickly can I recover my website after a disaster?
  • Can I easily scale my website for more traffic?
  • What is my uptime?

What makes Catapult different?

  • Catapult is an open source, complete, and distributed architecture
  • Catapult only orchestrates - it is not required to run your infrastructure
  • Catapult uses platform native shell scripting rather than configuration management tools such as Chef, Puppet, or Salt
  • Catapult features Gitflow workflow while enforcing exactly matching, branch-driven environments
  • Catapult features a unique software workflow model - upstream or downstream
  • Catapult overlays seamlessly with Scrum methodology
  • Catapult is very cost effective

Go ahead, give Catapult a shot.

Security Disclosure

Security is very important to us. If you have any issue regarding security, please disclose the information responsibly by sending an email to security@devopsgroup.io and not by creating a GitHub issue.

Platform Overview

Catapult orchestrates the following key components of DevOps to provide you with a full-featured infrastructure. Implementing both a Red Hat stack for PHP software and a Windows stack for .NET software.

Catapult Platform Topology

  • Security Management
    • Configuration Secrets - GnuPG Encryption
  • Source Code Management
    • Catapult - Git (via GitHub)
    • Websites - Git (via GitHub or Bitbucket)
  • Environment Management
    • Vagrant
  • Environment Virtualization
    • Local
      • VirtualBox - Red Hat and Windows
    • Cloud
      • DigitalOcean - Red Hat
      • AWS - Windows
  • DNS Management
    • Local
      • vagrant-hostmanager
    • Cloud
      • CloudFlare
  • Release Management
    • Automated Deployments - Atlassian Bamboo Server
    • Continuous Integration - Branch-based environments with Git triggers
  • Monitoring and Performance
    • Server Resources - New Relic Servers
    • Application Performance - New Relic APM
    • Browser Performance - New Relic Browsers
    • Website Availability - New Relic Synthetics

Supported Software

Catapult intelligently manages the following software that has been chosen from trending usage statistics from BuiltWith and aligns with the CentOS 7 trunk along with the Software Collections trunk:

Software Key Required PHP Version Defined PHP Version Released End-of-Life
CodeIgniter 2 codeigniter2 5.1.6 5.4 January 28, 2011 October 31, 2015
CodeIgniter 3 codeigniter3 5.6 5.6 March 30, 2015
Drupal 6 drupal6 5.4 5.4 February 13, 2008 February 24, 2016
Drupal 7 drupal7 5.2.5 5.6 January 5, 2011
Drupal 8 drupal8 5.5.9 7.1 November 19, 2015
Elgg 1 elgg1 5.4 5.4 August 20, 2008
Elgg 2 elgg2 5.6 5.6 December 14, 2015
ExpressionEngine 3 expressionengine3 5.3.10 5.4 October 13, 2015
Joomla 3 joomla3 5.3.10 5.6 September 27, 2012
Laravel 5 laravel5 7.0.0 7.0 February 4, 2015
MediaWiki 1 mediawiki1 5.5.9 5.6 December 8, 2003
Moodle 3 moodle3 5.6.5 5.6 November 16, 2015
SilverStripe 3 silverstripe3 5.3.3 5.4 June 29, 2012
SuiteCRM 7 suitecrm7 5.5 5.6 October 21, 2013
WordPress 4 wordpress4 5.2.4 7.0 September 4, 2014
XenForo 1 xenforo1 5.2.11 5.4 March 8, 2011
Zend Framework 2 zendframework2 5.3.23 5.4 September 5, 2012

Catapult additionally supports basic PHP projects that do not have a database requirement:

  • PHP 5.4 compatible project

Competition

The free market and competition is great - it pushes the envelope of innovation. Here, we compare similar platforms to shed light on where we are and we're headed. Catapult's approach is holistic, meaning, there are no optional features - the platform includes everything in its default state and its default state is the only state of the platform. Some platforms offer and support optional third-party features that need configured - these are excluded.

Platform Feature Catapult Pantheon Acquia
Source Open Closed Closed
Subscription Feature Set Bundled Separated Separated
Traditional Tooling (VMs & Shell) βœ… ❌ ❌
Multi-Platform (Linux & Windows) βœ… ❌ ❌
Supported PHP Software 17 2 1
Supported .NET Software TBA ❌ ❌
Minimum Bundled
Monthly Cost
$40 $400 $134
Websites per Instance/Subscription Unlimited 1 1
Managed Workflow Git Flow (branch-based environments) ❌ ❌
Managed Software Workflow Model Upstream or Downstream ❌ ❌
Agile Methodology Focus Scrum ❌ ❌
Managed Continuous Integration βœ… ❌ ❌
Environments LocalDev, Test, QC, Production Multidev, Dev, Test, Live Dev Desktop, Dev, Stage, Prod
Exacting Configuration βœ… ❌2 ❌3
Approach Virtual Machine Container Virtual Machine
Data Center DigitalOcean and AWS Rackspace AWS
Scaling Vertical Horizontal Vertical
Scaling Management Manual Automatic Manual
Development Environment Unlimited Local 5 Cloud Unlimited Local
Development Environment Approach Exact Exact Similar
Dashboard - Control CLI CLI & Web CLI & Web
Dashboard - Monitor Web Web Web
Managed Public Git Website Repository Support GitHub & Bitbucket ❌ ❌
Managed DNS CloudFlare ❌ ❌
Managed Free HTTPS Certificates CloudFlare/Let's Encrypt ❌ ❌
Managed Server Monitoring New Relic ❌ Proprietary
Managed Application Error Logs New Relic Proprietary Proprietary
Managed Application Performance Monitoring New Relic ❌ ❌
Managed Browser Performance Monitoring New Relic ❌ ❌
Managed Synthetic Monitoring New Relic ❌ ❌

See an error or have a suggestion? Email competition@devopsgroup.io - we appreciate all feedback.

Table of Contents

Setup Catapult

Catapult requires a Developer Setup, Instance Setup, and Services Setup as described in the following sections.

Please Note:

  • You must run most commands from an elevated shell. For macOS and Linux, type sudo su in a terminal window, or for Windows, right-clicking on Command Prompt from the Start Menu and selecting "Run as Administrator".
  • It is advised to turn off any antivirus software that you may have installed during setup and usage of Catapult - tasks such as forwarding ports and writing hosts files may be blocked.
  • Virtualizaion must be enabled in the BIOS of the developer's workstation - follow this how-to to get started.
  • Using a VPN client during usage of LocalDev may result in lost communication between your workstation and the guests, requiring a vagrant reload to regain SSH and/or WinRM communication.

Developer Setup

Catapult is controlled via Vagrant and the command line of a developer's workstation - below is a list of required software that will need to be installed.

  • macOS workstations: Compatible and supported
  • Linux workstations: Compatible and supported
  • Windows workstations: Limited testing and support
  1. Vagrant
    • Using macOS?
      1. Ensure Xcode Command Line Tools are installed by running xcode-select --install from Terminal
      2. Download and install the latest version of Vagrant v1 from https://releases.hashicorp.com/vagrant/
    • Using Windows?
      1. Download and install the latest version of Vagrant v1 from https://releases.hashicorp.com/vagrant/
    • Using Linux (Debian, Ubuntu)?
      1. Download the latest version of Vagrant v1 respective to your architecture from https://releases.hashicorp.com/vagrant/ by running e.g. wget https://releases.hashicorp.com/vagrant/1.9.8/vagrant_1.9.8_x86_64.deb
      2. Install Vagrant using dpkg e.g. sudo dpkg --install vagrant_1.9.8_x86_64.deb
      3. Install Network File System (NFS) sudo apt-get install nfs-kernel-server
    • Using Linux (Fedora, Red Hat, Suse)?
      1. Download the latest version of Vagrant v1 respective to your architecture from https://releases.hashicorp.com/vagrant/ by running e.g. wget https://releases.hashicorp.com/vagrant/1.9.8/vagrant_1.9.8_x86_64.rpm
      2. Install Vagrant using yum e.g. sudo yum install vagrant_1.9.8_x86_64.rpm
  2. Vagrant Plugins
    1. Open your command line and install the following Vagrant plugins:
      1. vagrant plugin install vagrant-aws
        • Gem
      2. vagrant plugin install vagrant-digitalocean
        • Gem We maintain this project! GitHub
      3. vagrant plugin install vagrant-hostmanager
        • Gem We maintain this project! GitHub
      4. vagrant plugin install vagrant-vbguest
        • Gem
  3. VirtualBox
    • Using macOS?
      1. Download and install the latest version of VirtualBox from https://www.virtualbox.org/wiki/Downloads
    • Using Windows?
      1. Download and install the latest version of VirtualBox from https://www.virtualbox.org/wiki/Downloads
    • Using Linux (Debian, Ubuntu)?
      1. Download and install the latest version of VirtualBox using Advanced Packaging Tool (APT) sudo apt-get install virtualbox
    • Using Linux (Fedora, Red Hat, Suse)?
      1. Download and install the latest version of VirtualBox using Yellowdog Updater, Modifed (yum) sudo yum install virtualbox
  4. GPG2
    • Using macOS?
      1. Download and install GPG Suite from https://gpgtools.org
    • Using Windows?
      1. Download and install Gpg4win from http://gpg4win.org/download.html
    • Using Linux?
      1. GPG is included in the base distribution in most cases.
      2. If being prompted by the Passphrase GUI Agent, comment out 'use-agent' in ~/.gnupg/gpg.conf
  5. Git
  6. Terminal
    • Using macOS?
      1. The terminal in the base distrubitions are 100% compatible.
    • Using Windows?
      1. Download and install Cygwin from https://cygwin.com/install.html
        • Make sure to install the openssh package
      2. Run all Vagrant commands from within the Cygwin terminal.
        • Make sure to open Cygwin terminal as Administrator by right-clicking and selecting "Open as Administrator"
    • Using Linux?
      1. The terminal in the base distrubitions are 100% compatible.

Having your team use the same tools is beneficial to streamlining your workflow - below is a list of recommended software tools.

  1. Sublime Text 3
    1. Please download and install from http://www.sublimetext.com/3

Instance Setup

Catapult is quick to setup. You have the option of using GitHub (public) or Bitbucket (private) to store your Catapult instance. Your Catapult secrets are encrypted and safe, but please use your best judgment when choosing a destination for your Catapult instance.

  1. Fork Catapult
  2. SSH Key Pair
    1. Create a passwordless SSH key pair - this will drive authentication for Catapult.
      1. For instructions please see https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/
      2. Place the newly created passwordless SSH key pair id_rsa and id_rsa.pub in the ~/secrets/ folder.
  3. GPG Key
    1. Generate a GPG key - this will drive encryption for Catapult.
      1. NEVER SHARE THE KEY WITH ANYONE OTHER THAN YOUR TEAM.
      2. Spaces are not permitted and must be at least 20 characters.
      3. To create a strong key, please visit https://xkpasswd.net/
      4. Place your newly generated GPG key at ~/secrets/configuration-user.yml["settings"]["gpg_key"]
      5. It is recommended to print a QR code of the key to distribute to your team, please visit http://educastellano.github.io/qr-code/demo/
      6. Remember! Security is 99% process and 1% technology.
  4. GPG Edit Mode
    1. GPG Edit Mode is set at ~/secrets/configuration-user.yml["settings"]["gpg_edit"] (false by default) and is used to encrypt your Catapult configuration secrets using your GPG Key:
      1. ~/secrets/id_rsa as ~/secrets/id_rsa.gpg
      2. ~/secrets/id_rsa.pub as ~/secrets/id_rsa.pub.gpg
      3. ~/secrets/configuration.yml as ~/secrets/configuration.yml.gpg
    2. GPG Edit Mode requires that you are on your Catapult fork's develop branch.
    3. Running any Vagrant command (e.g. vagrant status) will encrypt your configuration, of which, will allow you to commit and push safely to your public Catapult fork.

Services Setup

Catapult is designed with a distributed services model, below are the required third-party services and their sign-up and configuration steps.

Service Product Use Case Monthly Cost
†Cloud Hosting: Red Hat (PHP) DigitalOcean 6 Web and Database Servers *$30+
†Cloud Hosting: Windows (.NET) Amazon Web Services (AWS) 6 Web and Database Servers *$80+
Source Code Repositories Atlassian Bitbucket Private Repositories Free
Source Code Repositories GitHub Public Repositories Free
Continuous Integration Amazon Web Services (AWS) Build Server **$0+
Continuous Integration Atlassian Bamboo Server Deployment Management $10
DNS CloudFlare Cloud DNS Free
Monitoring New Relic Application Performance Monitoring (APM), Browser, Server, and ***Synthetics Performance and Infrastructure Monitoring Free
Total †$40+

† Only one platform (Red Hat or Windows) is required to have a full-featured infrastructure. Generally speaking, the industry standard Red Hat platform will be used.

* Depending on load, resources may need to be increased, starting at an additional $5 per month per server.

** New AWS customers receive 1-year free of micro services. Beyond this period, an example of running nightly builds for all environments only incur $2-3 per month.

*** New Relic customers receive a trial "pro" period ranging from 14-days to 30-days, however, there is no free tier beyond the trial

1. Cloud Hosting:

  1. DigitalOcean sign-up and configuration
    1. Create an account at http://digitalocean.com
    2. Go to your DigitalOcean Applications & API Dashboard https://cloud.digitalocean.com/settings/api
      1. Create a Personal Access Token named "Vagrant" and place the token value at ~/secrets/configuration.yml["company"]["digitalocean_personal_access_token"]
    3. Go to your DigitalOcean Security Dashboard https://cloud.digitalocean.com/settings/security
      1. Add a new SSH Key named "Vagrant" with your newly created id_rsa.pub from ~/secrets/id_rsa.pub key
  2. Amazon Web Services (AWS) sign-up and configuration
    1. Create an account https://portal.aws.amazon.com/gp/aws/developer/registration
    2. Sign in to your new AWS console https://console.aws.amazon.com
    3. Go to your AWS Identity and Access Management (IAM) Users Dashboard https://console.aws.amazon.com/iam/home#users
      1. Create a "Catapult" user.
      2. Place the Access Key ID at ~/secrets/configuration.yml["company"]["aws_access_key"]
      3. Place the Secret Access Key at ~/secrets/configuration.yml["company"]["aws_secret_key"]
    4. Go to your AWS Identity and Access Management (IAM) Groups Dashboard https://console.aws.amazon.com/iam/home#groups
      1. Create a "Catapult" group.
      2. Attach the "AmazonEC2FullAccess" policy to the "Catapult" group.
    5. Go back to your AWS Identity and Access Management (IAM) Groups Dashboard https://console.aws.amazon.com/iam/home#groups
      1. Select your newly created "Catapult" group.
      2. Select Add Users to Group and add your newly created "Catapult" user.
    6. Go to your AWS EC2 Key Pairs Dashboard https://console.aws.amazon.com/ec2/home#KeyPairs
      1. Select "N. Virginia" from the top navigation
      2. Click Import Key Pair
      3. Add your newly created id_rsa.pub from ~/secrets/id_rsa.pub key
      4. Set the Key pair name to "Catapult"
    7. Go to your AWS EC2 Security Groups Dashboard https://console.aws.amazon.com/ec2/home#SecurityGroups
      1. Select the "default" Group Name
      2. Select the Inbound tab and click Edit
      3. Change Source to "Anywhere"
      4. Click Save

2. Repositories:

Bitbucket provides free private repositories and GitHub provides free public repositories, you will need to sign up for both. If you already have Bitbucket and GitHub accounts you may use them, however, it's best to setup a machine user if you're using Catapult with your team.

  1. Bitbucket sign-up and configuration
    1. Create an account at https://bitbucket.org
      1. Place the username (not the email address) that you used to sign up for Bitbucket at ~/secrets/configuration.yml["company"]["bitbucket_username"]
      2. Place the password of the account for Bitbucket at ~/secrets/configuration.yml["company"]["bitbucket_password"]
    2. Add your newly created id_rsa.pub from ~/secrets/id_rsa.pub key in https://bitbucket.org/account/user/`your-user-here`/ssh-keys/ named "Catapult"
  2. GitHub sign-up and configuration
    1. Create an account at https://github.com
      1. Place the username (not the email address) that you used to sign up for GitHub at ~/secrets/configuration.yml["company"]["github_username"]
      2. Place the password of the account for GitHub at ~/secrets/configuration.yml["company"]["github_password"]
    2. Add your newly created id_rsa.pub from ~/secrets/id_rsa.pub key in https://github.com/settings/ssh named "Catapult"

3. Automated Deployments:

Please note that Bamboo Cloud's end-of-life is January 31, 2017. For new setups, please use the Bamboo Server sign-up and set-up documentation. Existing Catapult user's may still be using Bamboo Cloud, in that case, please use the Bamboo Cloud sign-up and set-up documentation.

Bamboo Cloud sign-up and set-up

  1. Create a Bamboo Cloud account at https://www.atlassian.com/software/bamboo
  2. Sign in to your new custom Bamboo instance https://[your-name-here].atlassian.net
  3. Place your Bamboo base URL at ~/secrets/configuration.yml["company"]["bamboo_base_url"], the format should be https://[your-name-here].atlassian.net/builds/
  4. Click the settings gear from the top right in the header and select Elastic instances:
    1. Click Configuration from the left
    2. Click Edit configuration
      1. Amazon Web Services configuration
        1. Set your AWS EC2 "Bamboo" Access Key ID and Secret Access Key from ~/secrets/configuration.yml["company"]["aws_access_key"] and ~/secrets/configuration.yml["company"]["aws_secret_key"]
        2. Region: US East (Northern Virginia)
      2. Automatic elastic instance management
        1. Elastic instance management: Custom
        2. Idle agent shutdown delay: 10
        3. Allowed non-Bamboo instances: 1
        4. Maximum number of instances to start at once: 2
        5. Number of builds in queue threshold: 1
        6. Number of elastic builds in queue threshold: 1
        7. Average queue time threshold: 2
      3. Click Save
  5. Click the settings gear from the top right in the header and select Elastic instances:
    1. Click Image configurations from the left
      1. Disable all of the elastic images
      2. Create elastic image configuration:
        1. Name: Catapult
        2. AMI ID: ami-eb5b8080
        3. Instance type: T2 Burstable Performance Micro
        4. Availability Zone: Chosen by EC2
        5. Product: Linux/UNIX
        6. Click Save

Bamboo Server set-up

  1. Sign up for an Atlassian account at https://my.atlassian.com/
  2. Access your My Atlassian license section at https://my.atlassian.com/products/index
  3. It's now time to bring up your build server, please run vagrant up ~/secrets/configuration.yml["company"]["name"]-build
    • The initial up will take some time for, please be patient
  4. Login to DigitalOcean to obtain the IP address of the virtual machine to access via URL
    • Place your Bamboo base URL at ~/secrets/configuration.yml["company"]["bamboo_base_url"], the format should be http://[digitalocean-ip-here]/
  5. Once your Bamboo Server instance is accessible via URL, you will be prompted with a license prompt, enter your license.
  6. You will next be prompted to enter the following information:
    • Username (required) - root
    • Password (required) - specify a complex password
    • Confirm password (required)
    • Full name (required) - use ~/secrets/configuration.yml["company"]["name"]
    • Email - use ~/secrets/configuration.yml["company"]["email"]

Bamboo Configuration

To avoid having to manually configure the Bamboo project, plans, stages, jobs, and tasks configuration, you may optionally install and purchase the "Bob Swift Atlassian Add-ons - Bamboo CLI Connector" Bamboo add-on. Otherwise, the manual setup configuration steps are outlined below:

  1. Place your Bamboo username at ~/secrets/configuration.yml["company"]["bamboo_username"]
    • Normally admin for Bamboo Cloud
    • Normally root for Bamboo Server
  2. Place your Bamboo password at ~/secrets/configuration.yml["company"]["bamboo_password"]
  3. Disable anonymous user access by clicking the gear at the top right and going to Overview
    1. Next, under Security, go to Global permissions and remove Access from Anonymous Users
  4. Click Create > Create a new plan from the top navigation:
    1. Create Catapult Project and create BUILD Plan
      • Project and build plan name
        1. Project > New Project
        2. Project name: Catapult
        3. Project key: CAT
        4. Plan name: BUILD
        5. Plan key: BUILD
        6. Plan description:
      • Link repository to new build plan
        1. Repository host: Other > None
    2. Create Catapult Project and create TEST Plan
      • Project and build plan name
        1. Project > New Project
        2. Project name: Catapult
        3. Project key: CAT
        4. Plan name: TEST
        5. Plan key: TEST
        6. Plan description:
      • Link repository to new build plan
        1. Repository host: Other > None
    3. Create QC Plan
      • Project and build plan name
        1. Project: Catapult
        2. Plan name: QC
        3. Plan key: QC
        4. Plan description:
      • Link repository to new build plan
        1. Repository host: Other > None
    4. Create PROD Plan
      • Project and build plan name
        1. Project: Catapult
        2. Plan name: PROD
        3. Plan key: PROD
        4. Plan description:
      • Link repository to new build plan
        1. Repository host: Other > None
    5. Create WINTEST Plan
      • Project and build plan name
        1. Project: Catapult
        2. Plan name: WINTEST
        3. Plan key: WINTEST
        4. Plan description:
      • Link repository to new build plan
        1. Repository host: Other > None
    6. Create WINQC Plan
      • Project and build plan name
        1. Project: Catapult
        2. Plan name: WINQC
        3. Plan key: WINQC
        4. Plan description:
      • Link repository to new build plan
        1. Repository host: Other > None
    7. Create WINPROD Plan
      • Project and build plan name
        1. Project: Catapult
        2. Plan name: WINPROD
        3. Plan key: WINPROD
        4. Plan description:
      • Link repository to new build plan
        1. Repository host: Other > None

4. DNS:

  1. CloudFlare sign-up and configuration
    1. Create a CloudFlare account at https://www.cloudflare.com
    2. Sign in to your new CloudFlare account
    3. Visit your My Account section at https://www.cloudflare.com/a/account/my-account and scroll down to your Global API Key and place the token value at ~/secrets/configuration.yml["company"]["cloudflare_api_key"]
    4. Place the email address of the email address that you used to sign up for CloudFlare at ~/secrets/configuration.yml["company"]["cloudflare_email"]

5. Monitoring:

  1. New Relic sign-up and configuration
    1. Create a New Relic account at http://newrelic.com/
    2. Sign in to your New Relic account
    3. Go to your Account Settings > Integrations > API keys.
    4. Generate and place your REST API key at ~/secrets/configuration.yml["company"]["newrelic_api_key"]
    5. Generate and place your Admin API key at ~/secrets/configuration.yml["company"]["newrelic_admin_api_key"]
    6. Go to your Account Settings > Account > Summary.
    7. Place your License key at ~/secrets/configuration.yml["company"]["newrelic_license_key"]

6. Email:

  1. SendGrid sign-up and configuration
    1. Create a SendGrid account at https://sendgrid.com/
      1. Place the username that you used to sign up for SendGrid at ~/secrets/configuration.yml["company"]["sendgrid_username"]
      2. Place the password of the account for SendGrid at ~/secrets/configuration.yml["company"]["sendgrid_password"]
    2. Sign in to your SendGrid account
    3. Go to Settings > API Keys.
    4. Generate an API key named "Catapult" and place at ~/secrets/configuration.yml["company"]["sendgrid_api_key"]

7. Verify Configuration:

  1. To verify all of the configuration that you just set, open your command line and change directory into your fork of Catapult, then run vagrant status. Catapult will confirm connection to all of the Services and inform you of any problems.

Setup Environments

To start using Catapult you will need to Provision Environments and Configure Automated Deployments.

Provision Environments

Environment LocalDev Test QC Production
Server Provider Locally via VirtualBox Hosted via DigitalOcean Hosted via DigitalOcean Hosted via DigitalOcean
Server Provisioning Manually via Vagrant Manually via Vagrant Manually via Vagrant Manually via Vagrant

For each Environment you will need to:

  • Web Servers
    • vagrant up ~/secrets/configuration.yml["company"]["name"]-dev-redhat
    • vagrant up ~/secrets/configuration.yml["company"]["name"]-test-redhat
    • vagrant up ~/secrets/configuration.yml["company"]["name"]-qc-redhat
    • vagrant up ~/secrets/configuration.yml["company"]["name"]-production-redhat
  • Database Servers
    • vagrant up ~/secrets/configuration.yml["company"]["name"]-dev-redhat-mysql
    • vagrant up ~/secrets/configuration.yml["company"]["name"]-test-redhat-mysql
    • vagrant up ~/secrets/configuration.yml["company"]["name"]-qc-redhat-mysql
    • vagrant up ~/secrets/configuration.yml["company"]["name"]-production-redhat-mysql

Configure Automated Deployments

Once the Web and Database Servers are up and running, it's then time to configure your Bamboo Catapult project's TEST, QC, and PROD plans. To avoid having to manually configure the Bamboo project, plans, stages, jobs, and tasks configuration, you may optionally install and purchase the "Bob Swift Atlassian Add-ons - Bamboo CLI Connector" Bamboo add-on. Otherwise, the manual setup configuration steps are outlined below:

  1. Sign in to your new custom Bamboo instance ~/secrets/configuration.yml["company"]["bamboo_base_url"]
  2. Click Build > All build plans from the header:
  3. From the Build Dashboard and under the Catapult project:
    • Configure Catapult Project BUILD Plan
      1. Click the edit icon for the BUILD plan
      2. From the Stages tab, select Default Job
      3. Remove all tasks that may have been added by default during initial setup
      4. Click Add task
        1. Search for Script Task and select it
        2. Interpreter: shell
        3. Script Location: Inline
        4. Script body: bash /catapult/provisioners/redhat/provision.sh "build" "https://github.com/[your-name-here]/catapult" "~/secrets/configuration-user.yml["settings"]["gpg_key"]" "bamboo"
        5. Click Save
    • Configure Catapult Project TEST Plan
      1. Click the edit icon for the TEST plan
      2. From the Stages tab, select Default Job
      3. Remove all tasks that may have been added by default during initial setup
      4. Click Add task
        1. Search for SSH Task and select it
        2. Host: ~/secrets/configuration.yml["environments"]["test"]["servers"]["redhat"]["ip"]
        3. Username: root
        4. Authentication Type: Key without passphrase
        5. SSH Key: ~/secrets/id_rsa
        6. SSH command: bash /catapult/provisioners/redhat/provision.sh "test" "https://github.com/[your-name-here]/catapult" "~/secrets/configuration-user.yml["settings"]["gpg_key"]" "apache"
        7. Click Save
      5. Click Add task
        1. Search for SSH Task and select it
        2. Host: ~/secrets/configuration.yml["environments"]["test"]["servers"]["redhat_mysql"]["ip"]
        3. Username: root
        4. Authentication Type: Key without passphrase
        5. SSH Key: ~/secrets/id_rsa
        6. SSH command: bash /catapult/provisioners/redhat/provision.sh "test" "https://github.com/[your-name-here]/catapult" "~/secrets/configuration-user.yml["settings"]["gpg_key"]" "mysql"
        7. Click Save
    • Configure Catapult Project QC Plan
      1. Click the edit icon for the QC plan
      2. From the Stages tab, select Default Job
      3. Remove all tasks that may have been added by default during initial setup
      4. Click Add task
        1. Search for SSH Task and select it
        2. Host: ~/secrets/configuration.yml["environments"]["qc"]["servers"]["redhat"]["ip"]
        3. Username: root
        4. Authentication Type: Key without passphrase
        5. SSH Key: ~/secrets/id_rsa
        6. SSH command: bash /catapult/provisioners/redhat/provision.sh "qc" "https://github.com/[your-name-here]/catapult" "~/secrets/configuration-user.yml["settings"]["gpg_key"]" "apache"
        7. Click Save
      5. Click Add task
        1. Search for SSH Task and select it
        2. Host: ~/secrets/configuration.yml["environments"]["qc"]["servers"]["redhat_mysql"]["ip"]
        3. Username: root
        4. Authentication Type: Key without passphrase
        5. SSH Key: ~/secrets/id_rsa
        6. SSH command: bash /catapult/provisioners/redhat/provision.sh "qc" "https://github.com/[your-name-here]/catapult" "~/secrets/configuration-user.yml["settings"]["gpg_key"]" "mysql"
        7. Click Save
    • Configure Catapult Project PRODUCTION Plan
      1. Click the edit icon for the PRODUCTION plan
      2. From the Stages tab, select Default Job
      3. Remove all tasks that may have been added by default during initial setup
      4. Click Add task
        1. Search for SSH Task and select it
        2. Host: ~/secrets/configuration.yml["environments"]["production"]["servers"]["redhat"]["ip"]
        3. Username: root
        4. Authentication Type: Key without passphrase
        5. SSH Key: ~/secrets/id_rsa
        6. SSH command: bash /catapult/provisioners/redhat/provision.sh "production" "https://github.com/[your-name-here]/catapult" "~/secrets/configuration-user.yml["settings"]["gpg_key"]" "apache"
        7. Click Save
      5. Click Add task
        1. Search for SSH Task and select it
        2. Host: ~/secrets/configuration.yml["environments"]["production"]["servers"]["redhat_mysql"]["ip"]
        3. Username: root
        4. Authentication Type: Key without passphrase
        5. SSH Key: ~/secrets/id_rsa
        6. SSH command: bash /catapult/provisioners/redhat/provision.sh "production" "https://github.com/your-name-here/catapult" "~/secrets/configuration-user.yml["settings"]["gpg_key"]" "mysql"
        7. Click Save
    • Configure Catapult Project WINTEST Plan
      1. Click the edit icon for the WINTEST plan
      2. From the Stages tab, select Default Job
      3. Remove all tasks that may have been added by default during initial setup
      4. Click Add task
        1. Search for Script Task and select it
        2. Interpreter: shell
        3. Script Location: Inline
        4. Script body: python /catapult/provisioners/windows/provision.py "~/secrets/configuration.yml["environments"]["test"]["servers"]["windows"]["ip"]" "Administrator" "~/secrets/configuration.yml["environments"]["test"]["servers"]["windows"]["admin_password"]" "test" "https://github.com/[your-name-here]/catapult" "~/secrets/configuration-user.yml["settings"]["gpg_key"]" "iis"
        5. Click Save
      5. Click Add task
        1. Search for Script Task and select it
        2. Interpreter: shell
        3. Script Location: Inline
        4. Script body: python /catapult/provisioners/windows/provision.py "~/secrets/configuration.yml["environments"]["test"]["servers"]["windows_mssql"]["ip"]" "Administrator" "~/secrets/configuration.yml["environments"]["test"]["servers"]["windows_mssql"]["admin_password"]" "test" "https://github.com/[your-name-here]/catapult" "~/secrets/configuration-user.yml["settings"]["gpg_key"]" "mssql"
        5. Click Save
    • Configure Catapult Project WINQC Plan
      1. Click the edit icon for the WINQC plan
      2. From the Stages tab, select Default Job
      3. Remove all tasks that may have been added by default during initial setup
      4. Click Add task
        1. Search for Script Task and select it
        2. Interpreter: shell
        3. Script Location: Inline
        4. Script body: python /catapult/provisioners/windows/provision.py "~/secrets/configuration.yml["environments"]["qc"]["servers"]["windows"]["ip"]" "Administrator" "~/secrets/configuration.yml["environments"]["qc"]["servers"]["windows"]["admin_password"]" "qc" "https://github.com/[your-name-here]/catapult" "~/secrets/configuration-user.yml["settings"]["gpg_key"]" "iis"
        5. Click Save
      5. Click Add task
        1. Search for Script Task and select it
        2. Interpreter: shell
        3. Script Location: Inline
        4. Script body: python /catapult/provisioners/windows/provision.py "~/secrets/configuration.yml["environments"]["qc"]["servers"]["windows_mssql"]["ip"]" "Administrator" "~/secrets/configuration.yml["environments"]["qc"]["servers"]["windows_mssql"]["admin_password"]" "qc" "https://github.com/[your-name-here]/catapult" "~/secrets/configuration-user.yml["settings"]["gpg_key"]" "mssql"
        5. Click Save
    • Configure Catapult Project WINPROD Plan
      1. Click the edit icon for the WINPROD plan
      2. From the Stages tab, select Default Job
      3. Remove all tasks that may have been added by default during initial setup
      4. Click Add task
        1. Search for Script Task and select it
        2. Interpreter: shell
        3. Script Location: Inline
        4. Script body: python /catapult/provisioners/windows/provision.py "~/secrets/configuration.yml["environments"]["production"]["servers"]["windows"]["ip"]" "Administrator" "~/secrets/configuration.yml["environments"]["production"]["servers"]["windows"]["admin_password"]" "production" "https://github.com/[your-name-here]/catapult" "~/secrets/configuration-user.yml["settings"]["gpg_key"]" "iis"
        5. Click Save
      5. Click Add task
        1. Search for Script Task and select it
        2. Interpreter: shell
        3. Script Location: Inline
        4. Script body: python /catapult/provisioners/windows/provision.py "~/secrets/configuration.yml["environments"]["production"]["servers"]["windows_mssql"]["ip"]" "Administrator" "~/secrets/configuration.yml["environments"]["production"]["servers"]["windows_mssql"]["admin_password"]" "production" "https://github.com/[your-name-here]/catapult" "~/secrets/configuration-user.yml["settings"]["gpg_key"]" "mssql"
        5. Click Save

Release Management

Catapult follows Gitflow for its infrastructure configuration and website development model - each environment is branch-based and changesets are introduced into each environment by pull requests from one branch to the next.

Catapult Release Management

[1](#references)
LocalDev Test QC Production
Running Branch develop develop release master
Automated Deployments No, manually via vagrant provision Yes, triggered by new commits to develop Yes, nightly or manually via Bamboo Yes, nightly or manually via Bamboo
Testing Activities Component Test Integration Test, System Test Acceptance Test, Release Test Operational Qualification
Scrum Activity Sprint Start: Development of User Stories Daily Scrum Sprint Review Sprint End: Accepted Product Release
Scrum Roles Development Team Scrum Master, Development Team, Product Owner (optional) Scrum Master, Development Team, Product Owner Product Owner

Software Workflow

Catapult enforces a unique solution to Release Management of a website, Software Workflow. Software Workflow offers two modes, downstream or upstream, creating a "golden environment".

Catapult Software Workflow

Downstream

LocalDev Test QC Production
Downstream Software Workflow - Database Restore from develop ~/_sql folder of website repo Restore from develop ~/_sql folder of website repo Restore from release ~/_sql folder of website repo Auto-commit one backup per day (up to 500MB or 1) to master ~/_sql folder of website repo
Downstream Software Workflow - Untracked File Stores rsync file stores from Production rsync file stores from Production rsync file stores from Production
Downstream Software Workflow - Tracked File Stores Pull file stores from develop Pull file stores from develop Pull file stores from release Auto-commit file stores (up to 750MB each) to master of website repo

Note: Catapult will automatically pull the master branch into the develop branch of a website's repository when in the Downstream Software Workflow direction.

Upstream

LocalDev Test QC Production
Upstream Software Workflow - Database Restore from develop ~/_sql folder of website repo Auto-commit one backup per day (up to 500MB or 1) to develop ~/_sql folder of website repo Restore from release ~/_sql folder of website repo Restore from master ~/_sql folder of website repo
Upstream Software Workflow - Untracked File Stores rsync file stores from Test rsync file stores from Test rsync file stores from Test
Upstream Software Workflow - Tracked File Stores Pull file stores from develop Auto-commit file stores (up to 750MB each) to develop of website repo Pull file stores from release Pull file stores from master

Catapult Configuration

All Catapult configuration is stored in ~/secrets/configuration.yml and encrypted as ~/secrets/configuration.yml.gpg. There are three main sections - Company, Environments, and Websites.

Company

The exclusive Company entry contains top-level company information and service credentials, configured during Setup Catapult.

  • name:
    • required: yes
      • Your company's name or your name
  • email:
    • required: yes
      • The primary contact email
  • timezone_redhat:
    • required: yes
      • Your company's timezone in tz database format
      • See this list for a list of valid tz database format timezones
  • timezone_windows:
    • required: yes
      • Your company's timezone in Windows Standard Format
      • See this list for a list of valid Windows Standard Format timezones

The remaining keys include credentials to services, ideally rotated on a bi-annual basis. When rotated, all Bamboo builds need to be disabled and then the configuration changes merged into all branches of your Catapult's fork (develop > release > master), then builds enabled.

  • digitalocean_personal_access_token
  • bitbucket_username
  • bitbucket_password
  • github_username
  • github_password
  • bamboo_base_url
  • bamboo_username
  • aws_access_key
  • aws_secret_key
  • bamboo_password
  • cloudflare_api_key
  • cloudflare_email
  • newrelic_admin_api_key
  • newrelic_api_key
  • newrelic_license_key

Environments

The setup- and maintenance-free Environments entries contain environment configurations such as IP addresses and system credentials - all of which are automatically set during Setup Catapult and Setup Environments.

Websites

Adding websites to Catapult is driven by simple configuration. After establishing a repository at GitHub or Bitbucket, simply add entries to ~/secrets/configuration.yml. The entries must be ordered alphabetically by domain name and all entries exist under the single websites: key as reflected in this example:

websites:
  apache:
  - domain: devopsgroup.io
    repo: git@github.com:devopsgroup-io/devopsgroup-io.git
  - domain: example.com
    repo: git@github.com:example-company/example.com.git

The following options are available:

  • domain:
    • required: yes
    • example: domain: example.com
    • example: domain: subdomain.example.com
      • one subdomain level is supported for this root domain entry (subdomain.example.com)
      • this root domain entry is the Production canonical domain name without www.
        • a www. subdomain is created for you
        • the key for all management orchestration of this website
      • manages DNS of LocalDev (via hosts file) and Test, QC, Production (via CloudFlare)
        • dev.example.com, test.example.com, qc.example.com, example.com
  • domain_tld_override:
    • required: no
    • example: domain_tld_override: mycompany.com
      • a domain name under your name server authority to append to the top-level-domain (e.g. .com)
        • useful when you cannot or do not wish to host the Test/QC website at the domain
      • appends the domain_tld_override for Environments
        • dev.example.com.mycompany.com, test.example.com.mycompany.com, qc.example.com.mycompany.com, example.com.mycompany.com
      • PLEASE NOTE: When removing this option from a website with software:, you need to manually replace URLs in the database respective to the software_workflow: option.
        • ie vagrant ssh mycompany.com-test-redhat-mysql
        • wp-cli --allow-root --path="/var/www/repositories/apache/example.com/(webroot if applicable)" search-replace ":\/\/(www\.)?(dev\.|test\.)?(example\.com\.mycompany\.com)" "://example.com" --regex
  • force_auth:
    • required: no
    • example: force_auth: letmein
      • forces HTTP basic authentication in LocalDev, Test, QC, and Production (see force_auth_exclude)
      • letmein is both the username and password
  • force_auth_exclude:
    • required: no
    • dependency: force_auth:
    • example: force_auth_exclude: ["production"]
      • array of select environments ["dev","test","qc","production"] to exclude from the force_auth option
  • force_https:
    • required: no
    • option: force_https: true
      • rewrites all http traffic to https
      • all dev. domains in LocalDev will have an unsigned certificate warning
      • free certificates are created and managed for you compliments of CloudFlare (single-subdomain) and Let's Encrypt (multi-subdomain)
  • force_ip:
    • required: no
    • example: force_ip: ["208.80.154.224"]
      • an array of valid IPv4 or IPv6 addresses that denies all traffic except for traffic coming from the defined addresses
      • option applies to LocalDev, Test, QC, and Production unless force_ip_exclude is defined
      • can be used as an alternative to force_auth for when HTTP basic authentication cannot be used. e.g. Drupal 8 Basic Auth Module
      • can be used in addition to force_auth for added security
  • force_ip_exclude:
    • required: no
    • dependency: force_ip:
    • example: force_ip_exclude: ["production"]
      • array of select environments ["dev","test","qc","production"] to exclude from the force_ip option
  • repo:
    • required: yes
    • example: repo: git@github.com:devopsgroup-io/devopsgroup-io.git
      • the existing source code repository of your website (repo automatically created if none exists)
      • GitHub and Bitbucket over SSH are supported, HTTPS is not supported
  • software:
    • required: no
    • description: manages many aspects of software respective to each environment for websites with supported software types
      • maintains software database config file
      • manages tracked and untracked software file stores intelligently via git and rsync
      • manages permissions of software file store containers
      • manages software operations such as cron, garbage collection, and caches
      • manages software database migrations
      • manages software database backups and restores intelligently via git
      • manages software url references in database
      • manages software admininistrator account integrity
    • option: software: codeigniter2
    • option: software: codeigniter3
    • option: software: drupal6
    • option: software: drupal7
    • option: software: drupal8
    • option: software: elgg1
    • option: software: expressionengine3
    • option: software: joomla3
    • option: software: laravel5
    • option: software: mediawiki1
    • option: software: moodle3
    • option: software: silverstripe3
    • option: software: suitecrm7
    • option: software: wordpress4
    • option: software: xenforo1
    • option: software: zendframework2
  • software_auto_update:
    • required: no
    • dependency: software:
    • option: software_auto_update: true
      • manages software core and pluggable component (plugins, modules, etc) updates to the latest compatible versions using the software's CLI tool
      • updates only occur in the software_workflow environment
      • not all software is supported, see Software Updates and Fresh Installs
  • software_dbprefix:
    • required: no
    • dependency: software:
    • example: software_dbprefix: wp_
      • the value that prefixes table names within the database
        • PLEASE NOTE: table prefixes included in software distributions, such as WordPress' wp_, must be specified if desired
  • software_dbtable_retain:
    • required: no
    • dependency: software:
    • dependency: software_workflow: upstream
    • example: software_dbtable_retain: ["comments","commentmeta"]
      • array of tables, excluding the software_dbprefix:, to retain from the Production environment when software_workflow: is set to upstream
      • this will backup and commit a YYYYMMDD_software_dbtable_retain.sql file to ~/_sql
      • this is useful in a content regulated situation when moving a database upstream is necessary, however, needing to retain a table that includes, for example, a table of contact form submissions
  • software_workflow:
    • required: yes
    • dependency: software:
    • option: software_workflow: downstream
      • this option is useful for maintaining a website
      • specifies the Production environment and the master branch as the source and automated save point for software files and database
      • the master branch is automatically merged into the develop branch for convenience
    • option: software_workflow: upstream
      • this option is useful for launching a new website or maintaining a regulated website
      • specifies the Test environment and the develop branch as the source and automated save point for software files and database
      • REMINDER: websites with this option will have its Production instance overwritten with software files and datbase from the master branch - see Release Management
  • webroot:
    • required: no
    • example: webroot: www/
      • if the webroot differs from the repo root, specify it here
      • must include the trailing slash

Website Development

Performing development in a local environment is critical to reducing risk by exacting the environments that exist upstream, accomplished with Vagrant and VirtualBox.

Website Repositories

Repositories for websites are cloned into the Catapult instance at ~/repositories and in the respective apache or iis folder, listed by domain name.

  • Repositories are linked between the host and guest for realtime development.

Software Updates and Fresh Installs

Catapult enforces software configuration best practice for software fresh installs and updates. A typical software fresh install workflow would be to fork the software project on GitHub and add then add a new website entry to your ~/configuration.yml file. Given the broad spectrum of software requirements there are minor configuration caveats worth noting:

Software software_auto_update Support Install Approach Install Notes
codeigniter2 βœ… Follow the Installation Instructions.
codeigniter3 βœ… Follow the Installation Instructions.
drupal6 βœ… Drush drush pm-download drupal-6
drupal7 βœ… Drush drush pm-download drupal-7
drupal8 βœ… Drush drush pm-download drupal-8
elgg1 ❌ Fork Follow the installation Overview. Catapult requires the dataroot directory to be within the webroot, it's pertinant to create a .gitignore to ignore and .htaccess to deny access to this directory.
elgg2 ❌ Fork Follow the installation Overview. Catapult requires the dataroot directory to be within the webroot, it's pertinant to create a .gitignore to ignore and .htaccess to deny access to this directory.
expressionengine3 ❌ Download
joomla3 ❌ Fork
laravel5 ❌ Composer Follow the Composer Create-Project documentation.
mediawiki1 ❌ Fork
moodle3 βœ… Fork Catapult requires the moodledata directory to be within the webroot, it's pertinant to create a .gitignore to ignore and .htaccess to deny access to this directory.
silverstripe3 ❌ Composer Follow the Installing and Upgrading with Composer. During a fresh install, the database config file mysite/_config.php will need to be given 0777 permissions.
suitecrm7 ❌ Fork
wordpress4 βœ… Fork
xenforo1 ❌ Download
zendframework2 βœ… Fork Your best bet is to start from the zendframework/ZendSkeletonApplication GitHub project. Catapult assumes Zend Framwork is at the root of your repo and writes a database config file at config/autoload/global.php, you will also need to set webroot: public/ in your Catapult configuration.

HTTPS and Certificates

Catapult manages free Domain Validation (DV) certificates compliments of Cloudflare and Let's Encrypt automatically for all of your websites and optionally manages purchased certificates.

It's important to note that certificates are not dependent on protocols. Many vendors tend to use the phrase "SSL/TLS certificate", it may be more accurate to call them "certificates for use with SSL and TLS", since the protocols are determined by your server configuration, not the certificates themselves. It's likely you will continue to see certificates referred to as SSL certificates because at this point that’s the term more people are familiar, however, we're just calling them "certificates".

Browser Compatibility

Catapult tracks Mozilla's Operations Security (OpSec) team Security/Server Side TLS recommendations document and the "Intermediate" recommended configuration and is our objective to maintain at least an A rating with Qualys Labs. An important note is that Catapult does not support old browsers that do not support Server Name Indication (SNI). Here is Catapult's list of oldest compatible browsers:

  • Chrome 1
  • Internet Explorer 7 / Windows Vista
  • Internet Explorer 8 / Windows 7
  • Firefox 1
  • Safari 1

Purchased Certificates

Depending on your compliance needs you may need to purchase custom certificates unique to your orginization. Below is a table of the three different types of certificates that should be taken into account when auditing your compliance needs.

Feature Domain Validation (DV certificates) Organization Validation (OV certificates) Extended Validation (EV certificates)
Single Domain Certificate βœ… βœ… βœ…
Wildcard Certificate βœ… βœ… ❌
Multiple Domain Certificate βœ… βœ… βœ…
Cost $ $$ $$$
Issuing Process Automatic Application vetted by Certificate Authority Application vetted by Certificate Authority
Issuing Criteria: Domain Name(s) Ownership βœ… βœ… βœ…
Issuing Criteria: Organization Existence ❌ βœ… βœ…
Issuing Criteria: Organization Legal Existence ❌ ❌ βœ…
Industry Accepted Issuing Standard ❌ ❌ CAB EV SSL Certificate Guidelines
Standard Browser Padlock βœ… βœ… ❌
Greenbar Browser Padlock ❌ ❌ βœ…
Browser Compatibility Google Chrome 1+, Mozilla Firefox 1+, Internet Explorer 5+ Google Chrome 1+, Mozilla Firefox 1+, Internet Explorer 5+ Google Chrome 1+, Mozilla Firefox 3+, Internet Explorer 7+

Catapult optionally manages custom certificates purchased and issued by a Certificate Authority. The following files are required for Catapult to detect and use the custom certificate:

  • A bundled file that contains the Root Certificate Authority (CA) certificate and any Intermediate Certificate Authority certificates
    • CA root and intermediate certificate files can be combined like this cat COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt >> example_com.ca-bundle
  • The certificate file
  • The Certificate Signing Request (CSR) including the CSR file and private key file
    • Generated with openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr
    • Your Certificate Signing Request file
    • Your private key file

Here is an example of a certificate implemenation for example.com:

  • reporoot/_cert/example_com/example_com.ca-bundle
  • reporoot/_cert/example_com/example_com.crt
  • reporoot/_cert/example_com/server.csr
  • reporoot/_cert/example_com/server.key

Here is an example of a certificate implemenation for dev.example.com:

  • reporoot/_cert/dev_example_com/dev_example_com.ca-bundle
  • reporoot/_cert/dev_example_com/dev_example_com.crt
  • reporoot/_cert/dev_example_com/server.csr
  • reporoot/_cert/dev_example_com/server.key

Note: If you have a wildcard certificate, duplicate each environment directory and use the same set of files

Forcing www

Forcing www is generally software specific, unlike forcing the https protocol, which is environment specific and driven by the force_https option. To force www (why force www?), please follow the respective guides per software below.

For software that does not have specific documentation, please follow this generic .htaccess approach http://stackoverflow.com/a/4958847/4838803

Software Approach Documentation
codeigniter2
codeigniter3
drupal6 .htaccess
drupal7 .htaccess
drupal8 .htaccess
elgg1
expressionengine3
joomla3
laravel5
mediawiki1
moodle3
silverstripe3 mysite/_config.php http://api.silverstripe.org/3.1/class-Director.html -> http://stackoverflow.com/a/26865882
suitecrm7
wordpress4 Database http://codex.wordpress.org/Changing_The_Site_URL
xenforo1
zendframework2

Cache Busting

Caching plays a very important role in the performance of your website and enforces and recommends many performance optimizations. Catapult generally enforces caching of files to 7 days, because of this, to ensure that a new website release is reflected in a user's browser you should consider semantic versioning of website resource files. Here's an example:

<link rel="stylesheet" href="style.min.css?v=3.4.1">

Ready to deploy a new release? Update the version number and the cache will be "busted":

<link rel="stylesheet" href="style.min.css?v=3.4.2">

Each software type will vary as to the standard convention of website resource file versioning, here is a Wordpress example to get you started.

Progressive Web App

Progressive Web App (PWA), in general, is a term used to denote web apps that use the latest web technologies. Catapult allows a manifest.json file to be placed in your webroot. Note that this will be accessible regardless of whether or not you are using the force_auth option, which is necessary because manifest.json is sometimes accessed outside of the session under which you authenticated. Don't forget to include the link tag <link rel="manifest" href="/manifest.json"> to notify the browser of your manifest. More information regarding PWAs can be found at Google's Web App Manifest and Progressive Web App Checklist.

Email

Email delivery is an art, there are many considerations when trying to get an email into someone's inbox. Some considerations include, IP reputation, bounce management, analytics visibility, and more. For that reason, Catapult requires setup of a SendGrid account and configuration of SMTP within your website's software. To configure SendGrid with your website's software, please set the SMTP configuration to the following:

  • SMTP host: smtp.sendgrid.net
  • SMTP port: 587
  • Encryption: TLS
  • Authenticaion: yes
  • Username: ~/secrets/configuration.yml["company"]["sendgrid_username"]
  • Password: ~/secrets/configuration.yml["company"]["sendgrid_password"]

An example of implementation would be the WP Mail SMTP WordPress plugin.

Bounce Management

  • With SendGrid: Catapult automatically configures SendGrid to forward bounces to your ~/secrets/configuration.yml["company"]["email"] to clear hard bounces every 5 days and soft bounces every 3 days.
  • Without SendGrid: Postfix will retry sending every hour for five days. Catapult cron looks for bounces and emails them to your ~/secrets/configuration.yml["company"]["email"] daily.

Upload Limits

The following HTTP request limits are defined for all websites:

  • Maximum request body size excluding the size of any files being transported in the request (SecRequestBodyNoFilesLimit): 128 KB
  • Maximum request body size (SecRequestBodyLimit): 64 MB
  • Maximum size of post data allowed (post_max_size): 64 MB
  • Maximum size of an uploaded file (upload_max_filesize): 16 MB

Database Migrations

The best way to handle changes to the software's database schema is through a migrations system. Database migrations are software specific and are invoked via Catapult for you, here we outline the specifics:

Software Tool Command Documentation
codeigniter2 Migrations php index.php migrate https://ellislab.com/codeigniter/user-guide/libraries/migration.html
codeigniter3 Migrations php index.php migrate https://www.codeigniter.com/user_guide/libraries/migration.html
drupal6 Drush drush updatedb -y https://www.drupal.org/node/150215
drupal7 Drush drush updatedb -y https://www.drupal.org/node/150215
drupal8 Drush drush updatedb -y https://www.drupal.org/docs/8/api/update-api/introduction-to-update-api-for-drupal-8
elgg1
expressionengine3
joomla3
laravel5 Migrations php artisan migrate https://laravel.com/docs/5.0/migrations
mediawiki1 UpdateMediaWiki php maintenance/update.php https://www.mediawiki.org/wiki/Manual:Update.php
moodle3
silverstripe3 MigrationTask php framework/cli-script.php dev/tasks/MigrationTask http://api.silverstripe.org/3.3/class-MigrationTask.html
suitecrm7
wordpress4 WP-CLI wp-cli core update-db http://codex.wordpress.org/Creating_Tables_with_Plugins#Adding_an_Upgrade_Function
xenforo1
zendframework2

Refreshing Databases

  • Databases are dumped once per day to the ~/_sql folder and restored, dependent on the environment and software_workflow setting per website - see Release Management for details.
  • Leverage Catapult's workflow model (configured by software_workflow) to trigger a database refresh. From the develop branch, commit a deletion of today's database backup from the ~/_sql folder.

Connecting to Databases

Oracle SQL Developer is the recommended tool, to connect to and work with, databases. It is free, commercially supported, cross-platform, and supports multiple database types.

  • Download and install Oracle SQL Developer, some platforms require the Java SE Development Kit
  • Install third party JDBC drivers: Oracle SQL Developer uses JDBC, via a .jar file, to connect to different database types. To install a new JDBC connector, download the respective .jar file then from Oracle SQL Developer > Preferences > Database > Third Party JDBC Drivers, click Add Entry.4
  • Connecting to: LocalDev
    • The firewall allows direct connection to the database server.
      • From Oracle SQL Developer > View > Connections, add a New Connection with the respective environment's mysql user values in ~/secrets/configuration.yml.
  • Connecting to: Test, QC, Production
    • The firewall does not allow direct connect to the database servers.
      • From Oracle SQL Developer > View > SSH, add a New SSH Host in Oracle SQL Developer with the respective environment's web server host public ip address, root username with key file at ~/secrets/id_rsa.
        • Create a New Local Port Forward with the respective environment's database server host private ip address and port 3306.
      • From Oracle SQL Developer > View > Connections, add a New Connection with the respective environment's mysql user values in ~/secrets/configuration.yml.
        • The hostname will be localhost since we are forwarding the port through our local SSH tunnel.

Production Hotfixes

Always weigh the risk of not performing a production hotfix versus performing it, as production hotfixes require going outside of the normal development and testing workflow. Below is an example of how you can determine severity:

Ask key stakeholders the following questions and assign a 1 or 0 for the answer, then add up the total:

  • What is the organizational risk?
    • High = 1 or Low = 0
  • How many users does this effect?
    • Many = 1 or Few = 0
  • Is there a workaround?
    • No = 1 or Yes = 0
  • What is the user impact?
    • High = 1 or Low = 0

The total will determine the level of severity, typically a 4 would be considered a candidate for a production hotfix:

  • 0=Tolerate
  • 1=Trivial
  • 2=Minor
  • 3=Major
  • 4=Critical

Performing a production hotfix varies depending on the website's software type, software_workflow direction, and type of change (code or database).

  • software_workflow: downstream
    • Code
      1. In ~/configuration.yml, temporarily set the environments -> dev -> branch key to branch: master, and do not commit the change
      2. Provision any related LocalDev servers
      3. Develop, test, then commit any changes directly to the master branch
      4. Run the Production Bamboo build and verify the release
      5. Create a pull request and merge the master branch into the develop branch
      6. Set the environments -> dev -> branch key back to branch: develop
      7. Provision any related LocalDev servers
    • Database
      • Login to the Production website and make the change
        • (any database change that is beyond the direct capability of the software should not be taken out as a production hotfix)
  • software_workflow: upstream
    • Code
      1. In ~/configuration.yml, temporarily set the environments -> dev -> branch key to branch: master, and do not commit the change
      2. Provision any related LocalDev servers
      3. Develop, test, then commit any changes directly to the master branch
      4. Run the Production build and verify the release
      5. Create a pull request and merge the master branch into the develop branch
      6. Set the environments -> dev -> branch key back to branch: develop
      7. Provision any related LocalDev servers
    • Database
      1. Login to the Production and Test website and make the change
        • (any database change that is beyond the direct capability of logging into the software and safely making the change, should not be taken out as a production hotfix)
      2. From LocalDev and the develop branch of the website's repository, commit a deletion of today's (if exists) SQL dump file from within the ~/sql folder
        • (this ensures there is a known committed SQL dump of your change to the develop branch for when this branch is merged upstream)
      3. From LocalDev, temporarily checkout the master branch of the website's repository, make your change in the most recent SQL dump file from within the ~/sql folder
        • (this ensures that during the next Production build your change is not overwritten)

Automated Deployment Cycle

The automated deployment cycle releases changesets merged into respective environment branches for websites and your Catapult configuration, in addition to running server updates.

Environment Scheduled
LocalDev n/a, requires provision
Test 12:00 AM
QC 1:00 AM
Production 2:00 AM

Maintenance Cycle

A maintenance cycle is scheduled for defined times within the timezone that is defined within ~/secrets/configuration.yml at the timezone_redhat and timezone_windows value of the Company entry. This ensures system and website software is patched and other security controls are run within your infrastructure to automatically mitigate security vulnerabilites.

Daily

Daily maintenance occurs:

  • Red Hat - 3:05 AM
  • Windows - 2:00 AM

Daily maintenance includes:

  • Updating Operating System and server software
  • Rotating logs
  • Discovering mail which has failed to send

Weekly

Weekly maintenance occurs:

  • Red Hat - Sunday 3:25 AM
  • Windows - Sunday 3:00 AM

Weekly maintenance includes:

Servers will be rebooted when:

  • Red Hat - a kernel update is staged
  • Windows - Microsoft Update indicates a restart is required

Disaster Recovery

Being able to react to disasters immediately and consistently is crucial - Catapult affords you fast rebuilding and rollbacks.

Server Rebuilding

  • LocalDev is rebuildable by running vagrant destroy then vagrant up for the respective virtual machine.
  • Test, QC, and Production are rebuildable by running vagrant rebuild for the respective virtual machine - this is necessary (rather than a destroy and up) to retain the IP addresses of the machine.

Website Rollbacks

Production Website Rollbacks:

  • software_workflow: upstream
    • Files
      • Reverse the offending merge commit from the master branch and run the Production deployment.
    • Database
      • Reverse the offending merge commit from the master branch and run the Production deployment.
      • Note: The Production database is overwritten and restored from the latest sql dump file from Test in the ~/_sql folder.
  • software_workflow: downstream
    • Files
      • Reverse the offending merge commit from the master branch and run the Production deployment.
    • Database
      • Reverse the offending database dump auto-commit from the develop branch and manually restore the Production database from the desired sql dump file in the ~/_sql folder.
      • Note: The Production database is dumped once per day when the production build is run.

Security

Catapult enforces many security best practices that are important for you to be aware of and understand. These controls avoid, detect, counteract, or minimize security risks to the platform and visitors. The Lynis security auditing tool is used to evaluate and harden configuration of the system.

Preventive Controls

Edge

  • *DDoS protection
  • *Bad browser
  • *Bad IP from Project Honeypot and Cloudflare's Threat Score list

Server

  • Hardened kernel and network interface configuration
  • Hardened SSH configuration including key-only authentication
  • Strict firewall ruleset
  • Automatic weekly kernel updates

Application

Software

  • Strict directory and file permissions
  • Automatic software updates during a build

* This security feature only takes effect when the website's nameservers are set to CloudFlare

Detective Controls

  • ARPwatch (Address Resolution Protocol) notifies of changed MAC/IP pairings
  • Fail2Ban filters for sshd, sshd-ddos, and apache-botsearch
  • SysStat collects and stores system performance and usage activity
  • Weekly report of 404s and error keywords targeteted at the server and virtual hosts

Corrective Controls

  • Weekly ClamAV antivirus scan of website files

Data Protection

Catapult introduces many best practice data protection measures, however, security of personal data is ultimately your responsibility. Generally speaking, if personal information is compromised, you are required by law to notify the party. Laws vary country-by-country and state-by-state, and can be enforcable in the state or country where the individual is physically located when the data is collected. This means that, even if your website is hosted within the U.S., you could potentially be subject to another country's data protection laws. The main principles of data protection, include:

  • Privacy by design
  • Right to access
  • Right to be forgotten
  • Data portability
  • Breach notification

United States

Personally identifiable information (PII), in the U.S., is generally classified as an individual's first and last name in combination with a Social Security number, driver's license number, or financial account number. For more information, please see this list of data breach laws by U.S. state compiled by IT Governence.

Europe

The General Data Protection Regulation (GDPR) is a regulation in E.U. law on data protection and privacy for all individuals within the European Union that becomes enforceable starting May 25, 2018. Article 4(1) of the GPDR defines "personal data" as any information relating to an identified or identifiable natural person ('data subject'); an identifiable natural person is one who can be identified, directly or indirectly, in particular by reference to an identifier such as a name, an identification number, location data, an online identifier or to one or more factors specific to the physical, physiological, genetic, mental, economic, cultural or social identity of that natural person. For more information, please see the GPDR.

Compliance

There are many complex compliance and audit standards that are your responsibility to understand and execute. Each Catapult instance is independant to you - including the required services that you signed up for during Services Setup.

Cloud Compliance

Security of the cloud. This is the responsibility of the cloud service.

Service Catapult Context SOC 1 SOC 2 SOC 3
AWS EC2 US EAST Windows server hosting βœ… βœ… βœ…
BitBucket Repository hosting βœ…
DigitalOcean NYC3 Red Hat and Bamboo server hosting βœ… βœ…
GitHub Repository hosting
New Relic Server communication, log files βœ…

Self Compliance

Security in the cloud. This is your responsibility, however, the underlying service must have basic support for the compliance scenario.

Service Catapult Context HIPAA BAA PCI DSS Level 1
AWS EC2 US EAST Windows server hosting βœ… βœ…
CloudFlare (Pro) Web application firewall βœ…
BitBucket Repository hosting ❌
DigitalOcean NYC3 Red Hat and Bamboo server hosting ❓ ❓
GitHub Repository hosting ❓

See an error or have a suggestion? Email security@devopsgroup.io if confidential or submit a pull request - we appreciate all feedback.

Performance

Your website's performance is maximized with bandwidth, caching, and geographic optimizations. Catapult enforces these throughout every layer of your website, all in an effort to improve page loading times. Below is an example of the great performance gain of when page caching and CSS/JS aggregation are enabled for a Drupal website - all of which is managed by Catapult.

Catapult Performance

Please note: Any optimization that would impact development or component testing in LocalDev is disabled; this workflow aligns with the testing activites described in the Release Management section.

Bandwidth Optimizations

Bandwidth optimizations are made to lower the total bytes downloaded and decrease the amount of requests made by the browser.

Caching Optimizations

Caching is enabled for many layers of your website including storing pre-interpreted PHP in memory, storing page caches for certain software types, and storing files on visitor's local disk.

Geographic Optimizations

Shortening the physical distance between the server and visitor can trim priceless milliseconds from page loading time. (One might use this as an argument as to why browser caching and your overall caching strategy is so important.)

Recommended Optimizations

Catapult as a platform can only reach so far into the configuration of your website's software. Here are a few recommended development practices that will improve the performance of your website:

Google's PageSpeed Insights is a good tool to test for performance optimizations.

Performance Testing

Often disregarded, performance testing is a crucial component of quality assurance. The risks of neglecting performance testing include downtime, SEO impacts, gaps in analytics, poor user experience, and unknown ability to scale.

With Catapult's exactly duplicated configuration, even the Test environment can accurately represent the performance potential of the Production environment. ApacheBench is a powerful tool to test request performance and concurrency - OSX includes ApacheBench out of the box, while this StackOverflow post details how to get up and running on Windows.

ApacheBench enables us to profile request performance (-n represents the number of requests to perform) and concurrency (-c represents the number of multiple requests to make at a time) to test for performance, including common limits such as C10k and C10M.

Website Concurrency Maximum

Using a website with historical Google Analytics data, access the Audience Overview and find the busiest Pageview day from the past 30-days and then drill into that date. Find the hour with the most Pageviews, then the accompanying Avg. Session Duration. Using the following formula, we are able to find the Concurrency Maxiumum.

(Pageviews x Avg. Session Duration in seconds) / 3,600 seconds = Concurrency Maxiumum

Catapult Website Concurrency Maximum

365,000 pageviews per month

Take a website with an average of 500 pageviews per hour, or 365,000 pageviews per month, which has a busiest hour of 1,000 pageviews.

Pageviews Avg. Session Duration Total Session Seconds Concurrency Maxiumum
1,000 60 minutes (3,600 seconds) 3,600,000 1,000
1,000 10 minutes (600 seconds) 600,000 166
1,000 5 minutes (300 seconds) 300,000 88
1,000 1 minute (60 seconds) 60,000 16

100 concurrent requests performed 10 times

ab -l -r -n 1000 -c 100 -H "Accept-Encoding: gzip, deflate" http://test.drupal7.devopsgroup.io/

14,600 pageviews per month

Take a website with an average of 20 pageviews per hour, or 14,600 pageviews per month, which has a busiest hour of 100 pageviews.

Pageviews Avg. Session Duration Total Session Seconds Concurrency Maxiumum
100 60 minutes (3,600 seconds) 36,000 1,000
100 10 minutes (600 seconds) 60,000 16
100 5 minutes (300 seconds) 30,000 8
100 1 minute (60 seconds) 6,000 1.6

10 concurrent requests performed 10 times

ab -l -r -n 100 -c 10 -H "Accept-Encoding: gzip, deflate" http://test.drupal7.devopsgroup.io/

Interpreting Apache AB Results

Using a satisifed Apdex of 7 seconds, we can see that 98% of users would be satisfied.

Percentage of the requests served within a certain time (ms)
  50%     19
  66%     21
  75%     24
  80%     27
  90%     34
  95%   3968
  98%   6127
  99%   7227
 100%   7325 (longest request)

Troubleshooting

Below is a log of service related troubleshooting. If you're having issues related to Catapult, submit a GitHub Issue.

  • DigitalOcean
    • [09-01-2015] vagrant rebuild was failing with a The configured shell (config.ssh.shell) is invalid and unable to properly execute commands. it is due to DigitalOcean's API not re-inserting the SSH key that was originally used during the first vagrant up (creation of the droplet). To rebuild, you must use the DigitalOcean console, run through the first root password reset workflow that was emailed to you, then vi /etc/sudoers and remove the Defaults requiretty line and save and exit. You can then run vagrant provision successfully.
  • GitHub
    • [09-08-2015] Some database dumps exceed 100MB, so it's recommened to use Bitbucket in those instances as Catapult auto-commits database dumps to your website's repository, up to 500MB worth of database dumps or the one, newest database dump. Bitbucket has a 2GB hard repo push limit with no documented file limit and GitHub has a 1GB soft repo limit with a 100MB file size limit.
  • Vagrant
    • [02-04-2015] When upgrading Vagrant you may run into errors - the most common issue are mismatched plugins, running this command has a good chance of success sudo rm -Rf ~/.vagrant.d/gems/ && sudo rm ~/.vagrant.d/plugins.json

Contributing

Here are some ways which we welcome you to contribute to Catapult:

  • Submit a pull request
  • Report an issue
  • Provide feedback on open issues
  • Improve documentation in the README
  • Share your experiences with Catapult

When you first setup Catapult, a develop-catapult branch is created for you under your forked repository with the git remote upstream set to https://github.com/devopsgroup-io/catapult.git so that you can easily create a pull request. Also keep in mind when closing issues to submit a pull request that includes GitHub's: Closing issues via commit messages.

Releases

Releases are driven by the devopsgroup.io team and occur when accepting new pull requests from contributors like you. Releases follow Semantic Versioning 2.0.0. Given a version number MAJOR.MINOR.PATCH, increment the:

  • MAJOR version when you make incompatible API changes,
  • MINOR version when you add functionality in a backwards-compatible manner, and
  • PATCH version when you make backwards-compatible bug fixes.

In addition, the release version number will be prefaced with a v (v1.0.0) to conform to standard practice.

As part of a new release, the version number in ~/VERSION.yml will be incremented and git tagged with the same version number along with a GitHub Release.

Community

Partnerships

The Catapult team values partnerships and continuous improvement.

  • [06-03-2016] New Relic creates request on Catapult's behalf for a free entry point for the New Relic Synthetics API
  • [01-28-2016] Pantheon provides feedback
  • [01-22-2016] New Relic provides private beta access to their Synthetics API along side Breather, Carfax, Ring Central, Rackspace, and IBM.

Conferences

Catapult is making the conference tour! We plan to attend the following conferences, with more to come. Get a chance to see Catapult in action, presented by it's core developers.

  • Spring 2016 [04-08-2016] Drupaldelphia: DevOps Discipline: Detailed and Complete

Meetups

Catapult will also be seen throughout local meetups in the Philadelphia and Greater Philadelphia area! Get a chance to meet the team and engage at a personal level.

References

  1. Atlassian. Comparing Workflows. https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow. Accessed February 15, 2016.
  2. Pantheon. Load and Performance Testing: Before You Begin. https://pantheon.io/docs/articles/load-and-performance-testing/. Accessed February 20, 2016.
  3. Acquia. Acquia Dev Desktop. https://www.acquia.com/products-services/dev-desktop. Accessed February 20, 2016.
  4. Oracle Technology Network. Oracle SQL Developer Migrations: Getting Started. http://www.oracle.com/technetwork/database/migration/omwb-getstarted-093461.html#conf. Accessed March 14, 2016.