В этом посте дается краткое объяснение начала работы с Ruby и веб-фреймворком Sinatra, развернутым в Heroku. Важно иметь базовые знания Ruby, включая установленную версию Ruby 1.9.2, Rubygems и Bundler.
Другие предпосылки, как показано ниже:
- Базовые знания Git
- Ваше приложение должно работать на Ruby (MRI) 1.9.2
- Ваше приложение должно использовать Bundler
- Аккаунт Heroku
Настройте свою локальную рабочую станцию
Чтобы получить доступ к клиенту командной строки Heroku, распределенному управлению версиями Git и Foreman, установите Heroku Toolbelt на локальную рабочую станцию.
Войдите в систему, используя свой адрес электронной почты и пароль, введя команду heroku
в командной оболочке.
$ heroku login Enter your Heroku credentials. Email: [email protected] Password: Could not find an existing public key. Would you like to generate one? [Yn] Generating new SSH public key. Uploading ssh public key /Users/adam/.ssh/id_rsa.pub
Когда появится сообщение «Не удалось найти существующий открытый ключ», введите y
чтобы создать новый ключ ssh
. Эта клавиша позволяет отправить код в Heroku. Используя команду heroku
, вы можете добавить открытый ключ в Heroku.
Начиная
Если у вас есть приложение Sinatra, не стесняйтесь его использовать. В противном случае, вот исходный файл «Learning Ruby on Heroku», который вы можете использовать:
web.rb
require 'sinatra' get '/' do "Learning Ruby on Heroku" end
Объявление зависимостей с Gemfile
Существование Gemfile
говорит Heroku, что это приложение Ruby.
Gemfile
source "https://rubygems.org" gem 'sinatra', '1.1.0'
Запустите bundle install
чтобы настроить пакет на локальной рабочей станции.
Объявление типов процессов с помощью Procfile
Форман использует текстовый файл с именем «Procfile» в корневом каталоге вашего приложения, чтобы объявить, какие процессы необходимо запустить.
Поскольку все приложения Sinatra совместимы с Rack, мы можем создать файл config.ru в корне каталога и указать Foreman использовать его.
Создайте файл config.ru
:
require 'my_app' run MyApp.new
Запустите его, чтобы убедиться, что приложение запускается:
rackup config.ru
Вы можете обратиться к нашему 4-частному учебнику по Синатре, чтобы узнать больше .
Теперь его можно добавить в Procfile:
web: bundle exec rackup config.ru -p $PORT
Был объявлен отдельный тип процесса, web
вместе с командой, необходимой для его выполнения. Здесь имеет значение название «сеть», поскольку в нем говорится, что этот тип процесса будет подключен к стеку маршрутизации HTTP Heroku и обрабатывать веб-трафик при реализации.
Теперь вы готовы начать работу с вашим приложением локально, используя Foreman (установленный в Toolbelt):
$ foreman start 16:39:04 web.1 | started with pid 30728 18:49:43 web.1 | [2013-03-12 18:49:43] INFO WEBrick 1.3.1 18:49:43 web.1 | [2013-03-12 18:49:43] INFO ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux] 18:49:43 web.1 | [2013-03-12 18:49:43] INFO WEBrick::HTTPServer#start: pid=30728 port=5000
Приложение будет отображаться на порту 5000. Убедитесь, что вы проверили, работает ли оно правильно с веб-браузером, затем Ctrl-C
для выхода.
Поместите приложение в Git
Теперь у нас есть три основных элемента нашего приложения: типы процессов в Procfile , зависимости в Gemfile и источник в web.rb. Давайте сохраним ваше приложение в Git:
$ git init $ git add . $ git commit -m "init"
Развертывание приложения в Heroku
Создание приложения на Heroku:
$ heroku create Creating blazing-galaxy-997... done, stack is cedar http://blazing-galaxy-997.herokuapp.com/ | [email protected]:blazing-galaxy-997.git Git remote heroku added
Примечание. Название приложения Heroku будет отличаться от моего («blazing-galaxy-997»).
Развертывание кода
Чтобы передать наш код в Heroku, мы используем команду git push
:
$ git push heroku master Counting objects: 6, done. Delta compression using up to 4 threads. Compressing objects: 100% (5/5), done. Writing objects: 100% (6/6), 660 bytes, done. Total 6 (delta 0), reused 0 (delta 0) -----> Heroku receiving push -----> Ruby app detected -----> Installing dependencies using Bundler version 1.1 Checking for unresolved dependencies. Unresolved dependencies detected. Running: bundle install --without development:test --path vendor/bundle --deployment Fetching source index for https://rubygems.org/ Installing rack (1.2.2) Installing tilt (1.3) Installing sinatra (1.1.0) Using bundler (1.1) Your bundle is complete! It was installed into ./vendor/bundle -----> Discovering process types Procfile declares types -> web Default types for Ruby -> console, rake -----> Compiled slug size is 6.3MB -----> Launching... done, v4 http://blazing-galaxy-997.herokuapp.com deployed to Heroku To [email protected]:blazing-galaxy-997.git * [new branch] master -> master
Обратите внимание, что Heroku сообщает нам, что наш web
процесс обнаружен в нашем Procfile. Все работает как надо.
Управление вашим приложением
Теперь вы развернули свой код в Heroku. Следующий шаг — выполнить тип процесса, дав команду Heroku выполнить соответствующую команду в «dyno» — фундаментальном рабочем процессе в Heroku.
Вы можете масштабировать свое приложение, добавляя больше dyno для типа процесса. Вот пример того, чтобы убедиться, что у вас есть один dyno, выполняющий тип web
процесса:
$ heroku ps:scale web=1
Чтобы проверить состояние heroku ps
приложения, используйте команду heroku ps
которая показывает запущенные heroku ps
вашего приложения.
$ heroku ps === web: `bundle exec ruby web.rb -p $PORT` web.1: up for 9m
Это показывает, что 1 дин приложения работает. С heroku open
командой heroku open
вы можете зайти в свое приложение.
$ heroku open Opening blazing-galaxy-997... done
Масштабирование
Ваше первое веб-приложение для приложения Heroku бесплатно. Однако, если вы не масштабируете сверх этого свободного динамо, Heroku оставляет за собой право убить динамо после периода неиспользования. Вы можете избежать этого, добавив второй dyno:
$ heroku ps:scale web=2
Вы можете получить максимум 750 динамо-часов бесплатно для каждого приложения. Убедитесь, что у вас не заканчивается бесплатное ежемесячное пособие. Чтобы уменьшить масштаб до одного динамо:
$ heroku ps:scale web=1
Проверка журнала
Heroku облегчает просмотр файлов журналов с помощью команды heroku logs
:
$ heroku logs 2013-03-13T04:10:49+00:00 heroku[web.1]: Starting process with command `bundle exec ruby web.rb -p 25410` 2013-03-13T04:10:50+00:00 app[web.1]: [2013-03-13 04:10:50] INFO WEBrick 1.3.1 2013-03-13T04:10:50+00:00 app[web.1]: [2013-03-13 04:10:50] INFO ruby 1.9.2 (2011-07-09) [x86_64-linux] 2013-03-13T04:10:50+00:00 app[web.1]: [2013-03-13 04:10:50] INFO WEBrick::HTTPServer#start: pid=2 port=25410
Приставка
С помощью команды heroku run
вы можете запускать команды в одноразовой записи, например, скрипты, которые нужно просто выполнить один раз. Используя его, вы можете запустить интерактивную оболочку Ruby ( bundle exec irb
), связанную с локальным терминалом, для тестирования в среде приложения:
$ heroku run console Running `console` attached to terminal... up, ps.1 irb(main):001:0>
irb
по умолчанию загружает только стандартную библиотеку Ruby. Из него вы можете require
некоторые файлы вашего приложения. Или это можно сделать из командной строки:
$ heroku run console -r ./web
Грабли
Как и в случае с консолью, вы можете запустить rake
в одноразовой записи:
$ heroku run rake db:migrate
Как использовать базу данных SQL
Для нашего примера приложения вам не нужно использовать базу данных SQL, но большинству «настоящих» приложений потребуется некоторое постоянство. Чтобы добавить бесплатное приложение PostgreSQL для разработки вашего приложения:
$ heroku addons:add heroku-postgresql:dev
Вам нужно будет добавить гем Postgres в ваше приложение, добавив строку в ваш Gemfile
как показано ниже:
gem 'pg'
и повторное развертывание вашего приложения.
Чтобы повторно развернуть приложение после внесения изменений:
git commit -am "Added pg gem" git push heroku master
Эта статья действительно только раскрывает поверхность развертывания приложения Sinatra в Heroku. Следующие шаги могут быть:
- Сделать приложение сохранить состояние в Postgres
- Добавьте немного JavaScript / CSS
- Изучите бесконечную коллекцию дополнений Heroku, чтобы узнать, какие услуги вы можете использовать для улучшения своего приложения.
Удачи!