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.
Нужно:
- Скопировать репозиторий
- В файле dotcloud.yml в поле
node_version
указать нужную версию - Естественно, заменить
hellonode
на свои исходники - Выполнить
dotcloud push
, как обычно.
Важно: удалите папку .git после клонирования. Если dotcloud ее заметит, то попытается забрать исходники с github'а, вместо того, чтобы использовать локальную версию.
В результате в процессе установки dotcloud
скачает и скомпилирует исходники указанной версии node. При следующих вызовах push
компиляция проводиться не будет.
Возможно, возникнут проблемы с логами, тогда можно попробовать вот эту версию
Еще одна возможная проблема — порт, который должно слушать приложение. Почему-то в том примере он задается вот так:
}).listen(process.env['PORT_WWW'] || 8080);
Все, спасибо за внимание. Вот здесь была еще одна статья про dotcloud, mongodb и node. А еще год назад на хабре уже появлялась статья с таким названием (к сожалению, я ее нашел уже после того, как написал свою)
Автор: beardog