Статьи

Развертывание приложений Ruby с помощью Bare Metal: новый тип виртуальных машин

Эта статья была спонсирована CenturyLink Cloud . Спасибо за поддержку спонсоров, которые делают возможным использование SitePoint.

CenturyLink — это компания, предоставляющая несколько предложений «Платформа как услуга» (PaaS). При выборе того, какой сервис использовать для конкретного приложения, существует в основном два трека. Первый трек — AppFog, это чистый PaaS, который вы знаете и любите. AppFog обеспечивает инфраструктуру, а вы предоставляете приложение и данные. AppFog предоставляет интерфейс командной строки (CLI) для развертывания, а также прекрасную панель мониторинга ваших ресурсов.

Другой тракт, предлагаемый CenturyLink, — это инфраструктура как услуга, как с виртуальными машинами, так и с другим продуктом под названием Bare Metal, о котором мы расскажем в этой статье. Bare Metal предлагает «вычислительную мощность физического сервера, а также автоматизацию и гибкость виртуальных машин с оплатой по факту». Серверы Bare Metal НЕ являются общими виртуальными машинами, поэтому вам не нужно беспокоиться о совместном использовании ресурсов. Однако они работают как виртуальные машины, поэтому вы получаете быстрое развертывание виртуальных машин с изоляцией физической машины.

Вы можете использовать Bare Metal для сервера базы данных или приложения, которое плохо вписывается в другие виртуализированные среды. Такие задачи, как пакетные вычисления, когда вам нужно большое количество вычислительных ресурсов для коротких пакетов, отлично подходят для Bare Metal. Кроме того, такие элементы, как аналитика, хорошо подходят, поскольку вы можете управлять сложностью программного обеспечения, такого как Hadoop, и уникальными потребностями аналитических вычислений.

Еще одна интересная особенность заключается в том, что серверы Bare Metal интегрированы в CenturyLink Cloud вместе с такими сервисами, как AppFog. Это позволяет смешивать приложения PaaS, базы данных, дорогостоящие вычислительные задачи и практически все остальное, управляя ими с одной и той же панели. Насколько мне известно, ни один другой PaaS не предлагает такого меню, и вам придется проделать огромную работу над Amazon Web Services (AWS), чтобы получить то же удобство.

Вот сравнение серверов Bare Metal с другими вариантами серверов.

В сегодняшнем посте я расскажу о создании сервера Bare Metal и развертывании на нем (очень) простого приложения Rails.

Настроить

Прежде чем мы начнем наше путешествие, вам понадобится аккаунт на CenturyLink, чтобы следовать за ним. Есть бесплатные пробные версии (они требуют способ оплаты, к вашему сведению). Итак, зайдите на сайт CenturyLink и нажмите «Бесплатная пробная версия». Следуйте процедуре регистрации, и вы готовы к работе.

Предоставление сервера Bare Metal

После входа в портал управления CenturyLink на панели инструментов отображается:

Панель управления порталом CenturyLink

Чтобы начать процесс создания сервера, нажмите на большую «Создать сервер» или «+» на боковой панели и выберите «Сервер».

Панель управления порталом CenturyLink

Серверы Bare Metal доступны не во всех дата-центрах. Мне пришлось выбрать «VA1 — US East (Sterling)» из выпадающего «центра обработки данных», чтобы в качестве опции «тип сервера» была выбрана опция «Голый металл». Если вы находитесь в центре обработки данных, где серверы Bare Metal должны быть доступны, но вы не видите их в качестве опции, обратитесь в службу поддержки клиентов, чтобы убедиться, что они включены для вашей учетной записи.

Создание сервера CenturyLink

У CenturyLink есть отличная документация о том, как подготовить сервер, и вы можете следить за ней здесь . Я использовал следующие варианты:

  • член группы : группа по умолчанию
  • тип сервера : Bare Metal
  • конфигурация : 4 ядра (самый маленький вариант)
  • операционная система : Ubuntu 14 64-bit
  • имя сервера : sprail
  • первичные днс: 8.8.8.8 (Google DNS)
  • вторичный днс: 8.8.4.4 (Google DNS)

После нажатия «Создать сервер» вы увидите следующее:

Данные запроса к серверу CenturyLink

Если вы останетесь на этой странице, сервер выполнит 3 этапа подготовки, где он проверяется, запрашиваются ресурсы и он запускается.

