Быстрый Jekyll на Heroku

12 нояб. 2012

Не GitHub-ом единым жив Jekyll, и легко переносится на другие платформы, чему способствуют его скромные аппетиты, выраженные в наличии только интерпретатора Ruby. В угоду простому развёртыванию Jekyll, ведущие блогов часто обращают взоры в сторону сервиса Heroku. Но из-за того, что Jekyll не обладает хорошей скоростью генерации страниц, такой блог может откровенно разочаровать. В то же время, можно получить существенный выигрыш в скорости, всего лишь изменив вариант установки.

Создание приложения

После регистрации на Heroku и установки Heroku Toolbelt, создадим приложение myapp

$ heroku create myapp

расположенное по адресу http://myapp.herokuapp.com. Настройка Git для управления приложением:

$ cd myapp
$ git init
$ heroku git:remote -a myapp

Запуск приложения на Heroku

Директория приложения должна включать в себя файлы Gemfile и Gemfile.lock для установки gem-ов посредством Bundler, а также Procfile. Последний предназначен для запуска процессов на Heroku, которые исчисляются в так называемых «dyno». В бесплатном варианте доступен лишь один web dyno, запускающий один web-процесс.

Не выбирайте в качестве web-процесса запуск самого Jekyll-а, поскольку он использует сервер WEBrick, единственный плюс которого — наличие в стандарте Ruby. Для прироста в скорости используйте более производительные web-серверы, будь-то Thin или Unicorn (оба они поддерживают интерфейс Rack). Например, запуск Thin в Procfile выглядит так:

web: bundle exec thin start -p $PORT

Управляется web-сервер посредством Rack, чьи параметры настройки хранятся в файле config.ru в директории приложения. Только не используйте проект Rack-Jekyll, который не работает с последними версиями Jekyll. Для наших целей достаточно простого Rack-Try_static, тем более, что инструкции по его эксплуатации с Jekyll очень просты, и изложены в «Blogging With Jekyll, Rack And Heroku For Free!». Сводятся они к созданию config.ru следующего содержания:

require 'rack'
require 'rack/contrib/try_static'

use Rack::TryStatic,
  :root => "_site", # static files root dir
  :urls => %w[/],   # match all requests
  :try => ['.html', 'index.html', '/index.html'] # try these postfixes sequentially
# otherwise 404 NotFound
run lambda { [404, {'Content-Type' => 'text/html'}, ['Not Found']] }

Теперь все запросы к приложению будут переадресованы в директорию _site, на которую указывает ключ :root.

Подключение Jekyll к приложению

Наш подход не требует запуска Jekyll в качестве сервера, отводя ему роль только в создании содержания страниц. Но это породило бы дополнительные неудобства, будь мы вынуждены генерировать страницы локально и отправлять их на Heroku. К счастью, для запуска приложений Heroku использует Buildpacks. Среди сторонних buildpacks, служащих для запуска приложений на различных языках программирования, есть также buildpack для генерации сайтов с помощью Jekyll. Настройка приложения на использование данного buildpack-а задаётся всего одной командой

$ heroku config:add BUILDPACK_URL=http://github.com/mattmanning/heroku-buildpack-ruby-jekyll.git

Заключительная настройка

Включим gem-ы, необходимые приложению, в файл Gemfile

source 'https://rubygems.org'

gem 'jekyll'
gem 'RedCloth'
gem 'thin'
gem 'rack-contrib'

и выполним их установку

$ bundle install

Внесём _site/ в список игнорируемых

$ echo '/_site/' >> .gitignore

После чего остаётся наполнить новый сайт содержанием и развернуть приложение на Heroku:

$ echo 'Hello, World!' > index.html
$ git add .
$ git commit -m "my first commit"
$ git push heroku master

Локально, Jekyll запускается, как обычно, командой

$ bundle exec jekyll serve -w

генерируя сайт по адресу http://localhost:4000.

P.S. На материал поста оказало влияние вдумчивое чтение постов «Run Your Jekyll Site On Heroku» и «Jekyll on Heroku Part 2: Rack ‘Em». За что выражаю искреннюю признательность их автору Matthew Manning.

Наверх

Наверх