<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Heroku</title>
    <link>http://blog.heroku.com</link>
    <description>Heroku</description>
    <ttl>60</ttl>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/heroku" type="application/rss+xml" /><item>
      <title>Develop a Voice App with Twilio + Heroku, Win a Netbook</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/jFIGK1pQBig/</link>
      <pubDate>Mon, 06 Jul 2009 19:18:08 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/7/6/twilio_developer_contest/</guid>
      <description>&lt;p&gt;&lt;a href="http://twilio.heroku.com/"&gt;&lt;img src="http://twilio.heroku.com/images/logo-twilio.png" style="float: left; margin-right: 1em" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Not too long ago building telephony apps, such as interactive voice response systems, was far out of reach for most web developers. Now, an exciting crop of new startups is rapidly changing that, making it easy to incorporate voice capabilities into any web app, or even build standalone voice apps.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://twilio.com"&gt;Twilio&lt;/a&gt; is emerging as one the leading companies in this area, offering a &lt;a href="http://www.twilio.com/docs/index"&gt;a &lt;span class="caps"&gt;REST&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt; for building voice apps.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://static1.twilio.com/resources/images/front/home-imgs-vert.png" style="float: right; margin-left: 1em" /&gt;&lt;/p&gt;
&lt;p&gt;The model is simple: sign up for a number with Twilio.  When a call comes in, Twilio makes an &lt;span class="caps"&gt;HTTP&lt;/span&gt; request to &lt;span class="caps"&gt;URL&lt;/span&gt; of your choice, containing information about the phone call. The processing logic resides entirely inside your web app, and instructions are passed back and forth using &lt;span class="caps"&gt;XML&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;To help kick off this new era of voice-enabled applications, Heroku is co-sponsoring &lt;a href="http://www.twilio.com/contest/netbook/"&gt;this week&amp;#8217;s edition of Twilio&amp;#8217;s Developer Contest&lt;/a&gt;. The rules are simple &amp;#8211; develop a Twilio app in Ruby, deploy it to Heroku and &lt;a href="http://www.twilio.com/contest/netbook/submit"&gt;submit your entry by midnight on July 13th&lt;/a&gt;. The lucky winner gets a &lt;strong&gt;netbook&lt;/strong&gt; and &lt;strong&gt;$300 in Heroku platform credit&lt;/strong&gt; to spend on dynos, database, or add-ons. &lt;a href="http://twilio.heroku.com"&gt;This page has all the info you need&lt;/a&gt;, including links to example code on Github and a screencast showing how it works.  We look forward to seeing the entries!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/jFIGK1pQBig" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/7/6/twilio_developer_contest/</feedburner:origLink></item>
    <item>
      <title>Railslab Interview</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/A28hSracd2s/</link>
      <pubDate>Wed, 01 Jul 2009 21:07:21 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/7/1/railslab_interview/</guid>
      <description>&lt;p&gt;&lt;a href="http://railslab.newrelic.com/"&gt;&lt;img src="http://blog.heroku.com/images/railslab.png" alt="Railslab logo" class="fr ml10 mb10 whitebox" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://railslab.newrelic.com/"&gt;Railslab&lt;/a&gt; is a great site by our friends over at &lt;a href="http://railslab.newrelic.com/"&gt;New Relic&lt;/a&gt; that contains a wealth of knowledge on Rails scaling and application performance.&lt;/p&gt;
&lt;p&gt;A couple of weeks ago they asked &lt;a href="http://tomayko.com/"&gt;Ryan&lt;/a&gt; and &lt;a href="http://adam.blog.heroku.com/"&gt;Adam&lt;/a&gt; to stop by for a discussion of the vision behind Heroku, and the philosophy that drives the design and buildout of &lt;a href="http://heroku.com/how/"&gt;our scalable, provisionless hosting platform&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.heroku.com/images/wiggins-tomayko.jpg" alt="Ryan Tomayko and Adam Wiggins at Railslab" class="fl round-medium mr10 nobox" /&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://railslab.newrelic.com/2009/06/18/adam-wiggins-and-ryan-tomayko-heroku"&gt;interview&lt;/a&gt; is now available for your viewing pleasure in three parts. In the &lt;a href="http://content.newrelic.com/railslab/videos/railslab-heroku-intro-vision.mov"&gt;first part&lt;/a&gt; Adam goes into detail about the core vision behind the concept of instant deployment, and how Heroku is committed to making the deployment of Ruby web apps a seamless extension of an agile development workflow.&lt;/p&gt;
&lt;p&gt;In the &lt;a href="http://content.newrelic.com/railslab/videos/railslab-heroku-performance-bp.mov"&gt;second&lt;/a&gt; part Ryan and Adam discuss how scalability  and performance really emerge from a strong focus on understanding and implementing the correct solution to common application design problems. This goes straight to the essence of what we like to call stack curation. By providing a &lt;a href="http://heroku.com/how/"&gt;fully managed, state-of-the-art application stack&lt;/a&gt; we aim to replace the hurdles of tedious configuration and maintenance that often keep developers from doing things the right way with the first truly provisionless hosting environment. With Heroku, we&amp;#8217;re not just looking to make correct design possible &amp;#8211; we&amp;#8217;re looking to make it so easy that it&amp;#8217;d be downright shameful not to :)&lt;/p&gt;
&lt;p&gt;Finally, the guys discuss some of the tools &amp;amp; services they use in their daily work, and what they think is important to have in your arsenal to really inform your development work &amp;#8211; especially in a cloud computing environment.&lt;/p&gt;
&lt;p&gt;Whether you&amp;#8217;re just curious about &lt;a href="http://heroku.com"&gt;Heroku&lt;/a&gt;, or an existing user there&amp;#8217;s a lot of great information about our platform in these interviews, and we hope you&amp;#8217;ll check them out. Big thanks to the guys over at New Relic for yanking Ryan &amp;amp; Adam away from their respective keyboards long enough to get this on tape!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/A28hSracd2s" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/7/1/railslab_interview/</feedburner:origLink></item>
    <item>
      <title>Pimp Your Cart: Shopify Apps on Heroku</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/q_VUJZ2zYbc/</link>
      <pubDate>Thu, 11 Jun 2009 21:54:57 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/6/11/shopify_apps/</guid>
      <description>&lt;p&gt;&lt;img src="http://shopify.cachefly.net/shopify.info/images/shopify_bag.gif" style="margin: 0 18px 18px 0; float: left" /&gt;&lt;/p&gt;
&lt;p&gt;Our good friends at &lt;a href="http://www.shopify.com/"&gt;Shopify&lt;/a&gt; recently released a &lt;a href="http://www.shopify.com/developers"&gt;developer platform&lt;/a&gt; which makes it crazy easy to build custom functionality into an e-commerce store using a standalone Rails app.  There are already some great apps available in their &lt;a href="http://apps.shopify.com/"&gt;app store&lt;/a&gt;, many of which are running on Heroku.  (The shopify.com homepage also &lt;a href="http://twitter.com/tobi/status/1913425688"&gt;now lives here&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Check out the excellent &lt;a href="http://vimeo.com/5112284"&gt;getting started video&lt;/a&gt; by James MacAulay.  It shows just how slick the Shopify &lt;span class="caps"&gt;API&lt;/span&gt; is &amp;#8211; these guys are really taking e-commerce to the next level.  (And bonus points for use of &lt;a href="http://blog.heroku.com/archives/2009/4/7/config-vars/"&gt;config&lt;br /&gt;
vars&lt;/a&gt; to store &lt;span class="caps"&gt;API&lt;/span&gt; keys!)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/q_VUJZ2zYbc" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/6/11/shopify_apps/</feedburner:origLink></item>
    <item>
      <title>Add-on: Wildcard Domains</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/C66J9AFgZkU/</link>
      <pubDate>Wed, 27 May 2009 19:09:09 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/5/27/add_on_wildcard_domains/</guid>
      <description>&lt;p&gt;Since we returned from a fun and successful &lt;a href="http://railsconf09.com"&gt;Railsconf in Vegas&lt;/a&gt;, we have been in full swing completing the rollout of our paid services. The response has been enormous so far, and paid services are now available to all users.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;ve checked out the &lt;a href="http://heroku.com"&gt;pricing page&lt;/a&gt;, you&amp;#8217;ve undoubtedly noticed our line-up of a la carte &lt;a href="http://docs.heroku.com/addons"&gt;add-ons&lt;/a&gt;. We&amp;#8217;re really excited about add-ons becoming a key part of our platform, allowing us to seamlessly deliver popular application services and components with the built-in scalability and ease of use you&amp;#8217;ve come to expect from Heroku.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve had a solid first batch of add-ons in beta for a while, and today we&amp;#8217;re happy to announce the first graduate: &lt;a href="http://docs.heroku.com/addons#wildcard-domains"&gt;Wildcard Domains&lt;/a&gt;, which allows your app to respond on *.yourdomain.com. Since we started supporting custom domains on Heroku this has been high on the list of requested features, and now it&amp;#8217;s here! To add it to your app for $5/month, simply go to your app&amp;#8217;s Resources page and select turn it on. Enjoy!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/C66J9AFgZkU" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/5/27/add_on_wildcard_domains/</feedburner:origLink></item>
    <item>
      <title>Railsconf Schedule</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/afmBM1X9PT8/</link>
      <pubDate>Sun, 03 May 2009 19:57:09 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/5/3/railsconf_schedule/</guid>
      <description>&lt;p&gt;Railsconf starts tomorrow and Heroku will be there in full force.  Here&amp;#8217;s our line up:&lt;/p&gt;
