понедельник, 23 сентября 2013 г.

Git, nodejs-проект и SSH. Установка, разворачивание, запуск в фоне

Итак, поступил заказ на "допиливание" проекта, или же вы купили новый девайс, на котором планируете вести разработку любимого Web-приложения параллельно с основным или надо быстро поднять окружение для разработки на Node.js с уже имеющимся кодом или... Или 1000 и одна причина по которой может резко понадобиться разворачивание проекта на машине. Речь, как можно догадаться из заголовка, пойдет о таких вещах: Nodejs, Git, Ssh. Начнем-с.
В первую очередь оговорюсь, все проделывалось в Debian/Ubuntu системе, хотя немного изменив курс туториала, это применимо и к другим дистрибутивам и даже к Windows :)

  • Ставим Git если его еще нет в системе (для Винды это  вообще очен мажно с ним в придачу можно поставить чудо-юдо MingGW)
    $ sudo apt-get install git
    
  • На всякий случай обновляем репы
    $ sudo apt-get update
    
  • Вот эта штука очень полезная, я про python-software-properties. Она содержит в себе утилиту add-apt-repository и что самое грустое что если у вас сервер Ubuntu то скорее всего у вас ее нет, если десктоп, то можно и не ставить.
    $ sudo apt-get install python-software-properties python g++ make # Ставим зависимости
    $ sudo add-apt-repository ppa:chris-lea/node.js # Добавляем репозиторий node.js
    $ sudo apt-get update # Обновляем репы
    $ sudo apt-get install nodejs # Ставим node.js последней версии
    
  • Далее переходим в директорию в которой будем разворачивать проект
    $ cd /var/www # Эта директория указана для примера и может быть любой другой.
    
  • Далее надо сгенерировать SSH ключ
    $ ssh-keygen -t rsa
    
    Если вы не указывали никакого другого пути для сохранения ключа то вы его можете найти в
    $ ~/.ssh/id_rsa.pub
    
  • Копируем его содержимое и добавляем в сервис (или в ~/.ssh/authorized_key на сервере от куда мы будем тянуть код проекта) например это может быть Github, Bitbaсket, Heroku и др. У меня это Heroku
  • Переходим в папку для проекта у меня это /var/www и клонируем проект
    $ cd /var/www
    $ git clone git@heroku.com:yourproject.git ./
    
  • После чего не забываем установить сопутствующие модули, не думаю что у вас их не будет
    $ npm install
    
  • И если вы хотите "повешать" процесс на "прослушку" 80-го порта, то не забудте это сделать от рута, т.к. мы же все помним что порты ниже 1024 требуют прав рута.
    $ sudo NODE_ENV=staging PORT=80 node app.js
    

А еще нам может понадобиться запустить ноду в фоне, аля процесс-демон. Сразу скажу тут не будет ничего про демоны, а будет про интересный модуль supervisor и "финт" ушами.

Итак для того чтобы запустить ноду в фоне надо выполнить следующую команду. Предварительно создайте директорию для логирования вывода процесса, ну, например, /home/macho/logs/ или /var/logs/yourproject

$ sudo npm install supervisor -g # Устанавливаем глобально модуль supervisor
$ sudo NODE_ENV=staging PORT=80 supervisor app.js > /var/logs/yourproject &
Собственно команда выше запустит ноду в фоне и вы можете насладится результатами работы вашего приложения на 80-м порту.
Удачи, надеюсь пост окажет непосильную помощь, в освоении node.js

понедельник, 16 сентября 2013 г.

Nodejs. Как же все таки работать с модулем Async

Node.js ворвалось на сервера с невероятной скоростью, ровно с такой же скоростью повергло в шок многих сервер-сайд разработчиков... Многим даже пришлось действительно изучить JavaScript и выйти за уровень jQuery подключателей :), но думаю одной из самых интересных и необычных сторон Node.js в частности и JavaScript в целом это его система колбеков, асинхронных вызовов. Потеряться во вложенности начинающему разработчику раз плюнуть.

Как полностью устроен принцип работы callback в node.js рассказывать не стану. Просто скажу, что первым параметром колбека всегда должен быть err объект или строка ошибки. Если внутри вашей пачки колбеков (в независимом скоупе есть еще череда колбеков), то у внутренних колбеков можно опустить параметр ошибки, т.к. эта пачка будет "видеть" общий для них объект ошибки, который можно смело передать в "выходной" колбек. Чего-то я какой-то замудренной фигни понаписал :), итак перейдем к инструменту который позволяет немного упростить и привести ваш код к более красивому и читаемому виду - это модуль Async, он позволяет навести порядки в ваших стеках колбэков. Итак приступаем. Первым делом добавляем в ваш package.json новую зависимость: "async": "*", после запускаем
npm install
Или же можно просто сделать так
npm install --global async
Эта команда установит Async глобально в вашу систему и будет доступен во всех проектах. Итак что нам может предложить Async для Node.js? А предложить он может многое стоит заглянуть для полного списка на его страничку github.org,я же приведу примеры для некоторых из них, и только из раздела control flow а именно:

Series — этот метод позволяет выполнять коллекцию задач по-порядку, и на выходе выполнить какой-нибудь полезный колбек. Этот метод полезен когда важен порядок выполнения, если можно так сказать то этот метод позволит вам "победить" асинхронность ноды:
var async = require('async')
  , tasksIndex = [
        function (callback) {
            // Вымышленный метод который вернет 231
            var viewsNumber = models.stat.viewsNumber();
            callback(null, viewsNumber);         
        }
      , function (callback) {
            // Вымышленный метод который вернет 24
            var growFactor = models.stat.growFactor();
            callback(null, growFactor);
        }
    ]
  , taskNamed = {
        viewsNumber: function (callback) {
            callback(null, models.stat.viewsNumber());
        }
      , growFactor: function (callback) {
            callback(null, models.stat.growFactor());
        }
    };

