Deploying Multiple Environments on Heroku
UPDATE: This post is outdated, check out Easy Deploys with Heroku San.
So you followed yesterday's guide on getting your application deployed to Heroku, and now you've fallen in love with it. Now you need to setup both a production and staging environment that you can easily deploy your application to.
So far Heroku only runs code in one branch, so we'll work around this by creating two remote repositories that we can push to.
For example simplicity, we'll be pushing all code out of the same git branch. You'll probably be pushing staging and production servers from different branches, adjust accordingly.
Create your servers and fix your remotes
Application names have to be unique on Heroku, so make sure to replace myapp with your application’s name. You can do that automatically by clicking here.
heroku create myapp-staging --remote staging
heroku create myapp-production --remote production
Since we'll be pushing to two applications we are using the --remote argument to make two sensibly named remotes.
Environment specific variables
Heroku has a nice interface for setting up application specific settings, but I will assume your application configures itself according to the RAILS_ENV variable. Check out Heroku's docs if you need more control.
If you run your staging server in the production environment, you can skip this step.
heroku config:add RACK_ENV=staging --app myapp-staging
heroku config:add RACK_ENV=production --app myapp-production
Deploy and migrate
You'll be doing this next command pretty often. We push the current branch to the staging server's master branch. Since this is the first deploy we'll need to do the same thing for production and run all the migrations.
git push staging master
git push production master
heroku rake db:migrate --app myapp-staging
heroku rake db:migrate --app myapp-production
heroku open --app myapp-staging
heroku open --app myapp-production
Done
Celebrate! You now have two servers running on Heroku with different databases and accessible through domains. Seriously, how long did that take?
Caveats
The heroku command seems to detect the application name by looking through git's remotes for remotes that are located at heroku.com. This means it will get confused by the multiple entries we created. You will need to work around this by passing --app myapp-staging after the normal heroku command.
Troubleshooting
Make sure you followed my original guide on getting your application deployed to Heroku.