&lt;h2&gt;Monday, 1:30pm &amp;mdash; &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/7590"&gt;A Hat Full of Tricks with Sinatra&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Our very own Blake Mizerany, the creator of Sinatra, is giving a tutorial on Sinatra.  Ryan Tomayko will be on hand as well.&lt;/p&gt;
&lt;h2&gt;Tuesday, 1:50pm &amp;mdash; &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8752"&gt;The Future of Deployment: A Killer Panel&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Join me as I moderate a panel on deployment, with a truly killer group:  Marc-André Cournoyer (creator of Thin), Christian Neukirchen (creator of Rack), Ryan Tomayko (Rack core team, creator of Rack::Cache, Sinatra core team), Blake Mizerany (creator of Sinatra), and Adam Wiggins (Heroku cofounder, creator of RestClient, Rush, and many others).&lt;/p&gt;
&lt;h2&gt;Wednesday, 10:45am &amp;mdash; &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8276"&gt;Rails Metal, Rack, and Sinatra&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Adam will be giving a great talk on the latest and greatest about Rack, Rails Metal, multiple Rack endpoints, and even a bit of Sinatra.  The patterns and methods he&amp;#8217;ll discuss are the latest in scalable architecture best practices for Ruby apps.&lt;/p&gt;
&lt;h2&gt;Wednesday, 2:50pm &amp;mdash; &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/9058"&gt;Heroku: Guided Tour and Q &amp;amp; A&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most of the Heroku team will be on hand to walk you through the Heroku platform, show off some new features, and answer questions.&lt;/p&gt;
&lt;h2&gt;Thursday, 9:25am &amp;mdash; &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8739"&gt;HTTP&amp;#8217;s Best-Kept Secret: Caching&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ryan Tomayko will be giving a talk on what&amp;#8217;s probably the most important issue in Rails right now: &lt;span class="caps"&gt;HTTP&lt;/span&gt; caching.  This extremely powerful, transparent, and easy to implement technology is badly misunderstood and misused today.  Ryan has been on the front lines for a long time, and is truly an expert; you&amp;#8217;re bound to come out of this talk with a new, inspired perspective on &lt;span class="caps"&gt;HTTP&lt;/span&gt; caching.&lt;/p&gt;
&lt;h2&gt;Exhibit Hall &amp;mdash; Heroku Booth&lt;/h2&gt;
&lt;p&gt;Once again we&amp;#8217;ve got a big booth in the exhibit hall, where we&amp;#8217;ll be demoing new features, answering questions, and giving out schwag.  The Heroku team heavyweights will be available to answer your questions and help you sort out issues with your individual apps, or to just do some hacking.  We&amp;#8217;ll also be giving out t-shirts, stickers, and free credits for Heroku paid-services.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/afmBM1X9PT8" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/5/3/railsconf_schedule/</feedburner:origLink></item>
    <item>
      <title>New Heroku Screencast by Remi</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/fa0m5JwbvXc/</link>
      <pubDate>Thu, 30 Apr 2009 07:22:02 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/4/30/new_heroku_screencast_by_remi/</guid>
      <description>&lt;p&gt;It&amp;#8217;s been a bit of a blur here at Heroku HQ in the past couple of weeks. However, amidst all the launch activity we did notice &lt;a href="http://remi.org/2009/04/23/deploying-rails-and-rack-applications-to-heroku.html"&gt;a screencast so sweet we thought we&amp;#8217;d share it with you&lt;/a&gt;. It really covers the whole platform exceptionally well, and we particularly dig how it manages to show off both Rails and Rack app deployment.&lt;/p&gt;
&lt;p&gt;Big ups to Remi for putting this together, and way to shame us for not getting any official screencasts together for the new and improved Heroku.  :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/fa0m5JwbvXc" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/4/30/new_heroku_screencast_by_remi/</feedburner:origLink></item>
    <item>
      <title>Commercial Launch</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/70_R2vhg2c0/</link>
      <pubDate>Fri, 24 Apr 2009 06:18:31 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/4/24/commercial_launch/</guid>
      <description>&lt;p&gt;When Adam, Orion, and I started Heroku two years ago, we had no idea how much new technology we would have to build to realize our vision of an instant platform for Ruby that &lt;strong&gt;just works&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Luckily, we were able to attract an amazing team to work on this problem with us, and the team has really shaped Heroku into the offering it is today.  We&amp;#8217;re currently by far the fastest and easiest deployment platform for Ruby, and we&amp;#8217;ve gotten great feedback on our &lt;a href="http://heroku.com/how"&gt;provisionless hosting architecture&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We have over 25,000 apps running on the platform today, and many of our users have been asking for pricing and paid services for some time now.  So today we&amp;#8217;re pleased to announce that we are officially out of beta and available for commercial use.&lt;/p&gt;
