Node.js PaaS Hosting Comparison

Disclaimer: I'm coming from the standpoint of DerbyJS deployment and a desire for Socket.io to work (even if it has to fall back on XHR polling, though Websockets is preferable). The process was thus: I had my site running on my own dev server which worked fine, and attempted deployment on all PaaS in the following comparison. They all had had issues and required adjustments and compromises to my app. In the end, Nodejitsu & Heroku both worked well.

Heroku

http://www.heroku.com/

Agile deployment for Ruby, Node.js, Clojure, Java, Python, and Scala.Get up and running in minutes, and deploy instantly with git. Focus 100% on your code, and never think about servers, instances, or VMs again.

  • The most mature PaaS. It's been around for a very long time, starting as a PaaS for Rails & then expanding to many other frameworks.
  • Very reasonable pricing.
  • Supports Node.js 0.8.x
  • When your deploy fails you see a legitimate error log. Many of the other PaaS give you nondescript messages and debugging is a pain. Debugging Heroku wins by comparison.
  • Doesnt' support Websockets. You have to configure Socket.io for XHR Polling, which works fine.
  • I'm keeping my finger on it's pulse; Heroku has been my historical bread-and-butter (Rails), and will be my recommendation once they support Websockets.
  • Incidentally, for PaaS Websocket support see Node.js Websocket Hosting Roundup

Nodejitsu

http://nodejitsu.com/

The simplest, most reliable and intelligent Node.js hosting platform you can get.

  • The most successful Node PaaS, in my experience.
  • The team running the show are some of the best-known Node.js developers.
  • Incredible support. Not much luck emailing them, but hop into #nodejitsu IRC and they answer your questions in shocking time and thoroughness. 
  • Very inexpensive. Currently free, which will change very soon to $3 / drone / mo. (a drone runs a single app). That probably makes this the cheapest of the PaaS.
  • You get a lot of nondescript "socket hang up" errors, debugging Nodejitsu can be pretty tough.
  • While Websockets work for most things on Nodejitsu, still couldn't get it working for DerbyJS. However, configuring Socket.io to use XHR Polling was successful, and the app works just fine. I need to connect with them on debugging DerbyJS's Websocket support.

Nodester

http://nodester.com/

Deploy your Node.JS applications to Nodester.com for FREE or deploy your apps to your own private cloud instance of Nodester running in your own datacenter or on Amazon EC2, Rackspace, or GoGrid! Deploy your Node.JS applications to Nodester.com for FREE or deploy your apps to your own private cloud instance of Nodester running in your own datacenter or on Amazon EC2, Rackspace, or GoGrid!

Nodester is an open source Node.JS Platform-as-a-Service written in Node.JS with a RESTful API designed to run in any cloud without a VPS! It is the first of its kind and 100% open sourced under the GNU Affero license on GitHub.

  • Pretty flippin' epic - the whole platform is opensource and free. You choose to run your dev app for free, or run it through Nodester on your own Rackspace / EC2 instance to scale. Really cool concept, and I hope they succeed.
  • I spent a lot of time on this platform, trying to get my Derby app to deploy. Unfortunately, it (1) had more errors than the others, and (2) the errors were non-descript and difficult to debug. However, it's been a long time since I tried, so things might have changed.

Self Hosting

I'm using Rackspace & Ubuntu 12.04. Hosting Node.js yourself is medium difficultuy, and its installation and upkeep is non-trivial. You'll need to setup a second Node.js app on your server which runs node-http-proxy in order to proxy :80 requests to your app, including Websocket support. You'll also need to configure Monit and Upstart for system reboots and server crashes. Additionally, one of the biggest benfits of PaaS is that you run a single command to deploy your app (jitsu deploy, git push heroku master, etc) - making deployment extremly simple. If you self-host, you'll need to configure git post-push hooks. Furthermore, I don't think Node.js runs on any shared hosting environments (I may be wrong), meaning you'll require a VPS or dedicated server ($$$). All in all, hosting a Node.js app yourself will waste a lot of time compared to using PaaS. I highly recommend you pick PaaS, but if it just isn't working for your app, self-host. Here are some links on your server setup:

General Tips

  • Most likely you'll be using MongoDB. Setup off-site Mongo hosting through MongoHQ, because most PaaS don't have hosted databases (aka, you can't just use "mongodb://localhost/myDatabase")
  • Figure out how to setup environment variables on your PaaS. Some have CLI commands, Nodejitsu in particular uses package.json. Some environment variables you'll most likely be setting are PORT, NODE_ENV, and some variable to define the MongoHQ database uri (wich you define yourself, eg. NODE_DB_URI). Many of these variables will be accessed through your app's framework, so you don't need to worry about it. Others you access yourself (like the NODE_DB_URI example) via process.env: process.env.NODE_DB_URI
  • If you, too, are hosing a DerbyJS app, make sure your /lib directory is in Git. If you created your app for Coffeescript, it will be in .gitignore - remove it from that file.
  • On that note, if you are hosting a Derby app, you might find my workflowy brain-dump of errors and fixes handy.