Под капотом "Градуса":

инфраструктура веб-студии

Проблемы?

Проблема №1

Автоматизация типовых задач

Автоматизация должна быть:

  • Простая
  • С использованием уже знакомых средств
  • Быстро разворачиваемая

Babushka

1. Быстрая установка

  • Берём "чистую" машину (VPS)
  • sh -c "`curl https://babushka.me/up`"
  • Готово

2. С использованием уже знакомых средств

  • Shell (sh, bash)
  • Ruby
dep 'name', :argument do
  requires 'other deps'.with('args'), 'whatever they might be'
  met? {
    # is this dependency already met?
  }
  meet {
    # this code gets run if it isn't.
  }
end

Dep - сокращение от "dependency"

dep 'postgres.apt_repository' do
  url "http://apt.postgresql.org/pub/repos/apt/"
  distribution "wheezy-pgdg"
  components "main"

  after do
    sudo "wget -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | apt-key add -"    
    sudo 'apt-get update'
  end
end


dep 'postgres.managed', :version do
  version.default('9.3')  
  requires 'common:set.locale'.with("en_US")
  requires_when_unmet 'postgres.apt_repository'
  met? { shell? "psql --version"  }
  meet {
    shell("apt-get -y install -t wheezy-pgdg postgresql-#{version} libpq-dev")
  }
  
end
# nginx/site.erb
upstream <%= app_name %>_server{
        <% if app_type == 'rails' %>
          server unix:/opt/<%= app_name %>/current/tmp/sockets/<%= app_name %>.sock fail_timeout=0;
        <% else %>
          server unix:/opt/<%= app_name %>/tmp/sockets/<%= app_name %>.sock fail_timeout=0;
        <% end %>
}
server {
   listen <%= port %>;
   # server_name <%= app_name %>.ru www.<%= app_name %>.ru
   ...
}
dep 'unicorn-server available', :app_name, :port, :app_type do  
  requires 'configured.nginx'
  app_name.ask("What is the name of application located at /opt")
  port.ask("What port do you want to choose for your application")
  met? {    
    Babushka::Renderable.new("/opt/nginx/sites-available/#{app_name}")
        .from?(dependency.load_path.parent / "nginx/site.erb")
  }
  meet {    
    render_erb "nginx/site.erb", :to => "/opt/nginx/sites-available/#{app_name}", :sudo => true    
  }
  
end

3. Простая

babushka webgradus:'unicorn-server available'

Проблема №2

Бэкапирование

(не ручное)

Backup - Ruby gem

Backup - Ruby gem

Backup Model

Backup::Model.new(:my_backup, 'Description for my_backup') do

  archive :my_archive do |archive|    
    archive.add "/path/to/a/file.rb"
    archive.add "/path/to/a/folder/"    
  end
  
  database PostgreSQL do |db|
    db.name = 'someprojectdb'
  end

  store_with S3 do |s3|
    s3.path = "/someproject"
  end

  # Gzip [Compressor]
  compress_with Gzip

  notify_by Mail do |mail|
    mail.on_success           = true
    mail.on_failure           = true

    mail.to                   = "receiver@email.com"
    # ...
  end

end

1. Описываем модель для задачи бэкапирования

Backup Model

$ backup perform --trigger my_backup

2. Запускаем

Backup - Databases

  • MongoDB
  • MySQL
  • PostgreSQL
  • Redis
  • Riak
  • OpenLDAP
  • SQLite

Backup - Compressors

  • Gzip
  • Bzip2
  • Custom

Backup - Encryptors

  • GPG
  • OpenSSL

Backup - Storages

  • CloudFiles
  • Dropbox
  • Ninefold
  • Amazon S3
  • FTP
  • SCP
  • SFTP
  • RSync
  • Local

Backup - Notifiers

  • Campfire
  • Hipchat
  • HttpPost
  • Mail
  • Nagios
  • Prowl
  • Pushover
  • Twitter
  • Zabbix

Мы пошли дальше!

+

Результат

...
every 1.week, at: '0:00 am' do
  command "rvm use 2.0.0 do backup perform -t kava_database"
end
every '0 0 2 * *' do
  command "rvm use 2.0.0 do backup perform -t kava_archives"
end

Проблема №3

Мониторинг

Eye

Eye

  1. gem install eye
  2. gem install eye-http
  3. ~/eye/server.eye
require 'eye-http'

Eye.config do
  http :enable => true, :host => "0.0.0.0", :port => 10001
end

Eye.application 'gradus-five' do  

  process :nginx do
    pid_file '/opt/nginx/logs/nginx.pid'
    start_command "service nginx start"
    restart_command "service nginx restart"
    stop_command "service nginx stop"

    restart_grace 30.seconds
  end
end

Работа с Eye

  • $ /etc/init.d/eye start
  • $ eye l(oad) eye/server.eye
  • $ eye i(nfo)
  • start, stop, restart, delete, monitor, unmonitor
test
  samples
    sample1 ....................... up  (21:52, 0%, 13Mb, <4107>)
    sample2 ....................... up  (21:52, 0%, 12Mb, <4142>)
  nginx ........................... up  (21:52, 3%, 26Mb, <4112>)
  thin ............................ up  (21:53, 2%, 54Mb, <4228>)

Захотелось большего

Spirtometr

Мы пошли ещё дальше!

+

  • Совершенству нет предела

  • Лень - двигатель прогресса

Спасибо за внимание. 

Вопросы?

автоматизации

Выводы

webgradus.ru/partner.pdf

Партнёрская программа

"Градус"

Под капотом "Градуса": инфраструктура веб-студии

By Igor Petrov

Под капотом "Градуса": инфраструктура веб-студии

  • 481