&lt;p&gt;Detailed pricing information is &lt;a href="http://heroku.com/pricing"&gt;now available&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Dynos&lt;/h1&gt;
&lt;p&gt;&lt;img src="http://blog.heroku.com/images/dyno_slider.gif" class="nobox" style="text-align: left; margin-left: 0; margin-right: auto" /&gt;&lt;/p&gt;
&lt;p&gt;As discussed &lt;a href="http://blog.heroku.com/archives/2009/3/3/deployment_that_just_works/"&gt;previously&lt;/a&gt;, our system is built around a &lt;a href="http://heroku.com/how/dyno_grid"&gt;dyno grid&lt;/a&gt; that allows us to deploy your app just by pushing your code, and to scale it up and down instantly.  Your app runs inside this grid in any number of &lt;a href="http://heroku.com/how/dynos"&gt;dynos&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The number of dynos you run directly affects the concurrency and therefore the performance of your app, so our pricing is based around this same concept.  The first dyno for an app is always free, and additional dynos will be billed at $0.05 per dyno-hour.&lt;/p&gt;
&lt;p&gt;Play with the dyno slider on our &lt;a href="http://heroku.com/pricing"&gt;pricing page&lt;/a&gt; to estimate your bill.&lt;/p&gt;
&lt;p&gt;You can scale your dynos up and down instantly at any time via the web interface, our &lt;span class="caps"&gt;API&lt;/span&gt;, or our command-line gem.&lt;/p&gt;
&lt;h1&gt;Database&lt;/h1&gt;
&lt;p&gt;&lt;img src="http://blog.heroku.com/images/ronin.gif" class="nobox" /&gt;&lt;/p&gt;
&lt;p&gt;At the &lt;a href="http://heroku.com/how/architecture#sql-database"&gt;database layer&lt;/a&gt;, we have two categories of options.  We offer a shared database cluster in three storage sizes.  The smallest size is free, and you can upgrade/downgrade between options instantly at any time.&lt;/p&gt;
&lt;p&gt;For more serious needs, we also offer three dedicated database plans, ranging from small to large in compute and storage levels.  These can also be changed at any time, but resizing requires a few moments of downtime.&lt;/p&gt;
&lt;h1&gt;Add-ons&lt;/h1&gt;
&lt;p&gt;&lt;img src="http://blog.heroku.com/images/add_ons.gif" class="nobox" /&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re also officially launching some add-on features.  Some of these features, like backups and more frequent cron tasks are paid features.  Others, like custom domains and &lt;span class="caps"&gt;SSL&lt;/span&gt; are free, but require you to enter your billing information as an abuse protection measure (&lt;a href="http://support.heroku.com/forums/42309/entries/32365"&gt;more info&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;There is a lot more to come &amp;ndash; you can get a preview by checking out the beta features in the add-ons section.&lt;/p&gt;
&lt;h1&gt;Free Service&lt;/h1&gt;
&lt;p&gt;It&amp;#8217;s important to us to continue to provide a free service tier, useful enough to get started with Heroku.  This is still available, and is the default for new apps with a single free dyno and free shared database.&lt;/p&gt;
&lt;p&gt;This free tier is well suited for rapid-prototyping, staging, and testing purposes, as well as actually running lightweight apps.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Pricing and paid-features are being rolled out in phases across our user base.  It may take a few days for commercial service to be activated for all accounts.&lt;/p&gt;
&lt;p&gt;The official press release is available &lt;a href="http://blog.heroku.com/images/HerokuServiceLaunch.pdf"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/70_R2vhg2c0" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/4/24/commercial_launch/</feedburner:origLink></item>
    <item>
      <title>Config Vars for Deploy-Specific Settings</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/KQwxYbXVyrU/</link>
      <pubDate>Tue, 07 Apr 2009 19:28:22 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/4/7/config-vars/</guid>
      <description>&lt;p&gt;Say you&amp;#8217;re working on a Rails app, and you want to publish your code on Github.  Most apps have some deploy-specific private config values &amp;#8211; for example, if you&amp;#8217;re using the S3 storage backend for &lt;a href="http://www.thoughtbot.com/projects/paperclip"&gt;Paperclip&lt;/a&gt;, and your S3 keys are saved in config/amazon_keys.yml.  You certainly don&amp;#8217;t want to push those up to Github &amp;#8211; what to do?&lt;/p&gt;
&lt;p&gt;You could maintain a separate deploy branch, and commit your deploy config only to that.  You can then work on the main branch, and rebase the deploy branch whenever you go for a deploy.  That&amp;#8217;s a bit of extra work you could do without, though &amp;#8211; and you know sooner or later, you&amp;#8217;re going to accidentally push the wrong branch to Github, putting your S3 keys up for the whole world to see.  Oops.&lt;/p&gt;
&lt;p&gt;Wouldn&amp;#8217;t it be nice avoid all this headache by storing the data specific to your app&amp;#8217;s deploy in a separate configuration registry?&lt;/p&gt;
&lt;p&gt;Now you can.  Check it out:&lt;/p&gt;
&lt;pre class="code"&gt;
$ heroku config:add S3_BUCKET=mybucket S3_KEY=8N029N81 S3_SECRET=9s83109d3+583493190
Adding config vars:
  S3_BUCKET =&amp;gt; mybucket
  S3_KEY    =&amp;gt; 8N029N81
  S3_SECRET =&amp;gt; 9s83109d3+583493190
Restarting app...done.
&lt;/pre&gt;
&lt;p&gt;Your config vars are now accessible in the environment variables for your deployed app.  Configure Paperclip like this:&lt;/p&gt;
&lt;pre class="code"&gt;
has_attached_file :photo,
  :storage =&amp;gt; :s3,
  :s3_credentials =&amp;gt; {
    :access_key_id =&amp;gt; ENV['S3_KEY'],
    :secret_access_key =&amp;gt; ENV['S3_SECRET']
  },
  :bucket =&amp;gt; ENV['S3_BUCKET'],
  :path =&amp;gt; ":attachment/:id"
&lt;/pre&gt;
&lt;p&gt;Set up like this, your public code and your deployed code can be exactly the same.  Push to Github all day long with no fear of leaking your private credentials.  Clean and neat, no fuss, no muss.&lt;/p&gt;
&lt;p&gt;This also means you can set different config vars for different deployed versions of the app.  For example, if you run a staging deploy of your code on Heroku, you can set it to use a different S3 bucket &amp;#8211; maybe &amp;#8220;myapp_assets&amp;#8221; for production and &amp;#8220;myapp_staging_assets&amp;#8221; for staging.&lt;/p&gt;
&lt;p&gt;What about running locally, deploying to a traditional host?  Since these are just environment variables, you can set them just as you normally would &amp;#8211; in your .bashrc (export S3_BUCKET=mybucket), or on the command line when you run the server.&lt;/p&gt;
&lt;p&gt;Or, you can check for the presence of the vars, and use defaults when they don&amp;#8217;t exist.  In the case of Paperclip, you might do:&lt;/p&gt;
&lt;pre class="code"&gt;
has_attached_file :photo,
  :storage =&amp;gt; ENV['S3_BUCKET'] ? :s3 : :filesystem,
  ...
&lt;/pre&gt;
&lt;p&gt;Now when you run locally, it&amp;#8217;ll use the filesystem store; but running on a deployed app with the S3_BUCKET var set, it&amp;#8217;ll automatically go to the right place.&lt;/p&gt;
&lt;p&gt;There are many other uses for config vars.  For example, you can set RACK_ENV to something other than the default of &amp;#8216;production&amp;#8217;.  (RAILS_ENV and MERB_ENV will automatically mirror RACK_ENV on Heroku.)  So if you prefer the traditional approach of storing different keys for different environments (development/staging/production) in various config/something.yml files, set your RACK_ENV as appropriate for your staging and production deployed apps on Heroku.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href="http://docs.heroku.com/config-vars"&gt;full documentation&lt;/a&gt;.  Note that you&amp;#8217;ll need to grab &lt;a href="http://github.com/heroku/heroku"&gt;the 0.7 Heroku client gem&lt;/a&gt; (it&amp;#8217;s in Rubyforge now, so `gem install heroku` will do the trick) to use this feature.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/KQwxYbXVyrU" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/4/7/config-vars/</feedburner:origLink></item>
    <item>
      <title>Fork Our Docs</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/7394hG_Xr5U/</link>
      <pubDate>Wed, 01 Apr 2009 18:46:48 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/4/1/fork_our_docs/</guid>
      <description>&lt;p&gt;Heroku is now sporting an updated docs layout at &lt;a href="http://docs.heroku.com/"&gt;docs.heroku.com&lt;/a&gt;.  These new docs should be much easier to navigate and link to.&lt;/p&gt;
&lt;p&gt;We built this as a standalone Sinatra app serving Markdown files, partially inspired by &lt;a href="http://blog.labnotes.org/2009/03/14/buildr-how-we-generate-the-documentation-web-site-and-pdf/"&gt;Assaf Arkin&amp;#8217;s approach to Buildr&lt;/a&gt;.  It uses Cache-Control with a long max-age, to take advantage of the Varnish http cache which &lt;a href="http://heroku.com/how/architecture"&gt;fronts all Heroku apps&lt;/a&gt;.  This makes it as snappy as staticly rendered pages, while retaining the flexibility of a dynamic app on the backend.&lt;/p&gt;
&lt;p&gt;The docs app is deployed as a regular app on Heroku (just like &lt;a href="http://blog.heroku.com"&gt;this blog&lt;/a&gt;).  Nothing special-case here: we deploy with git push, just like any other Heroku user.  &lt;a href="http://en.wikipedia.org/wiki/Eat_one's_own_dog_food"&gt;Dogfooding&lt;/a&gt; is good for you.&lt;/p&gt;
&lt;p&gt;The app&amp;#8217;s source is &lt;a href="http://github.com/heroku/heroku-docs"&gt;on Github&lt;/a&gt;.  Fork and send us a pull request if you want to make edits to improve the wording, fix a typo, or even add a whole new section.  &lt;a href="http://github.com/heroku/heroku-docs/toggle_watch"&gt;Watch the repo&lt;/a&gt; to keep an eye on new additions to the docs.  Or fork and use the code as the basis for your own docs app (though we ask that you not use our images or colorscheme).&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s also take a moment to give a nod to &lt;a href="http://www.methods.co.nz/asciidoc/"&gt;AsciiDoc&lt;/a&gt;, which we&amp;#8217;ve been using for our docs up until now.  Although it didn&amp;#8217;t turn out to be a long-term solution as a docs &lt;span class="caps"&gt;CMS&lt;/span&gt;, it was a great way to get off the ground.  We highly recommend it to anyone looking for an easy way to get good-looking &lt;span class="caps"&gt;HTML&lt;/span&gt; docs generated from a simple and intuitive markdown format.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/7394hG_Xr5U" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/4/1/fork_our_docs/</feedburner:origLink></item>
    <item>
      <title>Heroku at Railsconf</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/NlTIPfRhsDg/</link>
      <pubDate>Mon, 30 Mar 2009 23:49:59 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/3/30/heroku_at_railsconf/</guid>
      <description>&lt;p&gt;Heroku is gearing up for &lt;a href="http://en.oreilly.com/rails2009/"&gt;Railsconf 09&lt;/a&gt; in Las Vegas, and just like last year, we&amp;#8217;ve got a sweet line-up for y&amp;#8217;all&amp;#8230;&lt;/p&gt;
&lt;p&gt;Kicking things off on &lt;a href="http://en.oreilly.com/rails2009/public/schedule/grid/2009-05-04"&gt;Monday&lt;/a&gt;, &lt;a href="http://sinatrarb.org"&gt;Sinatra&lt;/a&gt; co-creator Blake Mizerany will be hosting an &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/7590"&gt;in-depth tutorial&lt;/a&gt; on the the micro-framework that&amp;#8217;s sweeping the Ruby nation right now.&lt;/p&gt;
&lt;p&gt;Continuing in a similarly minimalistic vein on &lt;a href="http://en.oreilly.com/rails2009/public/schedule/grid/2009-05-06"&gt;Wednesday&lt;/a&gt;, Adam Wiggins will lend his considerable Rack-fu to a &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8276"&gt;talk showcasing Rails Metal&lt;/a&gt; &amp;#8211; the hot new feature in Rails 2.3 that lets you build Rack endpoints for selected URLs that bypass Routes and ActionController for a massive speed boost. Heck, he&amp;#8217;ll even show you how to use Sinatra &lt;em&gt;inside&lt;/em&gt; your existing Rails app!&lt;/p&gt;
&lt;p&gt;Finally, we&amp;#8217;ve put together a massively kick-ass panel about &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8752"&gt;The Future of Deployment&lt;/a&gt;. At Heroku we&amp;#8217;ve put an immense amount of research into building the &lt;a href="http://heroku.com/how"&gt;ideal Ruby stack&lt;/a&gt; based on open-source standard components. This event will be a unique opportunity to discuss every part of it in detail. Joining key members of the Heroku team will be &lt;a href="http://macournoyer.com/"&gt;Marc-Andre Cournoyer&lt;/a&gt;, creator of Thin and &lt;a href="http://chneukirchen.org/blog/"&gt;Christian Neukirchen&lt;/a&gt;, creator of Rack. We can&amp;#8217;t stress enough just how freakin&amp;#8217; excited we are to have these guys join us for what should be a highlight of the conference.&lt;/p&gt;
&lt;p&gt;In addition to these talks, Heroku will be present in full force at Railsconf, and we&amp;#8217;ll be announcing more details about that as the date grows closer. This is definitely &lt;em&gt;the&lt;/em&gt; event in the Ruby community, and we hope to see you there. If you haven&amp;#8217;t registered yet, hurry on over to the &lt;a href="RC09FOS"&gt;Railsconf website&lt;/a&gt;, and use the code &amp;#8220;RC09FOS&amp;#8221; for a 15% discount.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/NlTIPfRhsDg" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/3/30/heroku_at_railsconf/</feedburner:origLink></item>
    <item>
      <title>Radiant CMS in 5 Minutes Or Less</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/NHIiVZg9Z4Y/</link>
      <pubDate>Thu, 26 Mar 2009 20:45:08 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/3/26/radiant_cms_in_5_minutes_or_less/</guid>
      <description>&lt;p&gt;&lt;img src="http://blog.heroku.com/images/radiant_logo.png" alt="Radiant logo"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://radiantcms.org/"&gt;Radiant&lt;/a&gt; is an excellent Rails-based Content Management System (&lt;span class="caps"&gt;CMS&lt;/span&gt;). It was created by John W. Long and Sean Cribbs, and has been around for a couple of years, growing steadily in popularity. With the recent addition of &lt;a href="http://blog.heroku.com/archives/2009/3/18/push_and_pull_databases_to_and_from_heroku/"&gt;taps&lt;/a&gt; and &lt;a href="http://blog.heroku.com/archives/2009/3/10/gem_manifests/"&gt;gem manifeststs&lt;/a&gt;, it&amp;#8217;s super-easy to get this lightweight &lt;span class="caps"&gt;CMS&lt;/span&gt; up and running on Heroku.&lt;/p&gt;
&lt;p&gt;Start by installing the latest radiant gem on your local box:&lt;/p&gt;
&lt;pre class="code"&gt;
$ sudo gem install radiant
&lt;/pre&gt;
&lt;p&gt;Now use the radiant command-line tool to set up your Radiant &lt;span class="caps"&gt;CMS&lt;/span&gt; locally. We&amp;#8217;ll use SQLite as the local database:&lt;/p&gt;
&lt;pre class="code"&gt;
$ radiant --database sqlite mycms
$ cd mycms
$ rake db:bootstrap
&lt;/pre&gt;
&lt;p&gt;Before we can push to Heroku, we&amp;#8217;ll need to initialize a git repo in our project directory:&lt;/p&gt;
&lt;pre class="code"&gt;
$ git init
&lt;/pre&gt;
&lt;p&gt;By default, Radiant caches &lt;span class="caps"&gt;CMS&lt;/span&gt; pages in RAILS_ROOT/cache. This won&amp;#8217;t work with Heroku&amp;#8217;s &lt;a href="http://heroku.com/docs#toc63"&gt;read-only file system&lt;/a&gt;, so before deploying we&amp;#8217;ll change it to make sure cached files are written in the tmp directory. Open up your config/environment.rb, and change the cache config line so it reads:&lt;/p&gt;
&lt;pre class="code"&gt;
config.action_controller.page_cache_directory = "#{RAILS_ROOT}/tmp/cache"
&lt;/pre&gt;
&lt;p&gt;We&amp;#8217;ll also add a gem manifest to make sure the radiant gem is installed on Heroku when we push. Radiant depends on rSpec 1.2.2, so our .gems file should look like this:&lt;/p&gt;
&lt;pre class="code"&gt;
rspec --version 1.2.2
radiant --version 0.7.1
&lt;/pre&gt;
&lt;p&gt;Then commit your changes:&lt;/p&gt;
&lt;pre class="code"&gt;
$ git add .
$ git commit -m "changed cache dir and added gem manifest"
&lt;/pre&gt;
&lt;p&gt;Now it&amp;#8217;s time to create an app on Heroku and deploy this baby to it.&lt;/p&gt;
&lt;pre class="code"&gt;
$ heroku create
Created http://vivid-fog-54.heroku.com/ | git@heroku.com:vivid-fog-54.git
Git remote heroku added
$ git push heroku master
....
-----&amp;gt; Heroku receiving push
-----&amp;gt; Rails app detected
       Compiled slug size is 5.4MB
-----&amp;gt; Launching.......... done
       App deployed to Heroku
&lt;/pre&gt;
&lt;p&gt;Finally, we&amp;#8217;ll transfer over our local database using &lt;a href="http://blog.heroku.com/archives/2009/3/18/push_and_pull_databases_to_and_from_heroku/"&gt;taps&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="code"&gt;
$ heroku db:push
Auto-detected local database: sqlite://db/development.sqlite3
Sending schema
Sending data
9 tables, 57 records
schema_migrat: 100% |==================| Time: 00:00:00
config:        100% |==================| Time: 00:00:00
page_parts:    100% |==================| Time: 00:00:00
extension_met: 100% |==================| Time: 00:00:00
sessions:      100% |==================| Time: 00:00:00
pages:         100% |==================| Time: 00:00:00
snippets:      100% |==================| Time: 00:00:00
layouts:       100% |==================| Time: 00:00:00
users:         100% |==================| Time: 00:00:00
Sending indexes
&lt;/pre&gt;
&lt;p&gt;And now our Radiant instance is live and ready to go!&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.heroku.com/images/radiant_on_heroku.png" alt="Radiant on Heroku"&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/NHIiVZg9Z4Y" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/3/26/radiant_cms_in_5_minutes_or_less/</feedburner:origLink></item>
    <item>
      <title>Push and Pull Databases To and From Heroku</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/5QNEc-9iuMc/</link>
      <pubDate>Wed, 18 Mar 2009 19:38:35 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/3/18/push_and_pull_databases_to_and_from_heroku/</guid>
      <description>&lt;p&gt;A frequent question people ask us is &amp;#8220;how do I transfer my database between my local workstation and my Heroku app?&amp;#8221;&lt;/p&gt;
&lt;p&gt;This is an important question for several reasons. First, you &lt;em&gt;always&lt;/em&gt; own your data on Heroku, and we want you to be able to get to it quickly and easily at any time. Also &amp;#8211; as you may have noticed from previous posts &amp;#8211; we&amp;#8217;re obsessive about workflow. Whether you&amp;#8217;re debugging an issue with production data or setting up a staging environment, being able to quickly pull/push data between environments is key to a smooth experience.&lt;/p&gt;
&lt;p&gt;Previously, we offered &lt;a href="http://github.com/adamwiggins/yaml_db"&gt;yaml_db&lt;/a&gt; as a solution. We liked that it was simple and database agnostic, but parsing large &lt;span class="caps"&gt;YAML&lt;/span&gt; files is just too slow. We also wanted something that works with any framework compatible with our &lt;a href="http://blog.heroku.com/archives/2009/3/5/32_deploy_merb_sinatra_or_any_rack_app_to_heroku/"&gt;Rack-based platform&lt;/a&gt;.  Ricardo, Blake and Adam came up with &lt;a href="http://adam.blog.heroku.com/past/2009/2/11/taps_for_easy_database_transfers/"&gt;Taps&lt;/a&gt;, which was released last month as a &lt;a href="http://github.com/ricardochimal/taps/"&gt;standalone project&lt;/a&gt;. Having collected some quality feedback from the community, we&amp;#8217;re now pleased to announce that Taps is officially baked into &lt;a href="http://heroku.com"&gt;Heroku&lt;/a&gt;, allowing seamless and easy database transfer between Heroku apps and any external environment.&lt;/p&gt;
&lt;p&gt;To try it out, install the latest Heroku gem. Then use the &amp;#8220;db:pull&amp;#8221; command to pull your database down from your Heroku app to your local workstation:&lt;/p&gt;
&lt;pre class="code"&gt;
$ heroku db:pull
Receiving schema
Receiving data
8 tables, 591 records
users:         100% |================================| Time: 00:00:00
pages:         100% |================================| Time: 00:00:00
comments:      100% |================================| Time: 00:00:00
tags:          100% |================================| Time: 00:00:00
Receiving indexes
Resetting sequences
&lt;/pre&gt;
&lt;p&gt;This loads the schema, data, indexes and sequences of the remote Heroku database down into the local database specified in config/database.yml. You can also specify the destination database using standard &lt;span class="caps"&gt;URI&lt;/span&gt;-syntax:&lt;/p&gt;
&lt;pre class="code"&gt;
$ heroku db:pull mysql://root:mypass@localhost/mydb
&lt;/pre&gt;
&lt;p&gt;Because Taps uses ActiveRecord (for schema) and Sequel (for data), it seamlessly transfers between different database vendors. In fact, if you don&amp;#8217;t feel like running a local database server, just use SQLite:&lt;/p&gt;
&lt;pre class="code"&gt;
$ heroku db:pull sqlite://path/to/my.db
&lt;/pre&gt;
&lt;p&gt;Of course, the syntax for pushing your local database up to Heroku is equally simple:&lt;/p&gt;
&lt;pre class="code"&gt;
$ heroku db:push
Sending schema
Sending data
users:         100% |================================| Time: 00:00:00
pages:         100% |================================| Time: 00:00:00
comments:      100% |================================| Time: 00:00:00
tags:          100% |================================| Time: 00:00:00
Sending indexes
Resetting sequences
&lt;/pre&gt;
&lt;p&gt;That&amp;#8217;s Taps in a nutshell. It&amp;#8217;s live right now, so check it out and let us know how you like it. &lt;a href="http://heroku.com/docs#toc45"&gt;Full docs are available here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/5QNEc-9iuMc" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/3/18/push_and_pull_databases_to_and_from_heroku/</feedburner:origLink></item>
    <item>
      <title>Rails 2.3</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/1szA9trYANY/</link>
      <pubDate>Mon, 16 Mar 2009 15:42:15 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/3/16/rails_23/</guid>
      <description>&lt;p&gt;The Rails 2.3.2 gem is now installed and available for use on Heroku. To learn more about what&amp;#8217;s new and improved, check &lt;a href="http://weblog.rubyonrails.org/2009/3/16/rails-2-3-templates-engines-rack-metal-much-more"&gt;the official Rails blog post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/1szA9trYANY" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/3/16/rails_23/</feedburner:origLink></item>
    <item>
      <title>Gem Manifests</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/wuVF0aV4xzg/</link>
      <pubDate>Tue, 10 Mar 2009 20:38:09 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/3/10/gem_manifests/</guid>
      <description>&lt;p&gt;Gem installation and management has always been pain when the time comes to deploy an app. Rails 2.1 made good progress in this area with &lt;a href="http://ryandaigle.com/articles/2008/4/1/what-s-new-in-edge-rails-gem-dependencies"&gt;gem dependency specifications&lt;/a&gt;, allowing you to vendor required gems with a of set rake commands. That&amp;#8217;s the method we&amp;#8217;ve been recommending for Heroku apps until now, but it does leave important problems unsolved. &lt;/p&gt;
&lt;p&gt;First, a substantial limitation of the vendoring method is that it only works with pure Ruby gems. Many apps depend on gems with native extensions that need to be compiled on the deployment target.  It&amp;#8217;s no good compiling a gem on your Mac laptop and trying to deploy the resulting binary to a Linux host.&lt;/p&gt;
&lt;p&gt;Then there&amp;#8217;s the issue of adding extra bulk to your code repo by checking in vendored gems. Bulkier repos cause slower deploys, and slower usually equates to fewer. From a process perspective, the net result is decreasing the &lt;em&gt;agility&lt;/em&gt; of your codebase. And in a cloud computing environment, these translate to direct &lt;em&gt;scalability&lt;/em&gt; consequences: big repos don&amp;#8217;t scale as fast as lean ones.&lt;/p&gt;
&lt;p&gt;A next-generation web host should have a next-generation solution to this problem.  Today we&amp;#8217;re excited to introduce just such a solution: gem manifests, the new standard for gem installation and dependency management on Heroku!&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the skinny: add a file named &amp;#8220;.gems&amp;#8221; (this is your gem manifest) to the root of your app.  Here you can list your gems in a format identical to what you would pass to &amp;#8220;gem install&amp;#8221; on the command line:&lt;/p&gt;

&lt;pre class="code"&gt;
hpricot --version '&amp;gt;= 0.2' --source code.whytheluckystiff.net
dm-core --version 0.9.10
&lt;/pre&gt;
&lt;p&gt;
&lt;p&gt;Commit the file, git push to Heroku, and watch as your gems are fetched and installed. For Hpricot, native extensions are compiled before your very eyes!&lt;/p&gt;
&lt;/p&gt;
&lt;pre class="code"&gt;
$ git add .gems
$ git commit -m "added gem manifest"

$ git push heroku master
Counting objects: 4, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 356 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)

