Jekyll in OpenShift

Amazon S3 прекрасный сервис для размещения сайтов. Надежный, очень дешевый. Единственная проблема, которая меня не устраивала – это скорость передачи файлов на сервер. У меня небольшой сайт, но даже для его размещения на сервере амазона требуется порядка двух-трех минут. Когда же я держал для своих сайтов отдельный сервер, передача всего сайта с помощью rsync занимало всегда не более одной-двух секунд. Разница просто на порядки…

Стал рассматривать различные возможные варианты хостинга с ssh. Интересовала не только сама возможность, но и надежность сервиса и наличие рекомендаций по нему. Таким образом в моем списке остались только Github, Heroku и OpenShift.

GitHub у меня отпал по той простой причине, что он предоставляет возможность размещать только один сайт. Как создать дополнительный – я так и не нашел, в итоге решил не страдать и просто перейти на использование других сервисов. (upd: как мне указали в комментариях, есть возможность создания множества сайтов на github, способ описан на странице stackoverflow.com)

С Heroku у меня не сложилось. Так как для передачи файлов на сервер используется git-репозиторий. Организовать несколько репозиториев в рамках одного сайта мне не представляется возможным, а использование jekyll непосредственно на Heroku показало очень низкую производительность.

OpenShift by Red Hat

Обратил внимание на OpenShift, как пишут на официальной странице – OpenShift is Red Hat’s free, auto-scaling Platform as a Service (PaaS) for applications. Условия использования сервиса оказались очень демократичными. Предоставляется возможность создания трех приложений в рамках одного аккаунта. И каждое приложение имеет квоту в 40 000 файлов, 1 гигабайт пространства и 512 мегабайт оперативной памяти. При этом, как пишут в FAQ, если необходимо использовать большее число приложений, необходимо лишь использовать различные аккаунты.

В сети можно найти массу информации по использовании в OpenShift различных фреймворков и приложений. Но практически нигде не было описано, как использовать его вместе с Jekyll.

Создавать и управлять приложениями можно несколькими способами:

  1. Web UI: использование данного интерфейса, на мой взгляд, очень удобно и не требует особых знаний. Но некоторые операции, как например, привязка домена к приложению с помощью веб-интерфейса, выполнить не возможно.
  2. rhc client tools: консольное ruby-приложение, с помощью которого можно полностью управлять своим аккаунтом и создавать и редактировать приложения. Единственный минус заключается в том, что приходиться каждый раз вводить пароль от своего аккаунта при вводе любой команды.
  3. Eclipse Plugin
  4. Java Client API

Последние два варианта я не пробовал, и потому ничего не могу сказать по их работоспособности и удобности. В основной своей массе все операции я осуществлял с помощью Web UI.

Jekyll in OpenShift

По умолчанию в OpenShift предлагается использование приложений и нет простого способа для размещения обычного статического сайта. Однако, как и в случае с Heroku, данная проблема очень легко решается путем создания PHP-приложения.

Итак – регистрируемся на сервисе, подтверждаем свой адрес электронной почты, после чего необходимо создать свой namespace, то есть домен, в котором будут размещаться все приложения. Естественно, имя данного namespace должно быть уникальным. Затем загружаем свой публичный ключ для того, чтобы иметь возможность работать с сервером через консоль по SSH.

После чего приступаем к созданию своего первого приложения. Достаточно будет выбрать его тип, на данном шаге выбираем PHP-приложение. И задаем имя приложения. Теперь, когда приложение создано, нам будет предложено клонировать git-репозиторий на свой компьютер. Если мы работаем с Jekyll или любым другим генератором статических сайтов, делать это совершенно не обязательно. Просто потому, что загружать файлы на сервер можно двумя способами: используя git или используя rsync. Естественно, что в случае Jekyll второй способ куда удобнее.

Просто дописываем в наше Rakefile в правило для deploy следующую команду:

sh "rsync -az --delete public/ server:~/app/repo/php/"

Где app – это имя нашего приложения, а server – это имя конфигурации SSH, что была прописана в файле ~/.ssh/config, которая задается в виде:

Host server
    HostName app-namespace.rhcloud.com
    User f34545176723434502d345a1e345492
    Port 22

Где app-namespace.rhcloud.com – домен нашего приложения, а f34545176723434502d345a1e345492 – идентификатор пользователя, который будет указан после создания приложения.

Собственно на этом все. Генерируем сайт и загружаем его на сервер. Осталось только задать доменное имя. Для этого используется консольная утилита rhc, установим ее:

$ sudo gem install json_pure
$ sudo gem install rhc

И теперь определяем привязку к домену:

$ rhc app add-alias -a app --alias www.domain.com -l user@mail.com

При этом app – это имя нашего приложения, а user@mail.com – это адрес электронной почты, на который был зарегистрирован аккаунт. На данном этапе, после ввода команды, необходимо будет ввести пароль от нашего аккаунта. В случае успеха, появится сообщение SUCCESS, если этого не произошло, а выдалось сообщение об ошибке, но в веб-интерфейсе привязка появилась, рекомендую удалить привязку и проделать эту операцию повторно. Для удаления привязки используется команда:

$ rhc app remove-alias -a app --alias www.domain.com -l user@mail.com

Если все прошло успешно, необходимо у своего доменного регистратора создать запись типа CNAME, которая будет указывать на домен с нашим приложением.

Итоги

OpenShift показался мне довольно интересным сервисом. В отличие от GitHub, он позволяет размещать полноценные приложения, и при этом это может быть не одно приложение. А в отличие от Heroku, бесплатно предоставляется значительные ресурсы для каждого приложения. При этом есть возможность работать с сервером по SSH, загружать файлы по rsync. И, опять же в отличие от Heroku, веб-сервером можно управлять с помощью файлов htaccess.

Теперь осталось посмотреть на то, насколько этот сервис является стабильным и как много времени сайт будет недоступен по причине каких-то работ на сервере. Но оценить это можно будет только спустя определенное время.