Wednesday, January 12, 2011

Rails hosting Heroku


Heroku – getting started
1 – Sign up. The best thing about Heroku is that you can start by using their free hosting plan. Just register on their site.
2 – Git and Rails installed. I assume you have Rails installed locally, and you should also have Git installed for Heroku to work.
3 – Run “gem install heroku” to install the heroku gem. It will add a “heroku” command tool to your command line that will be the way for you to work with your hosting – there will be no ftp and no web control panel (the control panel is still used to switch addons on and off, but majority of activities are done from the command line). After installing the gem, try running “heroku” – it should show you a list of available commands.
4 – Heroku actually has a good Quick start guide that you could follow easily. There are some tricks for a Windows user, so I will cover them here:
4.1. Using Git. First, you will need to initialize the Git repository for your code. If younever used Git for anything other than downloading plugins, you need to start learning to use it as your VCS of choice. If you are already using some VCS for Rails, you will need to move to Git in order to use Heroku. As I didn’t use a VCS, it was easy for me.
4.2. Switching Git on:
* Go to the root directory of your rails app (the one you want to host).
* Heroku has a 50mb limit on the size of your Rails project for a free hosting plan. So, before running any commands, remove any obvious garbage from the directory (old copies, big archives, graphic and video files you don’t need).
* If there are some things that you’d rather leave in the project directory but want Git to ignore, create a .gitignore file in the root of your project. Some useful info on.gitignore is here.
* Ok, if you are all set, run the following commands:
1git init
2git add .
3git commit -m "first version"
The first line initializes a new repository. Second adds all files in the current directory to the repository. The last commits a “release”, and -m “text” provides a comment. Now is the time to invest into learning the basics of Git, as you will be using it a lot. A good introduction on Git is here.
4.3. Creating SSH keys. Now you need to create a public key to allow Git to work using SSH with the Heroku host. Here the Heroku documentation is sparse, so hopefully you will find these instructions helpful:
* Go to the Git\bin directory (for me it was in c:\Program Files) and run “bash” command. It will show you a unix-like prompt.
* Run this command in bash, providing your Heroku email after -C switch:
1ssh-keygen -t rsa -C "your.email@here"
* When prompted to provide a name for the key, type a name “id_rsa” and hit enter.
* When asked for a password you can leave it blank or set one up – it’s up to you. If you set a password, you will be prompted to type it every time you upload to Heroku
* Now, in your Git/bin directory find the just created 2 keys – public and private.
* Move those files to your c:\Users\[your username]\.ssh directory
* Finally, upload the public file (by default with .pub extension) to Heroku by using this command:
1heroku keys:add
If it doesn’t find it, you can explicitly set a full path to your key, like this:
1heroku keys:add c:\key\id_rsa.pub
Note.
If you did everything correctly, it will just work. If Git won’t find a local private key that matches the public key you uploaded, you will get an error like this: Permission denied (publickey).
Finally, I first tried to use puttygen to generate the keys but did not succeed.
5 – Creating your Heroku app. Now from your Rails project’s root directory run
1heroku create
It creates the space for your application, provides a temp url (you can change it later) for you app, and so on. If it asks you for login / pwd, enter the ones you registered on Heroku with.
6 – Uploading app to Heroku. From the same project directory simply run
1git push heroku master
It might ask you for a public key password from step 4.3. But other than that you’re all set. In theory after it successfully uploads, you can run “heroku open” to open your app in browser, but it doesn’t work for me in Windows. You can open it manually in your browser or from the Heroku web console.
7 – Heroku Gotchas – what you should know!
7.1. – Database access
After you upload your scripts, you will want to create the database based on your production database. There are two options. You can run “heroku rake db:migrate” to walk through each migration file. However, if during development you mishandled at least one migration file, it will be tough to fix. A better way is to just upload the schema – “heroku rake db:schema:load”.
Heroku does not allow you to work with the database (or files for that matter) directly, so it’s good if your development environment follows exactly that of Heroku. And Heroku runs on a somewhat less popular PostGres DB, so if you have some more advanced SQL in your code, you’re in for some fun trying to rectify the SQL errors that are working fine on MySQL and SQlite. For me, two plugins stopped working due to a PGError SQL error, and it took a couple of hours to fix.
Heroku also provides a way to push (and pull) data to the production database, but it didn’t really work for me, giving some cryptic error, so I raised a ticket with Heroku CS – let’s see how it goes.
7.2. – Logs and console
Both logs and console are accessible via heroku command. Run “heroku logs” to get the latest extract from logs and “heroku console” to load the console for debugging / testing purposes. These two commands will be your best friends debugging the hosted app.
There is another add-on that you can switch on, called Exceptional, that send you errors via email. But for me it worked with a huge 1-2 hour delay, so it’s not really useful.
7.3. – Installing gems
Heroku takes your vendor/plugins directory just fine, but the gems need some additional setting up to do. You need to list all gems your application requires in “.gems” text file in the root of your project. You can just list the names of gems or set a finer control, listing the version numbers and repositories. More info here.
7.4. – Your file space is read-only(!)
So, this might come as the biggest surprise to some of you, but apart from the scripts that you upload via Git you cannot write anything to disk. You need to host your uploads / userpics / videos, etc. elesewhere. The best alternative probably being S3. Of course, this will mean changing all your scripts to work with S3. Heroku evenexplains how for the most popular plugins – attachment-fu and paperclip.
7.5. – No mail / SMTP gateway providedHeroku does not provide you with an SMTP gateway, you will need to find one yourself and modify the required config files accordingly.
7.6. – Configuration made differently
Heroku suggest you to provide it with the configuration variables using their own methods. More info here.
The verdict
Heroku seems to be a great way of deploying your Rails app. If you set it up according to the rules, deploying will be a breeze – a single line of code will take care of everything(!). If you haven’t been developing with the “cloud” architecture in mind, you’re in for some rewrites, but at least you do it only once.
One thing to note is that Heroku allows collaboration out of the box – this is the power of Git-based hosting for you.
Some things missing for me is the db console, and the db:push doesn’t work at the moment, so it feels like the debug is not fully possible.
I am also not sure about the performance of the application – there are several things added to the stack to allow for the magic. If you need some non-standard things, you most probably will want to have a hosting platform that’s open for you to do any hacks you need.
Still, as a “development box in the cloud” this is great, I recommend you to try it out for your hosting needs!

No comments:

Post a Comment