-----&amp;gt; Heroku receiving push

-----&amp;gt; Installing gem hpricot &amp;gt;= 0.2 from http://code.whytheluckystiff.net
       Building native extensions.  This could take a while...
       Successfully installed hpricot-0.6
       1 gem installed

-----&amp;gt; Installing gem dm-core 0.9.10 from http://gems.rubyforge.org
       Successfully installed addressable-2.0.2
       Successfully installed extlib-0.9.10
       Successfully installed data_objects-0.9.11
       Successfully installed dm-core-0.9.10
       4 gems installed

-----&amp;gt; Verifying repository integrity... done, looks like a Rails app.
       Compiled slug size is 4.3MB
-----&amp;gt; Launching.............. done
       App deployed to Heroku

To git@heroku.com:vivid-moon-60.git
   91425e3..fe10e87  master -&amp;gt; master
&lt;/pre&gt;
&lt;p&gt;As you can see, this gem manifest is lightweight, framework-agnostic (works great with Sinatra), and won&amp;#8217;t add any weight to your repo since installation is done in the cloud.  Your gems are automatically in the require path, so you can pull them into your app easy-as-pie. Finally, gems are only compiled when the manifest changes, so subsequent deploys will be fast as ever.&lt;br /&gt;
&lt;br /&gt;
Check out the &lt;a href="http://heroku.com/docs/#toc42"&gt;docs&lt;/a&gt;, take it for a test-drive, and tell us what you think.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/wuVF0aV4xzg" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/3/10/gem_manifests/</feedburner:origLink></item>
    <item>
      <title>Deploy Merb, Sinatra, or any Rack App to Heroku</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/KS6Jwsljl4A/</link>
      <pubDate>Thu, 05 Mar 2009 23:32:21 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/3/5/32_deploy_merb_sinatra_or_any_rack_app_to_heroku/</guid>
      <description>&lt;p&gt;The past eighteen months have seen an explosion of Rails-inspired &lt;a href="http://adam.blog.heroku.com/past/2009/1/9/codemash_slides/"&gt;Ruby web frameworks&lt;/a&gt;.  &lt;a href="http://merbivore.com/"&gt;Merb&lt;/a&gt; and &lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt; are the best known; plus many others such as &lt;a href="http://ramaze.net/"&gt;Ramaze&lt;/a&gt;, &lt;a href="http://camping.rubyforge.org/"&gt;Camping&lt;/a&gt;,  and &lt;a href="http://rubywaves.com/"&gt;Waves&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s why we&amp;#8217;re so pleased to announce the ability to deploy any Rack-compatible web app to Heroku.&lt;/p&gt;
