Post History:

Animals Matter to Me

Moving a Sinatra app to Heroku

I haven’t written any posts here in a long time. About a year ago I had a small problem: removing duplicate posts from two similar but different RSS feeds. I wrote a small Sinatra app to solve the problem, hosted it on my Slicehost slice and added the feed to my Google Reader. Over a year later my small problem has been successfully solved by my small app, and it continues to do its job daily.

In the interest of learning more about Heroku, I thought that this simple app with no database would be a good place to start.

I first signed up for an account on Heroku but got sidetracked that day and didn’t move any further towards setting up that first app. A few days later I got a reminder email from Heroku, which from most sites would annoy me, but since I really did want to set up the app, and the email included a handy “look how simple it is” set of instructions, it was actually ok.

Since my app was already in a git repository (and on github) all I had to do was install the heroku gem and follow the simple instructions.

I created a .gems file so that Heroku knows what gems are necessary to run the application. The gem file for Amalgamator looks like this:

feedzirra --version 0.0.23
rack --version 1.1.0

Running ‘heroku create’ requests the account details and then creates the app instance with a temporary name.

jeffd@jeffd-netbook:~/programming/amalgamator$ heroku create
Enter your Heroku credentials.
Uploading ssh public key /home/jeffd/.ssh/
Creating cold-winter-66....... done
Created |
Git remote heroku added

My app was given an initial generated name of “cold-winter-66”, and although for a fake generated name it isn’t that bad, I renamed the app to amalgamator, making the URL

I ran ‘git push heroku master’, which did a lot of the hard work, including installing the gems:

jeffd@jeffd-netbook:~/programming/amalgamator$ git push heroku master
The authenticity of host ' (' can't be established.
RSA key fingerprint is 8b:48:5e:67:0e:c9:16:47:32:f2:87:0c:1f:c8:60:ad.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ',' (RSA) to the list of known
Counting objects: 199, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (123/123), done.
Writing objects: 100% (199/199), 138.63 KiB, done.
Total 199 (delta 37), reused 195 (delta 36)

-----> Heroku receiving push

-----> Installing gem feedzirra 0.0.23 from,
       Building native extensions.  This could take a while...
       Building native extensions.  This could take a while...
       Successfully installed nokogiri-1.4.1
       Successfully installed sax-machine-0.0.15
       Successfully installed curb-0.7.1
       Successfully installed loofah-0.4.7
       Successfully installed feedzirra-0.0.23
       5 gems installed

-----> Installing gem rack 1.1.0 from,
       Successfully installed rack-1.1.0
       1 gem installed

-----> Sinatra app detected
       Compiled slug size is 1.4MB
-----> Launching...... done deployed to Heroku

Without any messing around or configuration, the app ran right away. And a Heroku fan was instantly created.

Now that the site is up and running elsewhere, I disabled the copy running on my Slicehost server so I can use those resources for something else. To keep any links or search engine results that may already exist working, I set up some Apache RewriteRules to redirect requests from the app to the Heroku one.

PassengerHighPerformance off

RewriteEngine on
RewriteCond %{QUERY_STRING} ^feeds=(.*)&feeds=(.*)$
RewriteRule ^/amalgamator/feed[]=%1&feeds[]
=%2 [R=301,L,NE]
RewriteRule ^/amalgamator(/?) [R=301,L]

Turning the PassengerHighPerformance option off was necessary to prevent the RewriteRules from being ignored. This requirement is explained in the Passenger documentation. The version of Amalgamator I’ve setup on Heroku is running on a newer version of Sinatra than I had last deployed to the old location, and that upgrade required a slight change to the format of the parameters the application accepts. The first RewriteRule takes an old style request, redirects it and adjusts the parameters simultaneously. The second rule redirects any other requests for the main page over to the Heroku app.

Now that I’ve seen how easy it is to get apps up and running on Heroku I’m thinking about the next one I’m going to create. I’ve got an idea for one using gameday_api, a ruby library for accessing MLB scores and statistics by Timothy Fisher.


Adding new comments is currently disabled.