Когда мы подготовили наш сервер, конфигурация требует, чтобы была выбрана группа. В нашем примере мы выбрали «Группа по умолчанию». Могу поспорить, вам было интересно, что такое «группа», не так ли? В CenturyLink Cloud группы позволяют вам одновременно управлять несколькими серверами. Примеры того, что можно сделать в группах:

  • Массовые операции, такие как включение / выключение питания и т. Д.
  • Сгруппируйте свои серверы и ресурсы по проекту или по любой другой логической причине.
  • Создание родительско-дочерних отношений между серверами, каскадными задачами и т. Д.
  • Поддержка сложного биллинга, где вы могли бы взимать плату с клиента за их использование.

Группы очень мощные, и вы должны прочитать их, чтобы узнать больше.

Стоит отметить, что CenturyLink действительно предлагает REST API, который предоставляет конечные точки практически для всего, что вы можете сделать через панель мониторинга, включая серверы инициализации.

После того, как вы выбрали и оценили свой сервер, мы начнем с создания приложения на Rails.

Развертывание приложения Rails

Когда я возвращаюсь на панель инструментов, мой центр обработки данных теперь отображается в списке:

Панель управления порталом CenturyLink

Нажатие на этот центр обработки данных приводит к конкретному представлению центра обработки данных, которое пока не очень интересно. Чтобы попасть на сервер, разверните папку «Группа по умолчанию» в левом списке центров обработки данных и выберите свой сервер:

Особый вид центра обработки данных

Здесь вы можете получить учетные данные администратора (настройка во время подготовки) и посмотреть конфигурацию сервера, включая IP-адрес сервера, к которому нужно подключиться. Убедитесь, что вы подключены к VPN, которая предоставляется вам при создании сервера. (См. Инструкции в разделе « Как настроить VPN клиента ».).

Теперь вы сможете подключиться к SSH, используя ssh root @. Когда вам будет предложено ввести пароль, используйте пароль, который вы указали при подготовке.

Как я уже упоминал, серверы Bare Metal действуют как виртуальные машины, но они не являются общими. Таким образом, развертывание Rails на сервере Bare Metal — это то же самое, что установка любого POSIX-бокса в качестве сервера Rails. Шаги:

  1. Создайте пользователя развертывания.
  2. Установите веб-сервер (в нашем случае Nginx).
  3. Создайте приложение Rails
  4. Добавьте приложение Rails в систему контроля версий.
  5. Нажмите ваши изменения.
  6. Запустите задачу развертывания.

Первые 4 шага являются однократными, поэтому, когда развертывание работает, это простой (и очень хорошо выполняемый сценарий) двухэтапный процесс развертывания приложения на очень мощной автономной машине.

Настройка на стороне сервера

Для этих задач вам нужно быть SSH’d на Bare Metal Server.

Создать пользователя развертывания

Если вы не знакомы с основными задачами Unix, такими как создание пользователя, это не так уж сложно. Введите следующее на сервере:

$ adduser deploy ...Answer the prompts, give the user a good password... $ gpasswd -a demo sudo 

Эта последняя команда добавляет пользователя развертывания в группу sudoers, чтобы при необходимости мы могли запускать команды с более высокими привилегиями.

Создать / Использовать Открытый Ключ

Ваши развертывания будут проходить гораздо более гладко, если вы используете аутентификацию с открытым ключом для SSH в поле в качестве пользователя развертывания. Если у вас есть пара ключей на вашем локальном компьютере, вы можете использовать ее, в противном случае используйте ssh-keygen для ее создания. Опять же, это на вашей локальной машине / машине разработки:

 $ ssh-keygen ...ssh-keygen output... Generating public/private rsa key pair. Enter file in which to save the key (/Users/your-user-name/.ssh/id_rsa): 

Просто нажмите Return, чтобы принять это имя файла. Вам будет предложено ввести фразу-пароль, которую я рекомендую оставить незаполненной. Если вы решите добавить фразу-пароль (которая, между прочим, более безопасна), вам будет предложено ввести ее каждый раз при развертывании.

Теперь у вас должен быть файл id_rsa.pub в вашем каталоге ~ / .ssh . Это должно быть скопировано на сервер. Этот файл .pub необходимо скопировать на сервер. Самый простой способ сделать это — использовать команду ssh-copy-id , которая была создана именно для этой цели. На вашей локальной машине:

 $ ssh-copy-id deploy@SERVER-IP-ADDRESS 