&lt;p&gt;Assuming you have a &lt;a href="http://heroku.com/signup"&gt;Heroku account&lt;/a&gt;, here&amp;#8217;s how you can deploy a Sinatra app in about 30 seconds.  Make a new directory, and inside create hello.rb:&lt;/p&gt;
&lt;pre class="code"&gt;
require 'rubygems'
require 'sinatra'

get '/' do
  "Hello from Sinatra on Heroku!"
end
&lt;/pre&gt;
&lt;p&gt;Then create a config.ru file in the same directory (the location follows the &lt;a href="http://www.modrails.com/documentation/Users%20guide.html#_deploying_a_rack_based_ruby_application"&gt;Passenger convention&lt;/a&gt;):&lt;/p&gt;
&lt;pre class="code"&gt;
require 'hello'
run Sinatra::Application
&lt;/pre&gt;
&lt;p&gt;Now let&amp;#8217;s put our microapp under revision control with Git:&lt;/p&gt;
&lt;pre class="code"&gt;
$ git init
Initialized empty Git repository in /Users/adam/hello/.git/
$ git add .
$ git commit -m "sinatra and heroku, two great tastes"
[master (root-commit)]: created 93a9e6d: "sinatra and heroku, two great tastes"
 2 files changed, 9 insertions(+), 0 deletions(-)
 create mode 100644 config.ru
 create mode 100644 hello.rb
