- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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


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

Термины

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

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

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

Установка CLI

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

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

и потом

sudo easy_install pip && sudo pip install dotcloud

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

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

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

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

Допустим, у вас уже есть какое-то работающее приложение node.js. Можно воспользоваться примером [8] из этой статьи [9]. Нужно будет внести одно изменение: dotCloud-приложения обязаны слушать порт 8080 [10]. После деплоймента оно будет доступно как обычно, по 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 [11] — стандартный файл npm [12]. Для размещения на dotCloud имеет значение только секция dependencies [13], в которой перечисляются пакеты, используемые вашим приложением.

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

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

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

dotcloud create -f sandbox nstore

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

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

dotcloud push nstore ./ninja_on_dotcloud

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

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

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

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

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

Бывает, что приложение не удается запустить (например, если забыть указать зависимость в package.json). Тогда нужно использовать что-то вроде очень урезанного ssh-доступа [17]. Например, вот так я обнаружил, что в версии 0.4.10 нехватает модуля zlib [18], нужного для работы 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

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

Нужно:

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

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

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

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

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

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

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

Автор: beardog


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/node-js/10846

Ссылки в тексте:

[1] dotCloud: https://www.dotcloud.com/

[2] хостинга: https://www.reg.ru/?rlink=reflink-717

[3] heroku: http://www.heroku.com/pricing#2-0

[4] документация: http://docs.dotcloud.com/firststeps/platform-overview/

[5] CLI: http://docs.dotcloud.com/firststeps/install/

[6] установить его: http://www.linuxask.com/questions/how-to-install-easy-install-for-python-in-ubuntu

[7] здесь: https://github.com/atodorov/dotcloud-nodejs-hello-world

[8] примером: https://github.com/hacksparrow/ninja-store

[9] статьи: http://www.hacksparrow.com/express-js-tutorial.html

[10] слушать порт 8080: http://docs.dotcloud.com/services/nodejs/#listen-on-port-8080

[11] package.json: http://npmjs.org/doc/json.html

[12] npm: http://npmjs.org/doc/

[13] dependencies: http://npmjs.org/doc/json.html#dependencies

[14] application flavor: http://docs.dotcloud.com/guides/flavors/

[15] http://nstore-beardog.dotcloud.com/: http://nstore-beardog.dotcloud.com/

[16] командой: http://docs.dotcloud.com/guides/logs/#streaming-the-logs

[17] ssh-доступа: http://docs.dotcloud.com/guides/logs/#read-the-archives

[18] zlib: http://nodejs.org/api/zlib.html

[19] этом репозитории: https://github.com/dotcloud/node-on-dotcloud

[20] забрать исходники с github'а: http://docs.dotcloud.com/guides/git-hg/

[21] вот эту версию: https://github.com/afoong/node-on-dotcloud

[22] вот так: https://github.com/dotcloud/node-on-dotcloud/blob/master/hellonode/server.js

[23] Вот здесь: http://steveram.info/blog/2011/08/02/dotcloud-deploying-a-nodejsmongodb-app/

[24] статья: http://habrahabr.ru/post/125375/