Вам будет предложено ввести пароль пользователя развертывания, и файл открытого ключа будет скопирован.

На этом этапе ssh deploy@SERVER-IP должен «просто работать» без запроса пароля.

Установить Nginx

Давайте установим Nginx. Менеджеры пакетов делают это простым. В качестве пользователя root на сервере введите:

 $ apt-get install nginx git-core nodejs -y ... All kinds of output.. 

ОК, Nginx установлен. Если вы откроете браузер и перейдете по адресу ** http: // SERVER-IP-ADDRESS, вы должны увидеть страницу приветствия Nginx:

Установите Ruby (RVM) и друзей

Я люблю RVM . Это облегчает жизнь. Давайте установим его на сервер, чтобы мы легко обновляли Ruby, поскольку наше невероятное приложение растет и живет вечно.

SSH в поле как пользователь развертывания.

 $ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 ...output.. gpg: Total number processed: 1 gpg: imported: 1 (RSA: 1) $ \curl -sSL https://get.rvm.io | bash -s stable --ruby ...this will prompt for the deploy user password... ...then install ruby 2.2.1... Creating alias default for ruby-2.2.1... * To start using RVM you need to run `source /home/deploy/.rvm/scripts/rvm` in all your open shell windows, in rare cases you need to reopen all shell windows. $ source /home/deploy/.rvm/scripts/rvm $ ruby -v ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux] 

Отлично. Ruby установлен. Нам также понадобится Bundler, поскольку Gemfiles правят миром Ruby.

 $ gem install bundler --no-ri --no-rdoc Successfully installed bundler-1.10.6 1 gem installed 

Гит

Наше развертывание извлечет последний код из системы контроля версий. Для этого приложения я собираюсь использовать Github. Помните, мы установили git на предыдущем этапе установки apt-get, когда мы установили nginx. Процесс развертывания должен иметь возможность доступа к нашему git-репозиторию без входа в систему, поэтому вот еще один сценарий аутентификации с открытым ключом. У пользователя развертывания еще нет файла ключа, поэтому сгенерируйте его:

 # AS THE DEPLOY USER ON THE SERVER $ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/deploy/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/deploy/.ssh/id_rsa. Your public key has been saved in /home/deploy/.ssh/id_rsa.pub. The key fingerprint is: 90:4d:56:9c:50:7d:b3:05:26:ad:61:64:4b:84:05:26 deploy@VA1SPGGSPRAIL01 The key's randomart image is: ...a really weird piece of ASCII art... 

С нашей парой ключей, открытая часть ключа должна быть добавлена ​​в Github . В основном, войдите в Github, перейдите в настройки своей учетной записи. Нажмите «SSH keys», затем «Add SSH Key»:

Если вы все сделали правильно, набрав ssh -T git@github.com :

 $ ssh -T git@github.com Warning: Permanently added the RSA host key for IP address '192.0.2.0' to the list of known hosts. Hi! You've successfully authenticated, but GitHub does not provide shell access. 

Приложение Rails

Поскольку в этой статье основное внимание уделяется развертыванию, приложение Rails будет относительно простым. Мы создадим один контроллер и просмотрим, а также изменим / добавим несколько гемов, чтобы представить несколько «реальное» развертывание

Я использую Ruby 2.2 и Rails 4.2.4, и я вернулся на свою локальную машину. После ввода rails new пришло время изменить Gemfile. Я просто добавил Puma и различные драгоценные камни Capistrano . Это выглядит примерно так:

 ...other gems... gem 'puma' group :development do gem 'web-console', '~> 2.0' # this was already here gem 'pry-rails' # I love Pry gem 'spring' gem 'capistrano', require: false gem 'capistrano-rvm', require: false gem 'capistrano-rails', require: false gem 'capistrano-bundler', require: false gem 'capistrano3-puma', require: false end 

Внесите эти изменения и объедините.

Я упоминал, что это будет простое приложение. Быстро сгенерируйте Home строительные леса:

 $ rails g scaffold Thing names:string purpose:string ...lots of output... $ rake db:migrate ...more output... 

Измените корневой маршрут, чтобы он указывал на наш список вещей:

 # config/routes.rb Rails.application.routes.draw do resources :things root to: 'things#index' end 