async.series(tasksIndex, function (err, results) {
    // Результат будет массивом
    console.log(results); // [231, 24]
});
async.series(taskNamed, function (err, results) {
    // Результат будет объектом 
    console.log(results); // {viewsNumber: 231, growFactor: 24}
});

Parallel — а этот метод работает в лучших традициях ноды, не нарушая ее асинхронности, но позволяет отследить конец работы всей пачки задач, т.е. все задачи выполняются параллельно и в конце результаты пробрасываются в финальный колбек. Листинг для этого метода практически ничем не будет отличаться от предыдущего, только надо вызвать не series а parallel

Waterfall — этот метод работает словно цепочка, результаты одной задачи передаются в колбеке следующей задачи, таким образом можно:
async.waterfall([
    function(callback){
        callback(null, 'один', 'два');
  , }
    function(arg1, arg2, callback){
        // Тут arg1 равен "один"
        // , а arg2 равен "два"
        // что соответствует второму и третьему параметру текщего колбека
        // , а первый конечно же мы не забыли - это err но в этом случае
        // ошибок нет поэтому null
        callback(null, 'три');
  , }
    function(arg1, callback){
        // Здесь же arg1 будет равен уже "три"
        callback(null, 'Готово');
    }
], function (err, result) {
   // Сейчас результат будет равен 'Готово'    
});

Собственно это основные методы по контролю за выполнением колбеков, который упростят работу с ними, для получения более подробной информации советую посетить страничку модуля на Github.

воскресенье, 15 сентября 2013 г.

Nodejs. Тотальная установка на Windows 8 с поддержкой npm.

Итак собственно как же это дело провернуть, и вообще возможно ли такое в "недружелюбной" к ноде среде Windows? Возможно! Надо ли? А вот это уже решать Вам.
Итак что же мы будем ставить на машину под управлением операционной системы Windows 8
  1. Node.js
  2. Npm
  3. Redis
  4. MongoDB
Вот такой вполне обычный набор инструментов для NodeJS разработчика. Скажу честно это же поставить на, допустим, ту же Ubuntu вообще не составляет никакого труда. Чего увы не скажешь про Windows. Кто сталкивался с этой проблемой думаю меня поймут. Более того толкового мануальчика в рунете я не нашел, поэтому с успехом настроив себе рабочую среду для NodeJS спешу поделиться инструкциями по установке NodeJS с рабочим NPM (это даже важней чем сама нода) под Windows 8.
Итак приступим. В первую очередь качаем саму ноду устанавливаем, почему именно инсталятор, ну если просто бинарник качать то потом отдельно если я не ошибаюсь вам надо будет качать и npm и прописывать его вместе с нодой в системные пути, а так раз поставил... и все готово.
Собственно нода уже готова для работы. Но нода в "сыром" виде сейчас мало кого устроит. Многие уже сработались с определенным набором модулей. Например, для меня одни из самых основных модулей это:
  1. Expressjs
  2. Mongoose
  3. Mongodb
  4. Async
  5. Request
и многие другие.

Во многих проектах они прописаны в соответствующем файле, но увы если я выполню на этом этапе команду npm install в каталоге с проектом, но с большой долей вероятности многие нативные модули (а если точнее, то модули которые используют для сборки нативный модуль node-gyp) не скомпилируются, собственно все финиш. Нода как бы есть, а по факту ноды-то и нет. Для дальнейших действий обязательно убедитесь в том, что у вас в системе не установлены Visual C++ Redistributable это может повредить дальнейшей работе. Если у вас они установлены: удалите их. Вы возможно нуждались в их установке при настройке PHP+xdebug, увы как поведет себя эта связка после настройки ноды, я не знаю, не проверял.
Теперь надо установить вот эти вещи в том порядке, в котором я их приведу ниже, и очень важно! Не пытайтесь экспериментировать с версиями если вам надо ноду настроить как можно скорее, иначе рискуете увязнуть... и увязнуть надолго.
  1. Visual Studio 2010
  2. Windows SDK 7.1
  3. Visual Studio 2010 SP1
  4. Visual C++ 2010 SP1 Compiler Update for the Windows SDK 7.1
После всего этого программного пакета стоит еще до-уставновить немаловажную штуковину и это Python 2.7 он также необходим для корректной работы node-gyp.

Все! После проделанной работы переходим в корневой каталог вашего приложения и пробуем запустить npm install, должно все пройти гладко. После чего запускаем свое любимое приложения на node.js под Windows 8 x64 (собственно я думаю и под Win 7 тоже пойдет на ура)

И в догонку совсем забыл упомянуть про MongoDB и Redis. И если с монго проблем у вас быть не должно то вот редис, не совсем прост. Качаем с Git любым вашим любимым способом Redis в желаемое месторасположение. Затем в корне ищем по пути /bin/release/ бинарники, все вы их можете запускать и работать с редис под Win 8, но я рекомендую путь к бинарникам занести в системные пути (дописать в переменную PATH)

P.S.: Честно говоря, после Ubuntu настройка node.js под Windows 8 показалась мне жутким садизмом. Но было жалко выбрасывать на свалку впервые честно приобретенную Win 8, пускай и в комплекте с ноутом... а было бы круто если я бы я мог отдать ненужную систему и получить компенсацию, но это блин утопия :)