Platform Games on Heroku
Heroku is platform as a service (PaaS). Instead of all that infrastructure, servers, and complications, you have a platform that is managed for you.
With the move to cloud computing, particularly cloud hosting, developers often opt for infrastructure as a server rather than PaaS. Why would you go PaaS?
The first reason is that you have less to do. The infrastructure and coordination of resources are managed for you, and on Heroku, they’re managed in a particularly cool way. Everything – from the moment you push to their Git repo – is managed for you, removing the need to configure servers, databases, and all that junk.
Heroku started off hosting just Rails, but now it also hosts Java and Node.js. To get started, you sign up on their site and simply – as is always the way with anything Ruby-ish – install a gem:
gem install heroku
Heroku’s CLI tool is where a lot of the magic happens. Start the magic by creating a new project:
heroku create
Log in at https://api.heroku.com/myapps, and you’ll see some insanely named app: vivid-robots-9999. You can look at the URL for the app, but there isn’t anything there to see yet, so you need to push up a Rails app.
Copy the Git URL from the app’s detail page (e.g., git@heroku.com:vivid-robot-9999.git) and clone it to a local repo:
$ git clone git@heroku.com:vivid-robot-9999.git Cloning into vivid-robot-9999... warning: You appear to have cloned an empty repository.
Create a Rails app, add it to Git, and push:
cd name-of-project/ rails new . git add . git commit -m “Empty rails app” git push origin master
As you push, you’ll see a number of things that Git doesn’t normally say:
-----> Heroku receiving push -----> Ruby/Rails app detected -----> WARNING: Detected Rails is not declared in either .gems or Gemfile Scheduling the install of Rails 2.3.11. See http://devcenter.heroku.com/articles/gems for details on specifying gems. -----> Configure Rails to log to stdout Installing rails_log_stdout... done -----> Installing gem rails 2.3.11 from http://rubygems.org Successfully installed activesupport-2.3.11 Successfully installed activerecord-2.3.11 Successfully installed actionpack-2.3.11 Successfully installed actionmailer-2.3.11 Successfully installed activeresource-2.3.11 Successfully installed rails-2.3.11 6 gems installed -----> Compiled slug size is 4.7MB -----> Launching... done, v4 http://vivid-robot-9999.heroku.com deployed to Heroku
Rails is a great platform for PaaS because it is inherently self-contained. Dependencies are declared in the Gemfile, from which everything can be installed. Once you push to Heroku, all required gems are installed, and the app is deployed.
Heroku creates a pipeline for the code from the moment you push, so when finished, your app is deployed. If you have ever had to deal with pulling onto other servers, configuring them and wasting all that time, this is going to look like magic.
Hit the URL of your app,
http://vivid-robot-1992.heroku.com/
and, Bam …, you have deployed your app.
Now, I'll create something simple. Because Heroku integrates so nicely with Rails – or, more accurately, with the Git process – it’s worth noting that Rails projects can integrate directly with Heroku. The Rails CMS Refinery has hooks to push directly to Heroku.
Finally, some nice add-ons provide services, such as MongoDB, Redis, on-demand video encoding, and cloud DNS for Heroku. Just like the underlying web servers, proxies, and all that, you don’t manage this. The working platform is what comes as a service.
If you have a Rails projects, push it to Heroku and see if it’ll work there, because it could save you a load of sys admin work.
But what do you lose? Why wouldn’t you use PaaS?
PaaS is very limiting. The problem lots of Java and Python developers had with Google App Engine (and this is from bar conversations, rather than from trawling the web) is that simple things like the filesystem aren’t there anymore. You can’t reconfigure the web server. All those niceties.
But, this is a good thing. Even if you don’t use PaaS, such as Heroku or App Engine, in your day job, experiencing the efficiency of deployment is worth the investment. All code pipelines should be a matter of push-and-deploy, which they often aren’t, simply because you have access to the config, the filesystem, and all those old reliable bits and pieces.
How does PaaS fit in with your stack? Could it replace those big servers you love so much?