Von 0 auf Cloud mit Rails und Heroku

Wäre es nicht toll wenn man mit einem Klick seine Anwendung aufs Produktionssystem deployen könnte? Und das direkt aus der Versionsverwaltung heraus? Und auch gleich noch in die Cloud?
Was vor einigen Jahren noch eine Utopie war ist heute machbar. Wenn es statt einem Klick auch ein kurzer Kommandozeilenbefehl sein darf ist es gar noch einfacher.

Wer sich ein klein wenig mit Cloud-Computing und Rails beschäftigt wird schon von Heroku gehört haben. Mit diesem Anbieter ist es besonders einfach seine Anwendung in die Cloud zu bekommen. Was aber an den Präsentationen nie wirklich auffällt sind die nötigen Vorarbeiten um mit

git push master heroku

seine Software erfolgreich zu deployen. Die Anleitung hier ist umfangreicher, da ich bei 0 anfange und zeige was man für Optionen hat.

Wer bereits über einen Account bei Heroku verfügt, für seine Anwendung Git verwendet und auch den Toolbelt von Heroku installiert hat kann die nächsten Abschnitte überspringen und bei „Nötige Anpassungen“ einsteigen.

 

Voraussetzungen

Damit man die Dienstleistungen von Heroku nutzen kann benötigt man einen Account. Für tests ist dies kostenlos und man benötigt auch keine Kreditkarte. Das Anmeldeformular ist schnell ausgefüllt und man kann gleich anschliessend den zum eigenen Betriebssystem passenden Toolbelt installieren. Wie dies genau geht und was man sonst noch benötigt wird in der Quickstart-Anleitung leicht verständlich erklärt.

Damit etwas in die Cloud gestellt werden kann benötigen wir eine minimale Rails-Anwendung:

rails new todo
cd todo
rails g scaffold item title:string done:boolean

Je nach System gibt es beim Generieren der Objekte auf der letzten Zeile eine Fehlermeldung. Dies passiert wenn auf dem System keine JavaScript Laufzeitumgebung gefunden werden kann. Das von Rails mitgeliefert Gemfile enthält bereits einen auskommentieren Vorschlag:

# gem 'therubyracer', :platforms => :ruby

Um therubyracer zu verwenden genügt es das #-Zeichen zu entfernen, das Gemfile zu speichern und mit dem Befehl bundle die Erweiterung zu installieren. Ein nochmaliges Wiederholen der Generierung sollte nun ohne Probleme durchlaufen.

Um lokal die Anwendung zu testen muss nun die DB angelegt und vorbereitet werden:

rake db:create
rake db:migrate
rails s
=> Booting WEBrick
=> Rails 3.2.8 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2012-12-14 20:28:35] INFO  WEBrick 1.3.1
[2012-12-14 20:28:35] INFO  ruby 1.9.3 (2012-04-20) [x86_64-linux]
[2012-12-14 20:28:35] INFO  WEBrick::HTTPServer#start: pid=10074 port=3000

Auf welchem Port die Anwendung läuft sieht man bei der Ausgabe des letzten Befehls. Die URL http://0.0.0.0:3000/items (inkl. Port) kann man im Browser öffnen und die Anwendung testen.

Lokale Rails Anwendung

Dieser Test soll vor allem zeigen ob die Anwendung überhaupt läuft. Allfällige Probleme lassen sich lokal einfacher lösen als später in der Cloud.

Damit man mittels git push seine Anwendung zu Heroku hochladen kann benötigt man natürlich Git. Wie hier im Blog schon vorgestellt ist Github for Windows (oder Mac) mein bevorzugter Client. Ein neues Git-Repository kann man entweder über das GUI oder direkt in der Kommandozeile anlegen:

git init

Wichtig: Von nun an immer daran denken dass alle Änderungen auch in Git gespeichert werden müssen:

git add .
git commit -m "Start new git repository"

 

Nötige Anpassungen

Heroku setzt standardmässig auf die Datenbank PostgreSQL, während Rails für die Entwicklung SQLite nutzt. Will man auf allen Umgebungen auf PostgreSQL wechseln genügt es das Gem pg statt sqlite3 zu verwenden:

# gem 'sqlite3'
gem 'pg'

Oft möchte man aber nur auf dem Produktionssystem PostgreSQL nutzen. Damit beide Gems nebeneinander funktionieren und Heroku nicht meckert kann man das Gemfile so anpassen:

gem 'sqlite3', :group => :development
gem 'pg', :group => :production

Nun müssen nur noch die nötigen Pakete installiert und alle Änderungen in Git gespeichert werden:

bundle
git add . && git commit -m "use pg"

 

Heroku „aktivieren“

Als nächster Schritt muss die Anwendung bei Heroku registriert und die Datenbank aktiviert werden. All die Verknüpfungen und das Bereitstellen der Cloud-Umgebung werden durch diese beiden Befehle veranlasst:

heroku create
heroku addons:add heroku-postgresql

 

Ab in die Cloud

Nach all den Vorbereitungen kann man nun die Änderungen in die Cloud veröffentlichen:

git push heroku master

Nun bleibt nur noch ein letzter Schritt übrig. Wann immer man lokal die Datenbank migrieren musste ist dies auch in der Cloud nötig. Dazu führt man diesen Befehl aus:

heroku run rake --trace db:migrate

Wenn all dies ohne Fehler funktionierte kann man die durch Heroku zugewiesene URL der Anwendung aufrufen:

Rails App in der Cloud

Damit läuft die eigene Anwendung nun in der Cloud. Erweiterungen und Updates macht man lokal, checkt diese in Git ein und wiederholt die beiden Befehle in diesem Abschnitt.

 

Problembehandlung

Sollte doch einmal nicht alles so glatt laufen findet man die nötigen Hinweise zur Problembehandlung im Logfile. Dieses liegt ebenfalls auf Heroku und kann mit diesem Befehl geöffnet werden:

heroku logs

 

Fazit

Eine gewöhnliche Rails-Anwendung lässt sich mit wenigen Anpassungen für Heroku vorbereiten. Es braucht aber mehr als das hinzufügen des Remote-Repository damit die eigene Anwendung auch fehlerfrei in der Cloud läuft.

Hier kommt der Toolbelt von Heroku ins Spiel und kümmert sich um diese Lücken. Hat man einmal das eigene System eingerichtet ist der Mehraufwand um seine Anwendung zu veröffentlichen minimal. So richtig bewusst wird einem dies aber erst bei der 2. Anwendung, daher sollte man sich vor der einmaligen Konfiguration nicht abschrecken lassen.