README.md in prun-ops-0.0.3 vs README.md in prun-ops-0.0.4

- old
+ new

@@ -1,13 +1,13 @@ # PrunOps Covers all Operations in a Ruby on Rails Application server: 1. PROVISION: Create hosts and ship them with Docker containers. -1. CONFIGURATION: Build Chef cookbooks and configure/re-configure your servers. Based on [PRUN-CFG cookbook](https://1upermarket.getchef.com/cookbooks/prun-cfg). +1. CONFIGURATION: Build Chef cookbooks and configure/re-configure your servers. Based on [PRUN-CFG cookbook](https://supermarket.getchef.com/cookbooks/prun-cfg). 1. DEPLOYMENT: Capistrano tasks to depoly your rails Apps. -1. DIAGNISIS: Capistrano diagnosis tools to guet your Apps status on real time. +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/). @@ -25,20 +25,236 @@ Or install it yourself as: $ gem install prun-ops -## Usage +## Usage: Provision with OPS command -TODO: Write usage instructions here +OPS command is focused to cover first Provision configurations for a the Operations of your infrastructure. +You can create an infrastructure project (like me [/ops](https://github.com/jlebrijo/ops)) + +``` +mkdir ops && cd ops +rbenv local 2.1.2 +git init +``` + +Create a Gemfile: + +``` +source 'https://rubygems.org' + +gem 'prun-ops' + +# OPTIONAL: Add next gems if you want to integrate with Chef as Configuration management tecnology +gem 'knife-solo' +gem 'librarian-chef' +gem 'foodcritic' +``` + +And: `bundle install` + +To avoid `bundle exec` repfix: `bundle install --binstubs .bundle/bin` + +Or integrate it within your Chef infrastructure project. Just add the gem to your Gemfile. + +### Folder Structure + +TODO: `ops init` to create this structure + +Structure: + +``` +ops + providers + digitalocean.yml + hosts + example.com.yml + containers + example.com.yml +``` + +#### Provider file syntax + +TODO: Create more providers (aws, linode, gcloud, ...) + +For a Digital Ocean provider create a file (ops/providers/digitalocean.yml) with your account API key: + +```yml +token: a206ae60dda6bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcf0cbf41 +``` + +#### Host file syntax + +For a Digital Ocean host we can make the following file (ops/hosts/example.com.yml): + +```yml +user: core # User to connect the host +# Values to configure DigitalOcean machine +size: 1gb +region: ams3 +image: coreos-stable +ssh_keys: + - e7:51:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:88:57 +``` + +And create the host: `ops create host example.com` + +### Containers file syntax + +In this file we can configure all containers to run in the host provided in the name: + +```yml +www: + image: jlebrijo/prun + ports: + - '2222:22' + - '80:80' +# command: /bin/bash + +# OPTIONS: use the long name of the options, 'detach' instead of '-d' + detach: true +# interactive: true +# memory: 8g +# cpuset: 0-7 + +# POST-CONDITIONS: execute after build the container: + post-conditions: + - sshpass -p 'J3mw?$_6' ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@lebrijo.com -p 2222 + - ssh root@lebrijo.com -p 2222 "echo 'root:K8rt$_?1' | chpasswd" + +# here you can create other containers +# db: +# image: ubuntu/postgresql +``` + +Create containers at host: `ops ship host example.com` + +### Commands + +Create/delete domain names, create/delete hosts and ship/unship hosts: + +* `ops create host HOST_NAME` create the host defined by the name of the file in the 'ops/hosts' folder. +* `ops delete host HOST_NAME` +* `ops create domain DOMAIN_NAME [IP_ADDRESS]` create a domain to be managed by DigitalOcean. +* `ops delete domain DOMAIN_NAME [IP_ADDRESS]` +* `ops ship host HOST_NAME` run the containers in the host. +* `ops unship host HOST_NAME` + +### TODO: Configuration with Chef + +Configuration with chef commands + +* `ops configure host HOST_NAME`: configure with chef all containers in host. Here you need to install knife-solo gem. + * knife solo cook [container_user]@[container_dns_name] -p [container_ssh_port] + +## Usage: Day-to-day rake and capistrano tasks + +Add the gem to the Gemfile in your Rails Application. + +`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' +Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r } +``` + +Add to your config/deploy.rb this: + +```ruby +## PRUN-OPS configuration +require 'prun-ops/cap/all' +``` + +Your config/deploy/production.rb: + +``` +server "example.com", user: 'root', roles: %w{web app}, port: 2222 +``` + +Note: Remember change this line in production.rb file: `config.assets.compile = true` + +### Deployment + +* `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] db:setup` load schema and seeds for first DB setup + +### Backup + +Backups/restore database and files in your Rails app. + +Configure your 'config/deploy.rb': + +```ruby +# Backup directories +set :backup_dirs, %w{public/uploads} +``` + +And 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" +``` + +![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] 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. + +![Release management](https://docs.google.com/drawings/d/1IEWCIhDFqREVVjSwM9bPfVpyNm3jIoNF4Xn8y-dZHTg/pub?w=871&h=431 "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 rails log by default, or other if LOG_FILENAME is provided +* `cap [stg] c` open a rails console with server +* `cap [stg] x[COMMAND]` execute any command in server provided as COMMAND (i.e.: cap production x['free -m']) + + ## 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). Copyright 2009-2014 at [Lebrijo.com](http://lebrijo.com) +[MIT License](http://opensource.org/licenses/MIT). Made by [Lebrijo.com](http://lebrijo.com) + +## Release notes + +### v0.0.2 + +* First publication + +### v0.0.3 + +* Changing homepage and License +* start|stop|restart thin server per application as Capistrano task \ No newline at end of file