&lt;/pre&gt;
&lt;p&gt;Finally, create the app on Heroku and deploy:&lt;/p&gt;
&lt;pre class="code"&gt;
$ heroku create
Created http://severe-spring-77.heroku.com/ | git@heroku.com:severe-spring-77.git
Git remote heroku added
$ git push heroku master
Counting objects: 4, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 385 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)

-----&amp;gt; Heroku receiving push
-----&amp;gt; Verifying repository integrity... done, looks like a Rack app.
       Compiled slug size is 0.1MB
-----&amp;gt; Launching....... done
       App deployed to Heroku

To git@heroku.com:severe-spring-77.git
 * [new branch]      master -&amp;gt; master
&lt;/pre&gt;
&lt;p&gt;Type &amp;#8220;heroku open&amp;#8221; at your shell (or cut-and-paste the web &lt;span class="caps"&gt;URL&lt;/span&gt; displayed when you created the app &amp;#8211; in the example above it was http://severe-spring-77.heroku.com/).  Congratulations, you&amp;#8217;re riding the Rack!&lt;/p&gt;
&lt;p&gt;For more details, including how to deploy other frameworks or even a frameworkless Rack app, &lt;a href="http://heroku.com/docs/index.html#toc25"&gt;check out the docs&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/KS6Jwsljl4A" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/3/5/32_deploy_merb_sinatra_or_any_rack_app_to_heroku/</feedburner:origLink></item>
    <item>
      <title>Deployment That Just Works</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/iR4z6yjzvqQ/</link>
      <pubDate>Tue, 03 Mar 2009 22:59:20 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/3/3/deployment_that_just_works/</guid>
      <description>&lt;p&gt;Last week I talked a bit about &lt;a href="http://blog.heroku.com/archives/2009/2/23/why_instant_deployment_matters/"&gt;why instant deployment matters&lt;/a&gt;.  A few people have since commented that it&amp;#8217;s not instant deployment that matters to them, but rather deployment that just works every time.&lt;/p&gt;
&lt;p&gt;Of course, what we&amp;#8217;re really talking about is both. Part of achieving deployment that just works is decreasing complexity and removing steps &amp;#8211; each a point of possible failure. We are working toward deployment that&amp;#8217;s both instant and completely reliable, because we think those things are tightly linked.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve rolled out some new content today explaining more about &lt;a href="http://heroku.com/how"&gt;how our platform works&lt;/a&gt;, including some more detailed architectural information. We&amp;#8217;re hoping it will continue to build a better picture of the vision we&amp;#8217;re striving for.  I want to take some time here to explain some of the background behind this architecture.&lt;/p&gt;
&lt;p&gt;Instant deployment that just works is, of course, a tall order.&lt;br /&gt;
In order to achieve it, there are several requisites:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. A Sharp Focus on Web Apps&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Provisioning is different for different types of apps &amp;#8211; a video transcoding farm is very different from a web app. The only way to make the process instant is to know what type of thing you&amp;#8217;re dealing with ahead of time. This is achieved by only handling one type of thing (Heroku, for example, only handles web apps, and even then, only those written in the ruby language).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Standardization of App Structure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Any time you want to plug and play, most of the work is centered around standardization. Because all lamps have the same power plug and voltage requirements, you can move them around freely and plug them in anywhere. Similarly, all apps need to be self-contained and have the same structure and environmental requirements.&lt;/p&gt;
&lt;p&gt;A software framework like Ruby on Rails (or even just Rack) gets us most of the structure we need, but a lot of work remains in self-containment and standardization of environmental requirements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. A Dynamic Platform&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Aside from standardized plugs and voltage, the reason you can plug a lamp in anywhere is that hidden behind the walls, there&amp;#8217;s a complex system of wiring, circuits, breakers, and transformers, which distribute power to the lamps evenly and only when needed, and prevent short circuits and other safety hazards. If one lamp has a short, it won&amp;#8217;t destroy the other lamps or your home.&lt;/p&gt;
&lt;p&gt;Similarly, we need a platform architecture that can move apps around independently, start and stop them instantly, provide the standardized environment (library dependencies, databases, caching, etc.), distribute compute power evenly, and prevent one greedy or malfunctioning app from damaging others.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. On-Demand Provisioning of Underlying Infrastructure Resources&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lastly, no matter how many lamps you plug in (within reason), you won&amp;#8217;t run out of power. The enormous capacity of electricity producers combined with a sophisticated grid of distribution and storage technologies ensure that power is available right when you need it. This whole system works because you don&amp;#8217;t have to plug in a lamp and then wait for someone to turn on another generator somewhere.&lt;/p&gt;
&lt;p&gt;This last requirement is non-trivial, and has historically been a major barrier to instant provisioning/deployment. Thankfully it&amp;#8217;s available now, in the form of utility computing from services like Amazon&amp;#8217;s EC2. When compute power is needed, you can get it within seconds or minutes. It&amp;#8217;s still not instant, but it&amp;#8217;s close enough that an efficient dynamic platform can hide this delay by maintaining standby capacity (the same way batteries and capacitors hide the delay of a generator starting up on the electrical grid).&lt;/p&gt;
&lt;p&gt;This is the real value of utility computing: it has the power to enable truly instant provisioning and deployment, by providing one of the four requisites.&lt;/p&gt;
&lt;h1&gt;Heroku&amp;#8217;s Architecture&lt;/h1&gt;
&lt;p&gt;We discovered the 4 requisites above as we built our platform, so our current architecture is designed specifically to address these issues.  Item 1 is embodied by our decision to specialize on Ruby-based web apps, and item 4 is simply available to us today for the first time.&lt;/p&gt;
&lt;p&gt;Items 2 and 3, however, deserve some explanation:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Standardization of App Structure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://heroku.com/how/architecture"&gt;overall structure&lt;/a&gt; of our platform is designed to standardize the web stack, vastly simplifying the deployment process and removing a lot of decisions you might have to make when designing and deploying an app.&lt;/p&gt;
&lt;p&gt;Should we use memcached? It&amp;#8217;s &lt;a href="http://heroku.com/how/architecture#memory-cache"&gt;already included&lt;/a&gt;.  What about static content?  Don&amp;#8217;t worry about it &amp;#8211; our &lt;a href="http://heroku.com/how/architecture#http-cache"&gt;high-performance &lt;span class="caps"&gt;HTTP&lt;/span&gt; cache&lt;/a&gt; will handle it automatically.  How many app servers should we run, and how many machines do we need for them?  Just start with a few and &lt;a href="http://heroku.com/how/architecture#dyno-grid"&gt;change it instantly at any time&lt;/a&gt;, and never even think about &lt;a href="http://heroku.com/how/dyno_grid#2"&gt;how many servers&lt;/a&gt; they&amp;#8217;re running on.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve also settled on a standard app stack we call a &lt;a href="http://heroku.com/how/dynos"&gt;dyno&lt;/a&gt;. The way an app retrieves its configuration from the &lt;a href="http://heroku.com/how/dynos#posix-environment"&gt;environment&lt;/a&gt; has also been standardized.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. A Dynamic Platform&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve done a huge amount of work on this over the last year, and our efforts have been focussed by the 25,000 apps now running on Heroku. The &lt;a href="http://heroku.com/how/architecture#routing-mesh"&gt;routing mesh&lt;/a&gt; gives us the ability to easily move apps around, and to scale our resources independently of scaling an individual app.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://heroku.com/how/architecture#dyno-grid"&gt;dyno grid&lt;/a&gt; lets us &lt;a href="http://heroku.com/how/dyno_grid"&gt;scale an app up&lt;/a&gt;, as well as distribute power evenly and &lt;a href="http://heroku.com/how/dyno_grid#3"&gt;route around problems&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This architecture let&amp;#8217;s you &lt;a href="http://heroku.com/how/workflow"&gt;deploy via Git&lt;/a&gt; by simply pushing your code to your app&amp;#8217;s Heroku repository.  We&amp;#8217;re actually &lt;a href="http://heroku.com/how/dyno_grid"&gt;&amp;#8220;compiling&amp;#8221;&lt;/a&gt; your app now as it&amp;#8217;s pushed; performing integrity checks and verifying that it can start.&lt;/p&gt;
&lt;p&gt;So did we get there?  Have we achieved instant deployment?  Well, we think we&amp;#8217;re getting pretty damn close.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/iR4z6yjzvqQ" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/3/3/deployment_that_just_works/</feedburner:origLink></item>
    <item>
      <title>Why Instant Deployment Matters</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/zm9QDKrA6uM/</link>
      <pubDate>Mon, 23 Feb 2009 18:55:37 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/2/23/why_instant_deployment_matters/</guid>
      <description>&lt;p&gt;How much better are two steps than three?  Does it matter if something takes five minutes instead of twenty? When it comes to software deployment and provisioning, does instant really matter?&lt;/p&gt;
