AppFog is an incredible service in the land of PaaS or Platform as a Service. They are a Cloud Foundry-powered polyglot platform. You can sign up for beta access now and start pushing apps strait away. Their web based management interface is really nice, and I am a sucker for nicely designed "things."  In this post I'd like to show you all how I got a Ruby on Rails app up and running.

Create

A developer has two ways to create a new RoR app.

  1. Use the AppFog console to bootstrap a shell RoR app. [source code]

This will net a basic shell RoR app with Ruby version 1.9.3-p125 and Rails version 3.2.5

  1. Use the af gem to push your locally developed app to the cloud.

Push

How do you push an app to AppFog?

Hopefully you are using rvm, rbenv or have some sort of Ruby/Gem management system set-up. Rvm and rbenv are out of the scope of this tutorial. I use rvm to create project-based gemsets with a directory level .rvmrc file. You can read more about rvm here.

[gist id=3009318]

When you are ready to push issue this command:

[gist id=3009377]

If you don’t specify an app name, AppFog will use the directory name. I found that my Ruby version wasn't automatically detected without the runtime flag. I found this by looking through the af gem source code on Github. (I love OSS!) The runtimes supported by AppFog can be found using "af runtimes".

You will then be taken though a series of yes/no questions where the details come into play. Accepting the default answer for all of these questions with the exception of database technology is the simplest way to get up and running. You can choose between Mongo and MySQL for the database technology to use, so even that isn’t very complicated.

Let me be clear, I have not veered far from the quickest path to get my app set-up. Subsequent tutorials will have more on this front.

Running / Errors

At this point you are either running or you have error(s). If you have an error, use “af logs <appname>” to diagnose what went wrong. You can also head to the support forums or the Google group to ask a question or look through previous questions/discussions.

In either app creation case, you are going to use "af update <appname>" once you have something you'd like show the world or need to make a change. This command is strait forward; push the changes to the cloud.

Sum it up

  1. create app either on AppFog or locally
  2. install af gem
  3. af push or af update
  4. profit

Notes:

When I looked at the available commands using "af  --help", it was not immediately clear what each command was used for. A good option to learn more is to read though the source.  OR you can wait for my next tutorial where I'll dive in with both feet on every available command.


Database

Using MySQL? You need the mysql2 gem in your gemfile. Also, if you intend to develop your app against MySQL locally, you will want your database.yml file to look like or similar to the gist below.

[gist id=3006959]

I am not sure why the database.yml needs to be set-up like this and quite frankly it could be my error (system or set-up). The error I received was database adapter not found and I have narrowed it down to the application creation process. Once the app is up and running, I have been able to use either configuration.

Notes:

Developing with MySQL locally will help to eliminate a potential source of frustration not related to AppFog. A simple query that works with sqlite3 may completely fail with PG or MySQL due to type casting, as just one example. Databases like PostgreSQL and MySQL have more features than sqlite3 but are more strict with type. So, you can avoid a lot of potential problems by simply developing against the database you intend to use in production.


Package

You need to pre-package the app to the greatest extent possible.

[gist id=3009404]

Keep in mind that “bundler package” will add size, in some cases significant size, to your app. This command caches a local version of each gem to your vendor/cache dir and some gems are really large.

Potential problems with gems, bundler and AppFog; Lets say you need to modify a published gem. Lets also posit that you fork and modify this gem to fit your particular app (change color scheme, etc.). You can use bundler's git feature to host this modified gem on Github and it will behave as if it was hosted on rubygems.org. This is great when working locally or you have access to bundler and/or rake.

I've found that you may need to publish the modified gem to rubygems.org for it to work properly in production. In fact I have not been able to use un-published gems with AppFog. If your modification is a useful feature the community may benefit from, consider submitting a pull request through proper channels before going down this road.

Sum it up

In a nut shell... stick with published gems and you'll be A-OK.


Precompile

Speaking of packaging and pre-deployment. If you are using rails 3 and the asset pipeline you need to run this command before you push or update.

[gist id=3007160]


Final Thoughts

Whew! I hope this helps you navigate the AppFog PaaS. Stay tuned for more and if you have questions don’t hesitate to ask… in the support forums or the Google group! I am neither an AppFog or CloudFoundry expert nor an employee, I simply believe in the Kool-Aid they are pushing.

945 words ~ 4 min read

  • Flesch-kincaid Index / Reading Ease: 75.48
  • Flesch-kincaid Grade Level: 6.13