Permalink
Browse files

Merge branch 'master' of https://github.com/nodester/nodester

* 'master' of https://github.com/nodester/nodester: (24 commits)
  updated FAQ about node.js versions
  added alejandromg to nodester about page - core team member
  updated apps post docs
  changed access method of appname in put and post
  changed access method of appname in put and post
  changed access method of appname in put and post
  changed access method of appname in put and post
  changed access method of appname in put and post
  added appname to path on apps put and post
  modified the permissions on create directory to see if it fixes 296 and or 313
  updated cli page - added new env commands
  This prevents one from doing, say, nodester npm install -g my_malicious_package
  Updated API docs. (#320)
  Added back in old routes, marking them as deprecated. (#320)
  added mobi to list of valid TLD
  'okay no ternary :<'
  "add radix to parseInt"
  "switch to ternary operator"
  'made errorPage a local variable'
  Changed API according to #320.
  ...
  • Loading branch information...
2 parents 613d727 + 5fece0f commit a3b735eb02bae5dabec038fec8d0d6cdcd85618d @alejandro alejandro committed Mar 4, 2012
Showing with 91 additions and 56 deletions.
  1. +17 −14 app.js
  2. +1 −1 bin/create_user_dir.js
  3. +5 −1 lib/app.js
  4. +7 −6 lib/lib.js
  5. +6 −1 lib/middle.js
  6. +1 −1 proxy/proxy.js
  7. +4 −4 public/about.html
  8. +32 −21 public/api.html
  9. +16 −5 public/help.html
  10. BIN public/images/sizzly-rokkit.png
  11. +2 −2 public/index.html
View
31 app.js
@@ -107,14 +107,16 @@ myapp.get('/apps', middle.authenticate, apps.get);
var app = require('./lib/app');
// Application info
-// http://chris:123@localhost:4001/app/<appname>
-// curl -u "testuser:123" http://localhost:4001/app/<appname>
-myapp.get('/app/:appname', middle.authenticate, middle.authenticate_app, app.get);
+// http://chris:123@localhost:4001/apps/<appname>
+// curl -u "testuser:123" http://localhost:4001/apps/<appname>
+myapp.get('/apps/:appname', middle.authenticate, middle.authenticate_app, app.get);
+myapp.get('/app/:appname', middle.deprecated, middle.authenticate, middle.authenticate_app, app.get); // deprecated
// Create node app
// curl -X POST -u "testuser:123" -d "appname=test&start=hello.js" http://localhost:4001/apps
-myapp.post('/app', middle.authenticate, app.post);
-
+myapp.post('/apps/:appname', middle.authenticate, app.post);
+myapp.post('/apps', middle.authenticate, app.post);
+myapp.post('/app', middle.deprecated, middle.authenticate, app.post); // deprecated
// App backend restart handler
myapp.get('/app_restart', app.app_restart);
@@ -125,17 +127,18 @@ myapp.get('/app_stop', app.app_stop);
// start=hello.js - To update the initial run script
// running=true - To Start the app
// running=false - To Stop the app
-// curl -X PUT -u "testuser:123" -d "appname=test&start=hello.js" http://localhost:4001/app
-// curl -X PUT -u "testuser:123" -d "appname=test&running=true" http://localhost:4001/app
-// curl -X PUT -u "testuser:123" -d "appname=test&running=false" http://localhost:4001/app
-// curl -X PUT -u "testuser:123" -d "appname=test&running=restart" http://localhost:4001/app
+// curl -X PUT -u "testuser:123" -d "start=hello.js" http://localhost:4001/apps/test
+// curl -X PUT -u "testuser:123" -d "running=true" http://localhost:4001/apps/test
+// curl -X PUT -u "testuser:123" -d "running=false" http://localhost:4001/apps/test
+// curl -X PUT -u "testuser:123" -d "running=restart" http://localhost:4001/apps/test
// TODO - Fix this function, it's not doing callbacking properly so will return JSON in the wrong state!
-myapp.put('/app', middle.authenticate, middle.authenticate_app, app.put);
+myapp.put('/apps/:appname', middle.authenticate, middle.authenticate_app, app.put);
+myapp.put('/app', middle.deprecated, middle.authenticate, middle.authenticate_app, app.put); // deprecated
// Delete your nodejs app
-// curl -X DELETE -u "testuser:123" -d "appname=test" http://localhost:4001/apps
-myapp.del('/app/:appname', middle.authenticate, middle.authenticate_app, app.delete);
-
+// curl -X DELETE -u "testuser:123" -d http://localhost:4001/apps/test
+myapp.del('/apps/:appname', middle.authenticate, middle.authenticate_app, app.delete);
+myapp.del('/app/:appname', middle.deprecated, middle.authenticate, middle.authenticate_app, app.delete); // deprecated
myapp.del('/gitreset/:appname', middle.authenticate, middle.authenticate_app, app.gitreset);
@@ -204,4 +207,4 @@ function NotFound(msg) {
this.name = 'NotFound';
Error.call(this, msg);
Error.captureStackTrace(this, arguments.callee);
-};
+};
View
2 bin/create_user_dir.js
@@ -5,7 +5,7 @@ var config = require('../config.js').opt;
var dirs_string = config.git_home_dir + '/' + process.argv[2] + ' ' + config.apps_home_dir + '/' + process.argv[2];
-var cmds = ['mkdir ' + dirs_string, 'chown ' + config.git_user + ':' + config.app_uid + ' ' + dirs_string, 'chmod 0775 ' + dirs_string
+var cmds = ['mkdir ' + dirs_string, 'chown ' + config.git_user + ':' + config.app_uid + ' ' + dirs_string, 'chmod 0777 ' + dirs_string
];
View
6 lib/app.js
@@ -143,7 +143,8 @@ module.exports = {
});
},
put: function (req, res, next) {
- var appname = req.body.appname.toLowerCase();
+ // var appname = req.body.appname.toLowerCase();
+ var appname = req.param("appname").toLowerCase();
var user = req.user;
var app = req.app;
var db = lib.get_couchdb_database('apps');
@@ -410,6 +411,9 @@ module.exports = {
},
post: function (req, res, next) {
var appname = req.body.appname;
+ if (!appname){
+ appname = req.param("appname").toLowerCase();
+ };
var start = req.body.start;
if (!appname) {
res.writeHead(500, {
View
13 lib/lib.js
@@ -89,15 +89,15 @@ var build_proxytable_map = function (cb) {
} else {
resp.forEach(function (row) {
if (row.port && row._id) { // Block null routes
- proxy_map.router[row._id + "." + config.opt.tl_dom] = parseInt(row.port);
+ proxy_map.router[row._id + "." + config.opt.tl_dom] = parseInt(row.port, 10);
}
});
aliasdomains.view('aliasdomains/all', {}, function (err, resp) {
if (resp && resp.length) {
resp.forEach(function (row) {
if (row.port && row._id && row.host) { // Block null routes
- proxy_map.router[row._id] = parseInt(row.port);
- proxy_map.router[row.host] = parseInt(row.port);
+ proxy_map.router[row._id] = parseInt(row.port, 10);
+ proxy_map.router[row.host] = parseInt(row.port, 10);
}
});
}
@@ -133,7 +133,7 @@ var update_proxytable_map = function (cb) {
exports.update_proxytable_map = update_proxytable_map;
var checkDomain = function (nname) {
- var arr = new Array('.com', '.net', '.org', '.biz', '.coop', '.info', '.museum', '.name', '.pro', '.edu', '.gov', '.int', '.mil', '.ac', '.ad', '.ae', '.af', '.ag', '.ai', '.al', '.am', '.an', '.ao', '.aq', '.ar', '.as', '.at', '.au', '.aw', '.az', '.ba', '.bb', '.bd', '.be', '.bf', '.bg', '.bh', '.bi', '.bj', '.bm', '.bn', '.bo', '.br', '.bs', '.bt', '.bv', '.bw', '.by', '.bz', '.ca', '.cc', '.cd', '.cf', '.cg', '.ch', '.ci', '.ck', '.cl', '.cm', '.cn', '.co', '.cr', '.cu', '.cv', '.cx', '.cy', '.cz', '.de', '.dj', '.dk', '.dm', '.do', '.dz', '.ec', '.ee', '.eg', '.eh', '.er', '.es', '.et', '.fi', '.fj', '.fk', '.fm', '.fo', '.fr', '.ga', '.gd', '.ge', '.gf', '.gg', '.gh', '.gi', '.gl', '.gm', '.gn', '.gp', '.gq', '.gr', '.gs', '.gt', '.gu', '.gv', '.gy', '.hk', '.hm', '.hn', '.hr', '.ht', '.hu', '.id', '.ie', '.il', '.im', '.in', '.io', '.iq', '.ir', '.is', '.it', '.je', '.jm', '.jo', '.jp', '.ke', '.kg', '.kh', '.ki', '.km', '.kn', '.kp', '.kr', '.kw', '.ky', '.kz', '.la', '.lb', '.lc', '.li', '.lk', '.lr', '.ls', '.lt', '.lu', '.lv', '.ly', '.ma', '.mc', '.md', '.mg', '.mh', '.mk', '.ml', '.mm', '.mn', '.mo', '.mp', '.mq', '.mr', '.ms', '.mt', '.mu', '.mv', '.mw', '.mx', '.my', '.mz', '.na', '.nc', '.ne', '.nf', '.ng', '.ni', '.nl', '.no', '.np', '.nr', '.nu', '.nz', '.om', '.pa', '.pe', '.pf', '.pg', '.ph', '.pk', '.pl', '.pm', '.pn', '.pr', '.ps', '.pt', '.pw', '.py', '.qa', '.re', '.ro', '.rw', '.ru', '.sa', '.sb', '.sc', '.sd', '.se', '.sg', '.sh', '.si', '.sj', '.sk', '.sl', '.sm', '.sn', '.so', '.sr', '.st', '.sv', '.sy', '.sz', '.tc', '.td', '.tf', '.tg', '.th', '.tj', '.tk', '.tm', '.tn', '.to', '.tp', '.tr', '.tt', '.tv', '.tw', '.tz', '.ua', '.ug', '.uk', '.um', '.us', '.uy', '.uz', '.va', '.vc', '.ve', '.vg', '.vi', '.vn', '.vu', '.ws', '.wf', '.ye', '.yt', '.yu', '.za', '.zm', '.zw', '.me');
+ var arr = new Array('.com', '.net', '.org', '.biz', '.coop', '.info', '.mobi', '.museum', '.name', '.pro', '.edu', '.gov', '.int', '.mil', '.ac', '.ad', '.ae', '.af', '.ag', '.ai', '.al', '.am', '.an', '.ao', '.aq', '.ar', '.as', '.at', '.au', '.aw', '.az', '.ba', '.bb', '.bd', '.be', '.bf', '.bg', '.bh', '.bi', '.bj', '.bm', '.bn', '.bo', '.br', '.bs', '.bt', '.bv', '.bw', '.by', '.bz', '.ca', '.cc', '.cd', '.cf', '.cg', '.ch', '.ci', '.ck', '.cl', '.cm', '.cn', '.co', '.cr', '.cu', '.cv', '.cx', '.cy', '.cz', '.de', '.dj', '.dk', '.dm', '.do', '.dz', '.ec', '.ee', '.eg', '.eh', '.er', '.es', '.et', '.fi', '.fj', '.fk', '.fm', '.fo', '.fr', '.ga', '.gd', '.ge', '.gf', '.gg', '.gh', '.gi', '.gl', '.gm', '.gn', '.gp', '.gq', '.gr', '.gs', '.gt', '.gu', '.gv', '.gy', '.hk', '.hm', '.hn', '.hr', '.ht', '.hu', '.id', '.ie', '.il', '.im', '.in', '.io', '.iq', '.ir', '.is', '.it', '.je', '.jm', '.jo', '.jp', '.ke', '.kg', '.kh', '.ki', '.km', '.kn', '.kp', '.kr', '.kw', '.ky', '.kz', '.la', '.lb', '.lc', '.li', '.lk', '.lr', '.ls', '.lt', '.lu', '.lv', '.ly', '.ma', '.mc', '.md', '.mg', '.mh', '.mk', '.ml', '.mm', '.mn', '.mo', '.mp', '.mq', '.mr', '.ms', '.mt', '.mu', '.mv', '.mw', '.mx', '.my', '.mz', '.na', '.nc', '.ne', '.nf', '.ng', '.ni', '.nl', '.no', '.np', '.nr', '.nu', '.nz', '.om', '.pa', '.pe', '.pf', '.pg', '.ph', '.pk', '.pl', '.pm', '.pn', '.pr', '.ps', '.pt', '.pw', '.py', '.qa', '.re', '.ro', '.rw', '.ru', '.sa', '.sb', '.sc', '.sd', '.se', '.sg', '.sh', '.si', '.sj', '.sk', '.sl', '.sm', '.sn', '.so', '.sr', '.st', '.sv', '.sy', '.sz', '.tc', '.td', '.tf', '.tg', '.th', '.tj', '.tk', '.tm', '.tn', '.to', '.tp', '.tr', '.tt', '.tv', '.tw', '.tz', '.ua', '.ug', '.uk', '.um', '.us', '.uy', '.uz', '.va', '.vc', '.ve', '.vg', '.vi', '.vn', '.vu', '.ws', '.wf', '.ye', '.yt', '.yu', '.za', '.zm', '.zw', '.me');
var mai = nname;
var val = true;
@@ -175,7 +175,8 @@ var checkDomain = function (nname) {
exports.checkDomain = checkDomain;
var escape_packages = function (str) {
- return str.replace(/[^a-zA-Z0-9 \.\-_=<>@]+/g, '');
+ // return str.replace(/[^a-zA-Z0-9 \.\-_=<>@]+/g, '');
+ return str.replace(/[^a-zA-Z0-9 \.\-_=<>@]+/g, '').replace(/^[^a-zA-Z0-9]/, '');
};
exports.escape_packages = escape_packages;
@@ -352,4 +353,4 @@ var setup_unionfs_chroot = function (chroot_base, git_home, rw_folder, final_chr
};
exports.node_versions = node_versions;
-
+
View
7 lib/middle.js
@@ -112,9 +112,14 @@ var authenticate_app = function(req, res, next) {
}
};
+var deprecated = function(req, res, next) {
+ res.header('X-Deprecated');
+ next();
+};
module.exports.authenticate = authenticate;
module.exports.authenticate_app = authenticate_app;
+module.exports.deprecated = deprecated;
/*
* Generic request error handler.
*/
@@ -130,4 +135,4 @@ module.exports.error = function() {
};
next();
};
-};
+};
View
2 proxy/proxy.js
@@ -10,8 +10,8 @@ console.log('Starting proxy initialization');
var proxymap = {};
// Ghetto hack for error page
-var errorPage = '<html><head><title id="title">{title}</title></head><body><br/><br/><br/><br/><br/><center><img src="http://nodester.com/images/rocket-down.png" alt="logo" /><br/><h1 style ="color:#000;font-family:Arial,Helvetica,sans-serif;font-size:38px;font-weight:bold;letter-spacing:-2px;padding:0 0 5px;margin:0;">{code}</h1><h3 style ="color:#000;font-family:Arial,Helvetica,sans-serif;font-size:24px;font-weight:bold;padding:0 0 5px;margin:0;">{error}</h3></center></body></html>';
var getErrorPage = function (title, code, error) {
+ var errorPage = '<html><head><title id="title">{title}</title></head><body><br/><br/><br/><br/><br/><center><img src="http://nodester.com/images/rocket-down.png" alt="logo" /><br/><h1 style ="color:#000;font-family:Arial,Helvetica,sans-serif;font-size:38px;font-weight:bold;letter-spacing:-2px;padding:0 0 5px;margin:0;">{code}</h1><h3 style ="color:#000;font-family:Arial,Helvetica,sans-serif;font-size:24px;font-weight:bold;padding:0 0 5px;margin:0;">{error}</h3></center></body></html>';
return errorPage.replace('{title}', title).replace('{code}', code).replace('{error}', error);
};
View
8 public/about.html
@@ -47,13 +47,13 @@
<li><a href="http://blog.nodester.com">Blog</a></li>
</ul>
- <!-- <p class="pull-right">
+ <p class="pull-right">
<form action="http://admin.nodester.com/login" method="post" class="pull-right">
<input class="input-small" type="text" placeholder="Username" name="user[user]" />
<input class="input-small" type="password" placeholder="Password" name="user[pass]" />
<button class="btn" type="submit">Sign in</button>
</form>
- </p> -->
+ </p>
</div>
</div>
</div>
@@ -96,10 +96,10 @@
</div>
<div class="row">
<div class="span3">
- <img class="thumbnail" src="https://secure.gravatar.com/avatar/78983314535d79cea4626ee461cee54c?s=140&d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png" />
+ <img class="thumbnail" src="https://twimg0-a.akamaihd.net/profile_images/1859874864/temp1330427952strip20120228-1354-1kd340n" width="140" height="140" />
</div>
<div class="span13">
- <h2>Aaron Murry, Nodester Core Contributor <a href="http://twitter.com/wearefractal"><span class="label notice">Twitter</span></a> <a href="http://github.com/amurray"><span class="label">GitHub</span></a></h2>
+ <h2>Alejandro Morales, Nodester Core Contributor <a href="https://twitter.com/#!/_alejandromg"><span class="label notice">Twitter</span></a> <a href="http://github.com/alejandromg"><span class="label">GitHub</span></a></h2>
<p>Hacker</p>
</div>
</div>
View
53 public/api.html
@@ -71,13 +71,13 @@
<li><a href="http://blog.nodester.com">Blog</a></li>
</ul>
- <!-- <p class="pull-right">
+ <p class="pull-right">
<form action="http://admin.nodester.com/login" method="post" class="pull-right">
<input class="input-small" type="text" placeholder="Username" name="user[user]" />
<input class="input-small" type="password" placeholder="Password" name="user[pass]" />
<button class="btn" type="submit">Sign in</button>
</form>
- </p> -->
+ </p>
</div>
</div>
</div>
@@ -199,6 +199,22 @@
<td>nodester npm uninstall &lt;appname&gt; &lt;packages&gt;</td>
</tr>
<tr>
+ <td><b>env</b></td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>nodester env get &lt;appname&gt;</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>nodester env set &lt;appname&gt; &lt;key&gt; &lt;value&gt;</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>nodester env delete &lt;appname&gt; &lt;key&gt;</td>
+ </tr>
+ <tr>
<td><b>domain</b></td>
<td>&nbsp;</td>
</tr>
@@ -280,43 +296,38 @@
</td>
</tr>
<tr>
- <td><b>app</b></td>
- <td>&nbsp;</td>
- <td>&nbsp;</td>
- </tr>
- <tr>
<td>&nbsp;</td>
<td><a class="btn disabled success">POST</a></td>
- <td><b>/app</b> - Creates nodejs app for hosting (requires basic auth and returns the port address required for use along with a git repo to push to)<br />
- <code>curl -X POST -u "testuser:123" -d "appname=a&start=hello.js" http://api.nodester.com/app</code>
+ <td><b>/apps/&lt;appname&gt;</b> - Creates nodejs app for hosting (requires basic auth and returns the port address required for use along with a git repo to push to)<br />
+ <code>curl -X POST -u "testuser:123" -d "start=hello.js" http://api.nodester.com/apps/a</code>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td><a class="btn disabled">PUT</a></td>
- <td><b>/app</b> - Updates starting app name (requires basic auth, appname, and starting page and returns the port address required for use along with a git repo to push to and running status of the app)<br />
- <code>curl -X PUT -u "testuser:123" -d "appname=a&start=hello1.js" http://api.nodester.com/app</code>
+ <td><b>/apps/&lt;appname&gt;</b> - Updates starting app name (requires basic auth, appname, and starting page and returns the port address required for use along with a git repo to push to and running status of the app)<br />
+ <code>curl -X PUT -u "testuser:123" -d "start=hello1.js" http://api.nodester.com/apps/a</code>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td><a class="btn disabled">PUT</a></td>
- <td><b>/app</b> - Start and stop your hosted nodejs app (requires basic auth, appname, and running=true|false and returns the port address required for use along with a git repo to push to)<br />
- <code>curl -X PUT -u "testuser:123" -d "appname=a&running=true" http://api.nodester.com/app</code>
+ <td><b>/apps/&lt;appname&gt;</b> - Start and stop your hosted nodejs app (requires basic auth, appname, and running=true|false and returns the port address required for use along with a git repo to push to)<br />
+ <code>curl -X PUT -u "testuser:123" -d "running=true" http://api.nodester.com/apps/a</code>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td><a class="btn disabled danger">DELETE</a></td>
- <td><b>/app/&lt;appname&gt; </b>- Deletes nodejs app (requires basic auth and appname)<br />
- <code>curl -X DELETE -u "testuser:123" http://api.nodester.com/app/&lt;appname&gt;</code>
+ <td><b>/apps/&lt;appname&gt; </b>- Deletes nodejs app (requires basic auth and appname)<br />
+ <code>curl -X DELETE -u "testuser:123" http://api.nodester.com/apps/&lt;appname&gt;</code>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td><a class="btn disabled primary">GET</a></td>
- <td><b>/app/&lt;appname&gt;</b> - get nodejs app info (requires basic auth and appname)<br />
- <code>curl -u "testuser:123" http://api.nodester.com/app/&lt;appname&gt;</code>
+ <td><b>/apps/&lt;appname&gt;</b> - get nodejs app info (requires basic auth and appname)<br />
+ <code>curl -X GET -u "testuser:123" http://api.nodester.com/apps/&lt;appname&gt;</code>
</td>
</tr>
<tr>
@@ -328,7 +339,7 @@
<td>&nbsp;</td>
<td><a class="btn disabled primary">GET</a></td>
<td><b>/applogs/&lt;appname&gt;</b> - Gets nodejs app logs (requires basic auth and appname)<br />
- <code>curl -u "testuser:123" http://api.nodester.com/applogs/&lt;appname&gt;</code>
+ <code>curl -X GET -u "testuser:123" http://api.nodester.com/applogs/&lt;appname&gt;</code>
</td>
</tr>
<tr>
@@ -354,7 +365,7 @@
<td>&nbsp;</td>
<td><a class="btn disabled primary">GET</a></td>
<td><b>/env</b> - Gets environment info (requires basic auth, appname, and environment key)<br />
- <code>curl -u "testuser:123" -d "appname=test&key=color" http://api.nodester.com/env</code>
+ <code>curl -X GET -u "testuser:123" http://api.nodester.com/env/&lt;appname&gt;</code>
</td>
</tr>
<tr>
@@ -366,7 +377,7 @@
<td>&nbsp;</td>
<td><a class="btn disabled primary">GET</a></td>
<td><b>/status</b> - Returns platform status and number of apps hosted and running<br />
- <code>curl http://nodester.com/status</code>
+ <code>curl -X GET http://nodester.com/status</code>
</td>
</tr>
<tr>
@@ -406,7 +417,7 @@
<td>&nbsp;</td>
<td><a class="btn disabled primary">GET</a></td>
<td><b>/appdomains</b> - Gets list of your domains (requires basic auth)<br />
- <code>curl -u "testuser:123" http://api.nodester.com/appdomains</code>
+ <code>curl -X GET -u "testuser:123" http://api.nodester.com/appdomains</code>
</td>
</tr>
<tr>
View
21 public/help.html
@@ -63,13 +63,13 @@
<li><a href="http://irc.nodester.com">IRC</a></li>
<li><a href="http://blog.nodester.com">Blog</a></li>
</ul>
- <!-- <p class="pull-right">
+ <p class="pull-right">
<form action="http://admin.nodester.com/login" method="post" class="pull-right">
<input class="input-small" type="text" placeholder="Username" name="user[user]" />
<input class="input-small" type="password" placeholder="Password" name="user[pass]" />
<button class="btn" type="submit">Sign in</button>
</form>
- </p> -->
+ </p>
</div>
</div>
</div>
@@ -91,14 +91,12 @@
<ul class="tabs" data-tabs="tabs">
<li class="active" id="helpli"><a href="#help">General Help</a></li>
<li id="faqli"><a href="#faq">FAQs</a></li>
+ <li id="videoli"><a href="#video">How-To Video</a></li>
</ul>
<div id="my-tab-content" class="tab-content">
<div class="active tab-pane" id="help">
- <p>
- <iframe width="853" height="480" src="http://www.youtube.com/embed/jwsP1Ejv-_w?hd=1" frameborder="0" allowfullscreen></iframe>
- </p>
<br />
<h2><img src="images/rocket-md-right.png" width="30" /> Requesting a Coupon Code to Register</h2>
<p>
@@ -165,6 +163,11 @@
<div class="tab-pane" id="faq">
<table class="bordered-table zebra-striped">
<tr>
+ <td>Node.JS Version</td>
+ <td>Nodester is currently running Node.JS versions 0.4.9, 0.4.12, and 0.6.12. We are working to add support for more versions of Node.JS. You can specify which
+ version your app runs on in its secured sandbox via your package.json file. More info at: <a href="http://blog.nodester.com/post/18702499832/nodester-now-running-node-js-0-6-12">http://blog.nodester.com/post/18702499832/nodester-now-running-node-js-0-6-12</a>. </td>
+ </tr>
+ <tr>
<td>RSA Keys</td>
<td>RSA/SSH keys are used with <a href="http://git-scm.com/">git</a> to push or deploy your applications on Nodester. Mac and Linux users can copy and paste their RSA keys into nodester's registration form
by running "cat ~/.ssh/id_rsa.pub | pbcopy" from the command line. Windows users can find a good article for installing git and obtaining their RSA key from <a href="http://help.github.com/win-set-up-git/">http://help.github.com/win-set-up-git/</a> </td>
@@ -198,6 +201,14 @@
</tr>
</table>
</div>
+
+ <div class="tab-pane" id="video">
+ <br/>
+ <p>
+ <iframe width="853" height="480" src="http://www.youtube.com/embed/jwsP1Ejv-_w?hd=1" frameborder="0" allowfullscreen></iframe>
+ </p>
+ </div>
+
</div>
View
BIN public/images/sizzly-rokkit.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
4 public/index.html
@@ -57,13 +57,13 @@
<li><a href="http://blog.nodester.com">Blog</a></li>
</ul>
- <!-- <p class="pull-right">
+ <p class="pull-right">
<form action="http://admin.nodester.com/login" method="post" class="pull-right">
<input class="input-small" type="text" placeholder="Username" name="user[user]" />
<input class="input-small" type="password" placeholder="Password" name="user[pass]" />
<button class="btn" type="submit">Sign in</button>
</form>
- </p> -->
+ </p>
</div>
</div>
</div>

0 comments on commit a3b735e

Please sign in to comment.