&lt;p&gt;Recently, I was ranting on this subject to a user who had the misfortune of asking me about it in person.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Truly instant provisioning and deployment is the ultimate goal,&amp;#8221; I said. &amp;#8220;10 seconds isn&amp;#8217;t good enough. We have to &amp;ndash;&amp;#8221;,&lt;/p&gt;
&lt;p&gt;&amp;#8220;Look,&amp;#8221; he interrupted, &amp;#8220;I love what you guys are doing and don&amp;#8217;t want you to stop, but why are you so obsessed with this?&amp;#8221;&lt;/p&gt;
&lt;p&gt;My immediate answer: because we&amp;#8217;re obsessive people. A couple years ago we stumbled across what we view as a glaring disconnect between the way software is developed and the way it&amp;#8217;s provisioned and deployed. Now, like a person who&amp;#8217;s noticed a crooked picture on the wall, we are totally fixated on setting it straight.&lt;/p&gt;
&lt;p&gt;This was a shallow answer though, and he wasn&amp;#8217;t convinced:&lt;/p&gt;
&lt;p&gt;&amp;#8220;I mean it&amp;#8217;s not that bad as is, is it?&amp;#8221; he said.  &amp;#8220;It&amp;#8217;s been improving steadily for years.&amp;#8221;&lt;/p&gt;
&lt;p&gt;And that&amp;#8217;s when it hit me. While everyone is adversely affected by this growing problem, most people don&amp;#8217;t actually see it. It has crept up on us gradually.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1996&lt;/strong&gt;: A development team of perhaps 10 people (toting advanced computer science degrees) spends 6 months building software to laboriously defined specifications, writing their own framework, and using limited libraries and no testing harness. It then takes an IT team of say 3 people a couple of weeks to provision server resources, configure and install the OS and software stack, and deploy the software.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2000&lt;/strong&gt;: A more ambitious team of 6 people (toting half-finished computer science degrees) spends 3 months building a web application to satisfy a &lt;a href="http://en.wikipedia.org/wiki/Product_requirements_document"&gt;&lt;span class="caps"&gt;PRD&lt;/span&gt;&lt;/a&gt;, using primitive frameworks and some integration testing. It then takes 3 people about a week (optimistically) to provision servers from IT, install the web stack, and deploy the app.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2004&lt;/strong&gt;: A 4-person team (half of whom went to art school) spends 4 weeks writing a web app to some short and loose specs, using decent frameworks, unit and integration testing, and lots of user feedback. It then takes just 2 people about a week to provision virtual servers, install a complete web stack, and deploy the app.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2008&lt;/strong&gt;: An agile team of 4 people (plus perhaps a scrum master) spend a week building the first complete version of their web app from just a rough user story, using advanced web frameworks, fully featured libraries, test-driven development, and sharp agile practices. It then takes just one person a few days to provision new resources from IT or a fast-moving hosting company, install the default web stack, and do the initial deploy.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s look at these data points:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.heroku.com/images/posts/instant_table.png" class="nobox" /&gt;&lt;/p&gt;
&lt;p&gt;The bottom row is the percentage of the total project/iteration time spent on provisioning and deployment. Look at it this way:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.heroku.com/images/posts/instant_chart.png" class="nobox" /&gt;&lt;/p&gt;
&lt;p&gt;This is shocking. Provisioning and deployment has gotten 10x faster during this period, but development has gotten 130x faster. Development teams are getting smaller and more agile, doing shorter iterations (deploying more often), and scaling their apps more quickly (more frequent provisioning). This results in a dramatic increase in the portion of time spent provisioning and deploying.&lt;/p&gt;
&lt;p&gt;At this rate, in less than 3 years we&amp;#8217;ll be spending as much time deploying and provisioning as we spend developing. These numbers are based on our direct experience with medium/large company software projects. You can play around with the scenarios; even with widely different numbers the curve is about the same.&lt;/p&gt;
&lt;p&gt;The reason most people don&amp;#8217;t see this growing problem is because it&amp;#8217;s masked by the gradual improvement of the deployment and provisioning process.&lt;/p&gt;
&lt;p&gt;Capistrano, for example, is an awesome deployment tool, which makes us feel great about the improving state of deployment tools. But these incremental improvements aren&amp;#8217;t keeping up with agile development; they&amp;#8217;re an investment in a race that can&amp;#8217;t be won.&lt;/p&gt;
&lt;p&gt;We see this playing out often now. We&amp;#8217;ve been contacted by quite a few Fortune 500 companies lately who, after a massive agile restructuring of their software development organization, discovered they are now spending as much time on provisioning as development. All the economic benefit of agile development is consumed by provisioning &amp;#8211; this has enormous fiscal impact.&lt;/p&gt;
&lt;p&gt;How do we solve this problem? It doesn&amp;#8217;t seem possible to both make provisioning/deployment faster than development, and also keep it there by continuously improving at a higher rate. How do we get off this treadmill?&lt;/p&gt;
&lt;p&gt;What if we could provision and deploy instantly? This is where the difference between &amp;#8220;a little&amp;#8221; and &amp;#8220;none&amp;#8221; comes into play. If it&amp;#8217;s instant, the portion of time spent on it goes to zero. The development process can then improve at any speed, and deployment/provisioning will never become a barrier. Problem solved.&lt;/p&gt;
&lt;p&gt;This is, by the numbers, why instant deployment matters.&lt;/p&gt;
&lt;p&gt;How are we actually achieving instant deployment?  Over the next two weeks we&amp;#8217;ll be posting more information on the challenges involved, and how we&amp;#8217;ve designed Heroku&amp;#8217;s architecture to meet them.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/zm9QDKrA6uM" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/2/23/why_instant_deployment_matters/</feedburner:origLink></item>
    <item>
      <title>Build a news site with Rubyflow</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/eGYMb-i7vRo/</link>
      <pubDate>Tue, 10 Feb 2009 23:09:31 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/2/10/build_a_news_site_with_rubyflow/</guid>
      <description>&lt;p&gt;Ruby journalist extraordinaire, Peter Cooper, is a busy man. Chances are you&amp;#8217;re already following his work to bring you the latest Ruby news on sites such as &lt;a href="http://www.rubyinside.com"&gt;Ruby Inside&lt;/a&gt; and &lt;a href="http://www.rubyflow.com"&gt;RubyFlow&lt;/a&gt;. Late last year he even added a tremendously useful site oriented towards iPhone and iPod Touch development called &lt;a href="http://www.mobileorchard.com"&gt;Mobile Orchard&lt;/a&gt;. Somewhere along the line he was also generous enough to leak the source code for Rubyflow, and now a version of that is available through &lt;a href="http://github.com/Sutto/rubyflow"&gt;Sutto&amp;#8217;s Github repository&lt;/a&gt;.That&amp;#8217;s great news for anyone looking to start their own news site, especially since it&amp;#8217;s a breeze to get working on Heroku.&lt;/p&gt;