Последнее изменение файла заключается в добавлении значения в секреты

Просмотр сервера (rails s) и открытие http: // localhost: 3000 позволит вам увидеть наш прогресс и сделать все, что душе угодно.

Остановите свой локальный сервер (CTRL-C), и давайте получим это приложение Things под контролем исходного кода.

Гит

В корне вашего приложения введите:

 git init . git add . gc -m "Initial commit" 

Теперь у нас есть локальный репозиторий git, который нам нужно отправить в Github. Откройте браузер, зайдите на сайт http://github.com , войдите в систему и создайте репозиторий для своего приложения. Добавьте этот репозиторий в качестве исходного удаленного к вашему локальному и отправьте ваши изменения. Теперь у вас должен быть репозиторий Github с приложением Rails. Вот мой .

Capistrano

Вернитесь в корень приложения на локальном компьютере и введите:

 $ cap install mkdir -p config/deploy create config/deploy.rb create config/deploy/staging.rb create config/deploy/production.rb mkdir -p lib/capistrano/tasks create Capfile Capified 

В Capfile (созданном вышеупомянутой командой) требуются различные гемы capistrano, которые мы включили для поддержки нашего развертывания:

 # Capfile require 'capistrano/setup' # Include default deployment tasks require 'capistrano/deploy' require 'capistrano/rails' require 'capistrano/bundler' require 'capistrano/rvm' require 'capistrano/puma' # Load custom tasks from `lib/capistrano/tasks` if you have any defined Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r } 

Эти задачи позволят настроить Ruby, установить пакет и т. Д. Capistrano хорош.

cap install также создается файл config / deploy.rb и каталог config / deploy . Измените файл config / deploy.rb, чтобы он выглядел следующим образом:

 # config valid only for current version of Capistrano lock '3.4.0' set :application, 'Bare Metal Things' set :repo_url, '[email protected]:sitepoint-editors/bare-metal-fun.git' set :server '206.128.156.201', roles: [:web, :app, :db], primary: true set :user 'deploy' set :puma_threads, [4, 16] set :puma_workers, 0 # Default branch is :master # ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp # Default deploy_to directory is /var/www/my_app_name set :deploy_to, "/home/#{fetch(:user)}/apps/#{fetch(:application)}" set :use_sudo, false set :deploy_via, :remote_cache # Puma set :puma_bind, "unix://#{shared_path}/tmp/sockets/#{fetch(:application)}-puma.sock" set :puma_state, "#{shared_path}/tmp/pids/puma.state" set :puma_pid, "#{shared_path}/tmp/pids/puma.pid" set :puma_access_log, "#{release_path}/log/puma.error.log" set :puma_error_log, "#{release_path}/log/puma.access.log" set :puma_preload_app, true set :puma_worker_timeout, nil set :puma_init_active_record, true set :ssh_options, { forward_agent: true, user: fetch(:user) } # Default value for :scm is :git # set :scm, :git # Default value for :format is :pretty # set :format, :pretty # Default value for :log_level is :debug # set :log_level, :debug # Default value for :pty is false # set :pty, true # Default value for :linked_files is [] # set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/secrets.yml') # Default value for linked_dirs is [] # set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system') # Default value for default_env is {} # set :default_env, { path: "/opt/ruby/bin:$PATH" } # Default value for keep_releases is 5 set :keep_releases, 5 namespace :deploy do after :restart, :clear_cache do on roles(:web), in: :groups, limit: 3, wait: 10 do # Here we can do anything such as: # within release_path do # execute :rake, 'cache:clear' # end end end end 

Зафиксируйте изменения в git, отправьте в исходный репозиторий, затем разверните приложение. Развертывание приложения — это просто ввод:

 $ cap production deploy ...loads of output... DEBUG [29269dca] Command: cd /home/deploy/apps/bare_metal/current && ( RACK_ENV=production ~/.rvm/bin/rvm default do bundle exec puma -C /home/deploy/apps/bare_metal/shared/puma.rb --daemon ) DEBUG [29269dca] Puma starting in single mode... DEBUG [29269dca] * Version 2.14.0 (ruby 2.2.1-p85), codename: Fuchsia Friday DEBUG [29269dca] * Min threads: 4, max threads: 16 DEBUG [29269dca] * Environment: production DEBUG [29269dca] * Daemonizing... INFO [29269dca] Finished in 0.480 seconds with exit status 0 (successful) 

