Размещение приложения node.js на dotcloud.com

в 7:34, , рубрики: dotcloud, node.js, метки: ,

dotCloud — облачная платформа для хостинга веб-приложений. Бесплатный аккаунт хорошо подходит для обучения.

Ее преимущества:

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

Но есть и недостатки:

  • бесплатные сервисы «засыпают», если ими никто не пользовался последних полчаса. Это означает, что возможна такая ситуация: вы заходите на свой сайт и вместо него видите стандартную страницу сервиса с просьбой подождать. Через какое-то время (до нескольких минут) сервис «просыпается» и начинает работать, как положено.
  • по умолчанию используется версия node 0.4.10. Но это можно исправить.


Warning: Большая часть того, что написано дальше, является кратким пересказом официальной документации. Конечно, лучше будет почитать полную версию.

Термины

При работе с DotCloud слово приложение (application) означает совокупность сервисов (services), которые вы используете. Сервисом может быть один процесс node.js (php, python, ruby и т.д.) или один экземпляр базы данных. Например, из сервисов php и mysql можно сделать приложение «блог на wordpress».

Когда вы зарегистрируетесь на сайте, в разделе Settings увидите так называемый API Key — случайно сгенерированную последовательность букв и цифр. Она понадобится в дальнейшем для работы с платформой.

Все действия с DotCloud выполняются с помощью специальной утилиты dotcloud (в документации ее называют CLI — Command-Line Interface).

Установка CLI

CLI написан на питоне и использует менеджер пакетов EasyInstall, поэтому сначала нужно установить его:

sudo apt-get install python-setuptools python-dev build-essential

и потом

sudo easy_install pip && sudo pip install dotcloud

В результате у вас в системе появится утилита dotcloud. При первом запуске надо будет ввести ваш API Key.

Установка приложения

Простейший пример приложения нашелся вот здесь. Но оно ничего не делает, а потому не особо интересно.

Подготовка исходников

Допустим, у вас уже есть какое-то работающее приложение node.js. Можно воспользоваться примером из этой статьи. Нужно будет внести одно изменение: dotCloud-приложения обязаны слушать порт 8080. После деплоймента оно будет доступно как обычно, по 80-му порту, но но в исходниках это должен быть именно 8080.

Описание приложения

Для развертывания нужно создать и положить в правильные места на файловой системе три файла: dotcloud.yml, supervisord.conf и package.json. В итоге должна получиться такая структура:

ninja_on_dotcloud/
|_ dotcloud.yml    
|_ ninja-store/      Эта папка станет корневым каталогом вашего сайта
   |_ supervisord.conf  
   |_ package.json      
   |_ app.js         стартовый файл приложения
   |_ ...               прочие файлы и папки вашего сайта

Файл dotcloud.yml описывает набор сервисов, которые использует наше приложение. Сервис у нас один, поэтому dotcloud.yml выглядит так:

www:
  type: nodejs
  approot: ninja-store

Здесь www — имя сервиса (теоретически может быть любым), ninja-store — наша папка с исходниками.
supervisord.conf тоже простой:

[program:node]
command = node app.js
directory = /home/dotcloud/current

В данном случае app.js — основной файл нашего приложения.

package.json — стандартный файл npm. Для размещения на dotCloud имеет значение только секция dependencies, в которой перечисляются пакеты, используемые вашим приложением.

Развертывание

Чтобы все это попало на сервер, нужно выполнить две команды.

Сначала создать приложение

dotcloud create -f sandbox nstore

Ключ -f задает application flavor — грубо говоря, тарифный план и опции хостинга. nstore — имя нашего приложения, понадобится для дальнейшего управления.

И, наконец, отправить код нашего сайта на сервер

dotcloud push nstore ./ninja_on_dotcloud

В результате, если все пройдет хорошо, то в консоли напишут адрес, по которому приложение станет доступно. В моем случае это http://nstore-beardog.dotcloud.com/. Правила, по которым формируется этот URL, могут меняться: год назад просто генерировалась случайная последовательность символов, сейчас комбинируется имя приложения и акаунта. Использовать свой собственный домен с бесплатным акаунтом нельзя.

А если будет плохо, прийдется смотреть логи.

Просмотр логов

Если приложение успешно запустилось, логи можно посмотреть командой

dotcloud logs имя_приложения.имя_сервиса

Бывает, что приложение не удается запустить (например, если забыть указать зависимость в package.json). Тогда нужно использовать что-то вроде очень урезанного ssh-доступа. Например, вот так я обнаружил, что в версии 0.4.10 нехватает модуля zlib, нужного для работы express.js:

user@u5$ dotcloud ssh ninjastore.www
# $SHELL
dotcloud@ninjastore-default-www-0:~$ ls /var/log/supervisor/
node-stderr---supervisor-7vur0l.log  node-stdout---supervisor-xqRYq7.log  supervisord.log
dotcloud@ninjastore-default-www-0:~$ tail --lines=20  /var/log/supervisor/node-stderr---supervisor-7vur0l.log

node.js:134
    throw e; // process.nextTick error, or 'error' event on first tick
    ^
Error: Cannot find module 'zlib'
at Function._resolveFilename (module.js:317:11)
at Function._load (module.js:262:25)
at require (module.js:346:19)
at Object.<anonymous> (/home/dotcloud/node_modules/express/node_modules/connect/lib/middleware/compress.js:14:12)
at Module._compile (module.js:402:26)
at Object..js (module.js:408:10)
at Module.load (module.js:334:31)
at Function._load (module.js:293:12)
at require (module.js:346:19)
at Object.compress (/home/dotcloud/node_modules/express/node_modules/connect/lib/connect.js:89:14)

Названия файлов с логами могут измениться с выходом новой версии платформы, поэтому четкой инструкции дать не получится. Скорее всего, где-то в /var/log/ есть файл с нужной информацией.

Установка других версий node

Благодаря хаку, продемонстрированному в этом репозитории, на dotCloud можно установить любую версию node.js.

Нужно:

  1. Скопировать репозиторий
  2. В файле dotcloud.yml в поле node_version указать нужную версию
  3. Естественно, заменить hellonode на свои исходники
  4. Выполнить dotcloud push, как обычно.

Важно: удалите папку .git после клонирования. Если dotcloud ее заметит, то попытается забрать исходники с github'а, вместо того, чтобы использовать локальную версию.

В результате в процессе установки dotcloud скачает и скомпилирует исходники указанной версии node. При следующих вызовах push компиляция проводиться не будет.

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

Еще одна возможная проблема — порт, который должно слушать приложение. Почему-то в том примере он задается вот так:

}).listen(process.env['PORT_WWW'] || 8080);

Все, спасибо за внимание. Вот здесь была еще одна статья про dotcloud, mongodb и node. А еще год назад на хабре уже появлялась статья с таким названием (к сожалению, я ее нашел уже после того, как написал свою)

Автор: beardog

* - обязательные к заполнению поля