&lt;p&gt;Start by cloning the source from Github:&lt;/p&gt;
&lt;pre class="code"&gt;
$ git clone git://github.com/Sutto/rubyflow.git
&lt;/pre&gt;
&lt;p&gt;Rubyflow depends the thoughtbot-factorygirl gem, so next we&amp;#8217;ll make sure to install that and unpack it in vendor/gems:&lt;/p&gt;
&lt;pre class="code"&gt;
$ rake gems:install
$ rake gems:unpack
&lt;/pre&gt;
&lt;p&gt;I also found that the captcha used in Rubyflow&amp;#8217;s user registration requires &amp;#8220;digest/sha1&amp;#8221; to be required explicitly, so go ahead and add&lt;/p&gt;
&lt;pre class="code"&gt;require 'digest/sha1'&lt;/pre&gt;
&lt;p&gt;at the bottom of config/environment.rb. Once you&amp;#8217;ve done that it&amp;#8217;s time to commit our changes to git:&lt;/p&gt;
&lt;pre class="code"&gt;
$ git add .
$ git commit -m "vendored gems and required digest/sha1"
&lt;/pre&gt;
&lt;p&gt;With that out of the way, it&amp;#8217;s time to create an app on Heroku and deploy to it:&lt;/p&gt;
&lt;pre class="code"&gt;
$ cd rubyflow
$ heroku create 
Created http://high-fire-37.heroku.com/ | git@heroku.com:high-fire-37.git
Added git remote heroku
$ git push heroku master
...
App deployed to Heroku.
&lt;/pre&gt;
&lt;p&gt;Finally, we run migrations to set up the application database:&lt;/p&gt;
&lt;pre class="code"&gt;
$ heroku rake db:migrate
&lt;/pre&gt;
&lt;p&gt;&amp;#8230;and there you have it!&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.heroku.com/images/rubyflow_on_heroku.png" alt="Rubyflow on Heroku"&gt;&lt;/p&gt;
&lt;p&gt;Be sure to read the docs on site configuration and customization &lt;a href="http://github.com/Sutto/rubyflow/tree/master"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/eGYMb-i7vRo" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/2/10/build_a_news_site_with_rubyflow/</feedburner:origLink></item>
    <item>
      <title>The Future of Deployment</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/aVkt7SmHa6c/</link>
      <pubDate>Fri, 06 Feb 2009 02:04:44 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/2/6/future_of_deployment/</guid>
      <description>&lt;p&gt;Application deployment is changing.  In relatively short order I&amp;#8217;ve gone from buying hardware, to monthly hosting, to metered &lt;span class="caps"&gt;CPU&lt;/span&gt; time, and from building my open-source software manually, to package managers, to fancy config tools and recipes to pre-build whole machine images.  What&amp;#8217;s next?&lt;/p&gt;
&lt;h1&gt;The Old Way&lt;/h1&gt;
&lt;p&gt;I can deploy Rails apps in a traditional hosting environment pretty quickly.  For a small app, I might make a new unix user and database on a personal &lt;a href="http://www.slicehost.com/"&gt;Slicehost&lt;/a&gt; slice and do a quick code checkout.  After setting up a few permissions and twiddling my Nginx config, in a matter of fifteen minutes or so my app is online.  Not bad at all.&lt;/p&gt;
&lt;p&gt;For a bigger app, it takes more time.  In days of yore I&amp;#8217;d build a server from parts or buy one of the excellent &lt;a href="http://www.pogolinux.com/"&gt;Pogo Linux&lt;/a&gt; servers and put it in a colo.  OS install, Xen setup, guest OS install, OS package setup, security lockdown, then on to the task of all the stack setup (database, Rails, source control) specific to the application to be run.&lt;/p&gt;
&lt;p&gt;Once you get into multiple servers, the complexity multiplies out quickly.  There are dozens of small decisions to make about how resources are allocated.  More &lt;span class="caps"&gt;RAM&lt;/span&gt; or more &lt;span class="caps"&gt;CPU&lt;/span&gt; for the database machine?  One slave database, or two?  Hardware load balancer vs. multiple IPs vs. something else?  All of these require both detailed knowledge about hardware and software deployments, combined with a huge amount of predictive guesswork to try to foresee the quantity and type of load that the app being deployed is likely to face in the next 3, 6, or 12 months.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s an enterprisey word for this process: provisioning.&lt;/p&gt;
&lt;h1&gt;The New Way&lt;/h1&gt;
&lt;p&gt;Amazon&amp;#8217;s EC2 is the vanguard of the new generation of cloud computing.  Provisioning a server was formerly a phone call and days or weeks of waiting.  Now it&amp;#8217;s a &lt;span class="caps"&gt;REST&lt;/span&gt; call and 30 seconds of waiting.  Awesome.&lt;/p&gt;
&lt;p&gt;But this is a very raw resource: there are still many provisioning decisions to be made, software to set up, and then on to deployment of the app itself.  Excellent services like &lt;a href="http://www.rightscale.com/"&gt;RightScale&lt;/a&gt; and Engine Yard&amp;#8217;s new offering &lt;a href="http://www.engineyard.com/solo"&gt;Solo&lt;/a&gt; can help automate a lot of this process and minimize the management burden.  So far, so good.&lt;/p&gt;
&lt;p&gt;But what if provisioning was instantaneous, requiring no upfront decisions about resource allocation?  What if you didn&amp;#8217;t need to think at all about the server hardware or software, but only about your application code?  How would this change how we build applications?&lt;/p&gt;
&lt;h1&gt;The Future&lt;/h1&gt;
&lt;p&gt;When technology breakthroughs make something smaller, or faster, or cheaper, it doesn&amp;#8217;t just change current use; it creates &lt;a href="http://books.google.com/books?id=SIexi_qgq2gC"&gt;whole new types of use&lt;/a&gt;.  If app deployment is instantaneous, without having to plan for resources, allocate servers, or beg approval from the IT department, what kind of apps will we build that don&amp;#8217;t get built today?&lt;/p&gt;
&lt;p&gt;In the past decade we&amp;#8217;ve seen widespread adoption of &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;agile methodologies&lt;/a&gt; in the development of software.  This has transformed software development from a slow, failure-prone, and sometimes downright painful process into one that is fast, fun, and fulfilling.  But deployment of applications has changed hardly at all during that same time period.  The way you deploy a Rails, Merb, Sinatra, or Django app today is very similar to how you deployed a Perl app in 1999.&lt;/p&gt;
&lt;p&gt;This coming decade is going to see an agile revolution for the &lt;em&gt;deployment&lt;/em&gt; side of the equation.  The manual, guesswork-heavy methods of provisioning that we use today are soon to be superseded by methods that will make deploying an app fast, easy, and fun.&lt;/p&gt;
&lt;p&gt;No one knows quite what that will look like yet (though at Heroku we certainly have our &lt;a href="http://heroku.com/"&gt;own opinion&lt;/a&gt;), but one thing is for sure: the time is ripe for a revolution in IT.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/aVkt7SmHa6c" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/2/6/future_of_deployment/</feedburner:origLink></item>
    <item>
      <title>Heroku + Suspenders</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/nzIGleJCS0E/</link>
      <pubDate>Tue, 13 Jan 2009 01:52:16 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2009/1/13/27_heroku_suspenders/</guid>
      <description>&lt;p&gt;Making Rails readily accessible to developers of all stripes is a big part of the vision behind the Heroku platform, and we try to be supportive of any initiatives that make teaching and learning Rails easier.&lt;/p&gt;
&lt;p&gt;A couple of months ago, &lt;a href="http://www.thoughtbot.com"&gt;thoughtbot&lt;/a&gt; released &lt;a href="http://giantrobots.thoughtbot.com/2008/10/21/suspenders"&gt;suspenders&lt;/a&gt; &amp;#8211; a freely available Rails template app, loaded with commonly used plugins, sensible configuration options and helpful rake tasks. Simple as it may seem, having a solid default app template is a really important step in eliminating the barriers that prevent developers from jumping directly from concept to coding with Rails. We think thoughtbot are doing the Rails community a real service with this project, so do yourself a favor and check out the &lt;a href="http://github.com/thoughtbot/suspenders"&gt;github repo&lt;/a&gt; and take it for a spin.&lt;/p&gt;
&lt;p&gt;Naturally, suspenders &lt;a href="http://giantrobots.thoughtbot.com/2009/1/12/heroku-wearing-suspenders"&gt;runs wonderfully on Heroku&lt;/a&gt; :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/nzIGleJCS0E" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://blog.heroku.com/archives/2009/1/13/27_heroku_suspenders/</feedburner:origLink></item>
  </channel>
</rss>