К сожалению, это не сработает полностью, даже если кажется, что так и было. Я запускаю первое производственное развертывание, чтобы убедиться, что с разрешениями все в порядке, и получить структуру каталогов Capistrano. Однако нам нужно добавить пару каталогов на основе нашей конфигурации Puma. SSH на сервер, как развернуть и введите:

 $ mkdir apps/bare_metal/shared/tmp/sockets -p $ mkdir apps/bare_metal/shared/tmp/pids -p $ mkdir apps/bare_metal/shared/config -p 

Теперь у Puma есть постоянное место для записи необходимых файлов. Хотя этот последний каталог предназначен для чего-то другого: секретов.

Секреты

Работать с секретами в Rails всегда было весело. Для нашего простого приложения нам просто нужно иметь локальное значение для SECRET_KEY_BASE, поэтому я рекомендую поместить копию config / secrets.yml на сервер, а затем создать символическую ссылку при развертывании. Итак, откройте этот файл локально и введите реальное значение токена для производства. Изменить:

 production: secret_key_base: 

в

 production: secret_key_base: 0c2e91d623cd62510e1ba6fc9ed7313461dc13b2068ff692f3a1803891870e6bb77c05bcfe27f7065e4fb1c380bd7fc720a336ea0ae231bf3bd32ecc34f8282b 

Вероятно, вам следует использовать свой собственный токен, который вы можете сгенерировать с помощью секрета рейка.

Теперь скопируйте этот secrets.yml в общий каталог конфигурации на сервере:

 scp config/secrets.yml deploy@SERVER-IP:/home/deploy/apps/bare_metal/shared/config 

Наконец, добавьте задачу в файл config / deploy.rb для символической ссылки на этот файл при развертывании:

 ## config/deploy.rb namespace :deploy do ...other tasks... desc "Link shared files" task :symlink_config_files do on roles(:web) do symlinks = { #"#{shared_path}/config/database.yml" => "#{release_path}/config/database.yml", "#{shared_path}/config/secrets.yml" => "#{release_path}/config/secrets.yml" } execute symlinks.map{|from, to| "ln -nfs #{from} #{to}"}.join(" && ") end end before 'deploy:assets:precompile', :symlink_config_files 

А затем удалите этот файл из git:

 git rm secrets.yml 

Теперь необходимо cap production deploy с cap production deploy .

Конфигурация Nginx

SSH на сервер от имени пользователя root и введите

 vi /etc/nginx/sites-enabled/default 

Замените все содержимое этого файла:

 upstream puma { server unix:///home/deploy/apps/bare_metal/shared/tmp/sockets/bare_metal-puma.sock; } server { listen 80 default_server deferred; # server_name example.com; root /home/deploy/apps/bare_metal/current/public; access_log /home/deploy/apps/bare_metal/current/log/nginx.access.log; error_log /home/deploy/apps/bare_metal/current/log/nginx.error.log info; location ^~ /assets/ { gzip_static on; expires max; add_header Cache-Control public; } try_files $uri/index.html $uri @puma; location @puma { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://puma; } error_page 500 502 503 504 /500.html; client_max_body_size 10M; keepalive_timeout 10; } 

Вам нужно будет перезапустить nginx:

 nginx -s stop nginx 

Успех! Приложение теперь работает на нашем сервере Bare Metal. В дальнейшем развертывание нового приложения очень просто:

  1. Вносить изменения
  2. Внесите изменения в Git и нажмите на Github.
  3. cap production deploy

Вывод

В этом руководстве рассказывалось о развертывании приложения Rails на сервере CenturyLink Bare Metal. Процесс развертывания приложения действительно не сильно отличался от обычного сервера, как только был подготовлен сервер Bare Metal. Преимущества использования сервера Bare Metal делают эту среду превосходящей виртуальную облачную виртуальную машину. Об общих ресурсах не стоит беспокоиться, поскольку серверы Bare Metal изолированы, как физическая машина. Серверы Bare Metal развертываются быстрее, поэтому вы сможете масштабировать их при необходимости. Добавьте все услуги, которые предлагает CenturyLink, и все ваши потребности DevOps могут быть полностью удовлетворены одним провайдером.