# PrunOps Covers all Deployment and maintainance Operations in a Ruby on Rails Application server: 1. DEPLOYMENT: Capistrano tasks to depoly your rails Apps. 1. DIAGNOSIS: Capistrano diagnosis tools to guet your Apps status on real time. 1. RELEASE: Rake tasks to manage and tag version number in your Apps (X.Y.Z). 1. BACKUP: Backup policy for database and files in your Apps, using git as storage. Based on: * [PRUN Docker image](https://registry.hub.docker.com/u/jlebrijo/prun/). * [PRUN Chef recipe](https://github.com/jlebrijo/prun-cfg). ## Installation Add this line to your application's Gemfile: ```ruby gem 'prun-ops' ``` And then execute: $ bundle Or install it yourself as: $ gem install prun-ops ## Usage: Day-to-day rake and capistrano tasks ### Configure Capistrano `gem "capistrano-rails"` is included as prun-ops requirement. Create basic files `cap install` Capfile should include these requirements: ```ruby require 'capistrano/setup' require 'capistrano/deploy' require 'capistrano/rails' require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations' require "#{File.dirname(__FILE__)}/config/application" require 'capistrano/prun-ops' Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r } ``` Notice that you are adding all prun-ops tasks with the line `require 'capistrano/prun-ops'` Your config/deploy/production.rb: ``` server "example.com", user: 'root', roles: %w{web app db}, port: 2222 ``` Note: Remember change this line in production.rb file: `config.assets.compile = true` ### Deployment * `cap [stg] deploy:cold` first time deployment with schema:load and seeds (replacing db:migrate) * `cap [stg] deploy` deploy your app as usual * `cap [stg] deploy:restart` restart thin server of this application * `cap [stg] deploy:stop` stop thin server * `cap [stg] deploy:start` start thin server * `cap [stg] deploy:db_create` create database * `cap [stg] deploy:db_reset` load schema and seeds for first DB setup * `cap [stg] deploy:db_seed` seeds the database * `cap [stg] git:remove_repo` Removes repo (useful when repo_url changes) Added the possibility of deploying from local repository. Add to `deploy.rb` or `[stg].rb` files: ``` before :deploy, "git:deploy_from_local_repo" ``` Take care to remove the previous repo if you are changing the :repo_url : `cap [stg] git:remove_repo` ### Backup Backups/restore database and files in your Rails app. Configure your 'config/applciation.rb': ```ruby # Backup directories config.backup_dirs = %w{public/ckeditor_assets public/system} # Backup repo config.backup_repo = "git@github.com:example/backup.git" ``` And ![backup schema](https://docs.google.com/drawings/d/1Sp8ysn46ldIWRxaLUHfzpu7vK0zMjh4_iMpEP1U6SuU/pub?w=642&h=277 "Backup commands schema") * `cap [stg] pull:data`: downloads DDBB and file folders from the stage you need. * `cap [stg] pull:db`: Hot backup, download and restore of the stage database * `cap [stg] pull:files`: Hot restore of backup_files * `cap [stg] backup[TAG]`: Commit a backup of DDBB and files to the git repo configured. "application-YYYYMMDD" tagged if no tag is provided. * `cap [stg] backup:restore[TAG]`: Restore the last backup into the stage indicated, or tagged state if TAG is provided. * `rake backup |TAG|`: Uploads backup to git store from local, tagging with date, or with TAG if provided. Useful to backup production stage. * `rake backup:restore |TAG|`: Restore last backup copy, or tagged with TAG if provided. ### TODO: Release Release management * `rake release |VERSION|` push forward from dev-branch to master-branch and tag the commit with VERSION name. * `rake release:delete |VERSION|` remove tag with VERSION name. * `rake git:ff` merge dev branch towards master branch without releasing (Deprecating, new version "rake tomaster[message]") ![Release management](https://docs.google.com/drawings/d/1PLIQ8SMagUo1438RNShl99Ux3daFutmRgIsbQqhJ2n4/pub?w=917&h=551 "Release management") ### Diagnosis Some capistrano commands useful to connect to server and help with the problem solving. * `cap [stg] ssh` open a ssh connection with server * `cap [stg] log[LOG_FILENAME]` tail all rails logs by default, or only one if LOG_FILENAME is provided * `cap [stg] c` open a rails console with server * `cap [stg] dbconsole` open a rails database console with server * `cap [stg] x[COMMAND]` execute any command in server provided as COMMAND (i.e.: cap production x['free -m']) * `cap [stg] rake[TASK]` execute any rake task in server provided as TASK (i.e.: cap production rake[db:version]) ### Monitoring Recommend to configure your Rails server with [PRUN Chef recipe](https://github.com/jlebrijo/prun-cfg). At this moment we are implementing [NewRelic](http://newrelic.com/) monitoring, including as dependency ['newrelic_rpm'](https://github.com/newrelic/rpm) gem. To configure yourproject you just need to create an account at [NewRelic](http://newrelic.com/) and follow the instructions (creating a 'config/newrelic.yml file with your license_key). ### TODO: Configuration management `configure.yml`: for variables with environment dependency `cap [stg] configure` `cap [stg] configure:base`: for packages, git, time ... `cap [stg] configure:ruby`: ruby version `cap [stg] configure:pgsql` `cap [stg] configure:nginx` `cap [stg] configure:node` `cap [stg] configure:newrelic` `cap [stg] configure:jenkins` `cap [stg] configure:wordpress` ## Contributing 1. Fork it ( https://github.com/[my-github-username]/prun-ops/fork ) 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Add some feature'`) 4. Push to the branch (`git push origin my-new-feature`) 5. Create a new Pull Request ## License [MIT License](http://opensource.org/licenses/MIT). Made by [Lebrijo.com](http://lebrijo.com) ## Release notes ### v0.0.2 * First publication ### v0.0.4 * Changing homepage and License * start|stop|restart thin server per application as Capistrano task ### v0.0.5 * Removing Application server version (thin 1.6.2) dependency ### v0.0.6 * Fixing DigitalOcean images error when slug is nil for client images * Adding git:ff rake task ### v0.0.8 * Adding backup[tag] capistrano task for production ### v0.0.9 * Fixing Capistrano pulling tasks "pull:data" ### v0.0.10 * Removing bin/ops command in order to create open-dock gem * Remove prun-ops dependency from 'config/deployment.rb' file and ad it to 'Capfile' as `require 'capistrano/prun-ops'` ### v0.0.21 * Remove from your 'config/deploy.rb': ```ruby # Backup directories require_relative "./application.rb" set :backup_dirs, Taskboard::Application.config.backup_dirs ``` Also add in your Capfile: ```ruby ................ require 'capistrano/rails/migrations' require "#{File.dirname(__FILE__)}/config/application" require 'capistrano/prun-ops' ................ ``` ### v0.1.2 * Add `cap stage dbconsole` to open a database console. ### v0.1.6 * Add `cap stage rake[db:create]` to execute a rake task in remote server.