<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>MemberManual/WebApplications/NodeJs</title><revhistory><revision><revnumber>4</revnumber><date>2014-05-18 02:50:36</date><authorinitials>MattCarberry</authorinitials><revremark>Finished it up hopefully</revremark></revision><revision><revnumber>3</revnumber><date>2014-05-16 08:51:08</date><authorinitials>MattCarberry</authorinitials><revremark>Added more to test install</revremark></revision><revision><revnumber>2</revnumber><date>2014-05-16 08:01:13</date><authorinitials>MattCarberry</authorinitials><revremark>Added more information</revremark></revision><revision><revnumber>1</revnumber><date>2014-04-30 07:42:48</date><authorinitials>MattCarberry</authorinitials><revremark>Initial Commit</revremark></revision></revhistory></articleinfo><section><title>What is Node.js</title><itemizedlist><listitem override="none"><para>Node.js is an application server based off of Google's V8 Javascript Engine. Quite a few popular frameworks have popped up around Node.js such as AngularJS and Backbone.js.   </para></listitem></itemizedlist></section><section><title>How</title><section><title>Request a port</title><itemizedlist><listitem override="none"><para>Request a ProxiedServer port on bog as described in <ulink url="https://wiki.hcoop.net/MemberManual/WebApplications/NodeJs/FirewallRules#">FirewallRules</ulink>  </para></listitem></itemizedlist></section><section><title>Get Node.js</title><itemizedlist><listitem override="none"><para>Make a directory for your website </para><screen><![CDATA[mcarberry@bog:~$ mkdir ~/public_web/sitename
mcarberry@bog:~$ mkdir ~/public_web/sitename/nodejs
mcarberry@bog:~$ cd ~/public_web/sitename]]></screen><para>Download Node.js </para><screen><![CDATA[mcarberry@bog:~/public_web/sitename$ wget http://nodejs.org/dist/v0.10.26/node-v0.10.26.tar.gz
mcarberry@bog:~/public_web/sitename$ tar -xf node-v0.10.26.tar.gz 
mcarberry@bog:~/public_web/sitename$ cd node-v0.10.26/]]></screen></listitem></itemizedlist></section><section><title>Build Node.js</title><itemizedlist><listitem override="none"><screen><![CDATA[mcarberry@bog:~/public_web/sitename/node-v0.10.26$ ./configure 
mcarberry@bog:~/public_web/sitename/node-v0.10.26$ make
mcarberry@bog:~/public_web/sitename/node-v0.10.26$ make install DESTDIR=~/public_web/sitename/nodejs]]></screen><para>Cleanup Install Directory </para><screen><![CDATA[mcarberry@bog:~/public_web/sitename/node-v0.10.26$ cd ../nodejs/
mcarberry@bog:~/public_web/sitename/nodejs$ cp -r usr/local/* .
mcarberry@bog:~/public_web/sitename/nodejs$ rm -r usr
mcarberry@bog:~/public_web/sitename/nodejs$ cd ..
mcarberry@bog:~/public_web/sitename$ rm -r node-v0.10.26/]]></screen></listitem></itemizedlist></section><section><title>Test Install</title><itemizedlist><listitem override="none"><para>Change the port in this script (gleaned from <ulink url="http://howtonode.org/how-to-install-nodejs">here</ulink>) to the one requested in the firewall rules and place it in ~/public_web/sitename/. </para><programlisting format="linespecific" language="js" linenumbering="numbered" startinglinenumber="1"><token><![CDATA[var]]></token><![CDATA[ ]]><methodname><![CDATA[http]]></methodname><![CDATA[ = ]]><methodname><![CDATA[require]]></methodname><![CDATA[(]]><phrase><![CDATA['http']]></phrase><![CDATA[);]]>
<methodname><![CDATA[http]]></methodname><![CDATA[.]]><methodname><![CDATA[createServer]]></methodname><![CDATA[(]]><token><![CDATA[function]]></token><![CDATA[ (]]><methodname><![CDATA[req]]></methodname><![CDATA[, ]]><methodname><![CDATA[res]]></methodname><![CDATA[) {]]>
<![CDATA[  ]]><methodname><![CDATA[res]]></methodname><![CDATA[.]]><methodname><![CDATA[writeHead]]></methodname><![CDATA[(200, {]]><phrase><![CDATA['Content-Type']]></phrase><![CDATA[: ]]><phrase><![CDATA['text/plain']]></phrase><![CDATA[});]]>
<![CDATA[  ]]><methodname><![CDATA[res]]></methodname><![CDATA[.]]><methodname><![CDATA[end]]></methodname><![CDATA[(]]><phrase><![CDATA['Hello Node.js\n']]></phrase><![CDATA[);]]>
<![CDATA[}).]]><methodname><![CDATA[listen]]></methodname><![CDATA[(8124, ]]><phrase><![CDATA["127.0.0.1"]]></phrase><![CDATA[);]]>
<methodname><![CDATA[console]]></methodname><![CDATA[.]]><methodname><![CDATA[log]]></methodname><![CDATA[(]]><phrase><![CDATA['Server running at http://127.0.0.1:8124/']]></phrase><![CDATA[);]]>
</programlisting><para>Configure your domain, modelling <ulink url="https://wiki.hcoop.net/MemberManual/WebApplications/NodeJs/DomTool/Examples#mod_proxy">this example</ulink>. This will foward requests to your domain to the port that you requested on bog. Give it a test run </para><screen><![CDATA[ mcarberry@bog:~/public_web/sitename$ ./nodejs/bin/node hello_world.js]]></screen><para>If it works, when you visit your domain name you should see the Hello Node.js message. </para></listitem></itemizedlist></section><section><title>Write a Script to Start the Server</title><itemizedlist><listitem override="none"><para>Here's a script I use to start my Node.js server running Ghost.  You'll need to use k5start (as I do) in order to make sure your server is able to maintain access to AFS. You should be able to modify this script to your needs with not too much effort. </para><programlisting format="linespecific" language="bash" linenumbering="numbered" startinglinenumber="1"><lineannotation><![CDATA[#!/bin/bash]]></lineannotation>
<lineannotation></lineannotation><methodname><![CDATA[HOME]]></methodname><![CDATA[=/afs/hcoop.net/user/m/mc/mcarberry]]>
<methodname><![CDATA[GHOSTROOT]]></methodname><![CDATA[=]]><methodname><![CDATA[$HOME]]></methodname><![CDATA[/public_web/ghost/ghost-app]]>
<methodname><![CDATA[NODEROOT]]></methodname><![CDATA[=]]><methodname><![CDATA[$HOME]]></methodname><![CDATA[/public_web/ghost/nodejs]]>

<methodname><![CDATA[NODE]]></methodname><![CDATA[=]]><methodname><![CDATA[$NODEROOT]]></methodname><![CDATA[/bin/node]]>

<methodname><![CDATA[PIDFILE]]></methodname><![CDATA[=]]><methodname><![CDATA[$GHOSTROOT]]></methodname><![CDATA[/ghost.pid]]>

<methodname><![CDATA[K5START]]></methodname><![CDATA[=]]><phrase><![CDATA["k5start -qtUf /etc/keytabs/user.daemon/mcarberry"]]></phrase>

<token><![CDATA[cd]]></token><![CDATA[ ]]><methodname><![CDATA[$GHOSTROOT]]></methodname>

<methodname><![CDATA[NODE_CONFIG_DIR]]></methodname><![CDATA[=]]><methodname><![CDATA[$GHOSTROOT]]></methodname>

<token><![CDATA[if]]></token><![CDATA[ (]]><token><![CDATA[test]]></token><![CDATA[ -f ]]><methodname><![CDATA[$PIDFILE]]></methodname><![CDATA[); ]]><token><![CDATA[then]]></token>
<![CDATA[  ]]><token><![CDATA[echo]]></token><![CDATA[ ]]><phrase><![CDATA["PID File exists..."]]></phrase>
<![CDATA[  ]]><methodname><![CDATA[PID]]></methodname><![CDATA[=]]><phrase><![CDATA[`]]></phrase><![CDATA[cat ]]><methodname><![CDATA[$PIDFILE]]></methodname><![CDATA[ 2> /dev/null]]><phrase><![CDATA[`]]></phrase>
<![CDATA[  ]]><token><![CDATA[echo]]></token><![CDATA[ ]]><phrase><![CDATA["Is previous server still running"]]></phrase>
<![CDATA[  ]]><token><![CDATA[kill]]></token><![CDATA[ -0 ]]><methodname><![CDATA[$PID]]></methodname><![CDATA[ 2> /dev/null]]>
<![CDATA[  ]]><token><![CDATA[if]]></token><![CDATA[ (]]><token><![CDATA[test]]></token><![CDATA[ ]]><methodname><![CDATA[$?]]></methodname><![CDATA[ -ne 0); ]]><token><![CDATA[then]]></token>
<![CDATA[    ]]><token><![CDATA[echo]]></token><![CDATA[ ]]><phrase><![CDATA["Nope, starting server"]]></phrase>
<![CDATA[    ]]><methodname><![CDATA[$K5START]]></methodname><![CDATA[ -b -c ]]><methodname><![CDATA[$PIDFILE]]></methodname><![CDATA[ -- ]]><methodname><![CDATA[$NODE]]></methodname><![CDATA[ ]]><methodname><![CDATA[$GHOSTROOT]]></methodname><![CDATA[/index.js]]>
<![CDATA[  ]]><token><![CDATA[else]]></token>
<![CDATA[    ]]><token><![CDATA[echo]]></token><![CDATA[ ]]><phrase><![CDATA["Yes, no need to start server"]]></phrase>
<![CDATA[    ]]><token><![CDATA[exit]]></token><![CDATA[ 0]]>
<![CDATA[  ]]><token><![CDATA[fi]]></token><![CDATA[  ]]>
<token><![CDATA[else]]></token>
<![CDATA[  ]]><token><![CDATA[echo]]></token><![CDATA[ ]]><phrase><![CDATA["Starting server"]]></phrase>
<![CDATA[  ]]><methodname><![CDATA[$K5START]]></methodname><![CDATA[ -b -c ]]><methodname><![CDATA[$PIDFILE]]></methodname><![CDATA[ -- ]]><methodname><![CDATA[$NODE]]></methodname><![CDATA[ ]]><methodname><![CDATA[$GHOSTROOT]]></methodname><![CDATA[/index.js]]>
<token><![CDATA[fi]]></token>
</programlisting></listitem></itemizedlist></section><section><title>Add a Reboot Rule to Crontab</title><itemizedlist><listitem override="none"><para>Request crontab access throught the portal, and set a rule such that your script will be run in the event of bog being rebooted. </para></listitem></itemizedlist></section></section></article>