Peter Kalambet
Technogeek Labs
Published in
4 min readApr 18, 2015

--

В какой-то момент я осознал, что одна из машин, которую я держал на Digital Ocean, выполняла крайне ограниченный набор задач. Во-первых, она отдавала статику главной страницы www.technogeek.io; во-вторых, на ней был развёрнут Ghost для blog.technogeek.io.

Совершенно очевидно, что целая машина, пусть и виртуальная и в минимальной конфигурации, для таких задач — слишком много. К тому же появилась идея снизить затраты на такое размещение до нуля.

И если вокруг есть большое количество сервисов, которые могут хостить статику, то с Ghost родилась идея перенести его в Bluemix.

Первым делом нам понадобится сами исходники Ghost https://ghost.org/download/.

Далее по стандартной процедуре создаём приложение в Bluemix с node.js рантаймом на 256 MB.

Следующим шагом надо добавить базу данных, в которой будут хранится наши записи. По-умолчанию Ghost размещает все записи в локальной базе SQLite, но мне такой подход нравится сильно меньше в связи с тем, что при деплойменте приложения в Bluemix все файлы перезаписываются заново. В итоге каждый раз перед деплйментом надо не забывать скачивать актуальный файл базы. Сложно и долго, проще подключить один из существующих в каталоге сервисов базы данных. В данном примере мы будем подключать PostgeSQL.

Для этого идем в Dashboard приложения в Bluemix и нажимаем кнопку Add Service or API. Выбираем из каталога Elephant SQL (категория Data Managements) и бесплатный тарифный план Tiny Turtle. Для персональных целей этого будет более чем достаточно.

Теперь настало время скачать Starter Kit, расположенный в Dashboard приложения в Start Coding секции. Мы не делали этого раньше, потому что тогда в manifest.yml не было бы нашего БД сервиса, а из всего Starter Kit только этот файл нам и понадобится.

Теперь переходим в папку с исходниками Ghost. Это будет основная папка проекта нашего приложения. При желании её можно будет положить в CVS, ну или хранить локально. Пока приложение актуально и работает эта папка будет нужна — все последующие деплои приложения в Bluemix будут сделаны на основе её содержимого.

Настало время конфигурации Ghost. Для этого мы создаём копию файла config.example.js и называем его config.js. Теперь надо настроить порт и хост, на котором будет стартовать наше приложение, подключение к БД и сервис почты.

Тут надо заметить, что сам JS-модуль config.js экспортирует объект config, в котором располагаются описание дейломент энвайромнетов production, development и testing. Это всё, что будет искать GHost при его импорте. Таким образом вопросы его инициализации лежат целиком на нашей совести.

Таким образом при желании можно написать обвязку, полноценно эксплуатирующую все возможности Cloud Foundry, а можно просто ограничиться заполнением параметров из runtime environment.

Для текущего примера, мы подйем по второму пути, но если кому-то более интересен первый, настоятельно рекомендую посмотреть на npm пакет cfenv

Очевидно, что на постоянной основе мы будем запускать Ghost в production энвайроменте, и потому именно его мы будет настраивать на использование Bluemix.

Для начала мы определим хост, порт и путь к базе, а для возможности использования этих же переменных и в developemtn энвайроменте сделаем их зависимыми от окружения запуска.

var dbURI = undefined;
var appHost = (process.env.VCAP_APP_HOST || 'localhost');
var appPort = (process.env.VCAP_APP_PORT || 2368);

if(process.env.VCAP_SERVICES) {
var services = JSON.parse(process.env.VCAP_SERVICES);
dbURI = services.elephantsql[0].credentials.uri;
} else {
dbURI = "postgresql://localhost/peter";
}

Далее, надо настроить сервис почтовой рассылки. Я для этих целей использую Mandrill.

Теперь пару слов про URL блога. Можно оставить его оригинальным http(s)://appname.mybluemix.net, а можно привязать кастомный маршрут в Dashboard приложения. Для этого в левом верхнем углу выбираем редактирование маршрутов, переходим в Manage Domains, добавляем новый домен и после этого указываем маршрут для блога на основе нового домена. Теперь чтобы он заработал надо в DNS-менеджере провайдера, обслуживающего этот домен, создать A-record соответствующую этому маршруту и ассоциировать её с IP-адресом, полученным из nslookup ng.mybluemix.net. Более подробно про добавление нового маршрута можно почитать тут.

Итого секция про production энвайромент будет выглядеть таким образом:

production: {
url: {URL БЛОГА},
mail: {
transport: 'SMTP',
host: 'smtp.mandrillapp.com',
port: 587,
options: {
service: 'Mandrill',
auth:{
user: {USERNAME ИЗ MANDRILL},
pass: {SECRET ИЗ MANDRILL}
}
}
},
database: {
client: 'pg',
connection: dbURI,
pool: {
min: 2,
max: 4
},
debug: false
},

server: {
host: appHost,
port: appPort
},
fileStorage: false
},

Про дополнительные опции настройки Ghost наиболее полно написано тут: http://support.ghost.org/config/

Теперь нам надо положить в локальную папку manifest.yml из Starter Kit, скачанного выше. И добавить npm модуль pg в dependancy секцию package.json

"pg": "~4.3.0",

Теперь надо указать Blumix способ запуска Ghost в produсtion окружении. Для этого локально создаём файл Procfile и и указываем там web-стартер

web: NODE_ENV=production npm start

Наконец-то всё готово, можно деплоиться в Bluemix: cf push. И по окончании процесса http(s)://{blog-url}/ghost/admin.

--

--