Ruby on Rails Vorbereitung fuer VServer
Inhaltsverzeichnis
Einen virtuellen Server für „Ruby on Rails“ vorbereiten
Einleitung
„Ruby on Rails“ ist schon seit vielen Jahre das Vorzeige-Webframework, an dem sich viele neu entstandene Frameworks orientieren. Mitte 2010 ist nun die neueste Version 3.0 mit einer großen Anzahl an Neuerungen erschienen. Im Folgenden möchte ich beschreiben, wie auf einem Ubuntu-basierenden virtuellen Server von netcup.de die notwendige Software für ein „Ruby on Rails“-Projekt installiert wird. Als Webserver wird Apache, als Datenbank MySQL und zur Versionsverwaltung GIT verwendet.
System
Zuerst werden die Paketquellen mittels aptitude aktualisiert.
sudo aptitude update sudo aptitude upgrade
Datenbank
Sollte noch keine MySQL-Datenbank installiert sein – das hängt vom Server-Image ab –, muss man Server und Client installieren.
sudo aptitude install mysql-server sudo aptitude install mysql-client
Bei der Installation des Servers wird automatisch ein Root-Account angelegt und noch während der Installation wird das Passwort für diesen abgefragt. Dieser hat aber nichts mit dem System-Root-Account zu tun. Danach werden über den MySQL-Client eine neue Datenbank (railsprojekt_production) und ein neuer User (railsuser) mit genügend Berechtigungen für das Rails-Projekt anlegt.
mysql -uroot -pgeheim mysql> CREATE DATABASE railsprojekt_production; mysql> GRANT ALL ON railsprojekt_production.* TO 'railsuser'@'localhost' IDENTIFIED BY 'auchgeheim';
Versionsverwaltung
Git ist ein Versionsverwaltungssystem ähnlich wie Mercurial oder Subversion. Gerade im Ruby-Umfeld erfreut es sich großer Beliebtheit. Es müssen nun alle nötigen Pakete installiert und ein Projekt-Repository in ~/git/railsprojekt.git für das Rails-Projekt erstellt werden. (In der Praxis wäre es aus Sicherheitsgründen sinnvoll, Versionsverwaltungssystem und Produktionsserver auf zwei Servern zu trennen.)
sudo aptitude install git-core mkdir -p ~/git/railsprojekt.git cd ~/git/railsprojekt.git git init --bare
Ruby
Ruby 1.9.1 ist ebenfalls (wie Rails 3) relativ neu und verfügt über deutlich verbesserte Performance, da deren Qualität lange ein Kritikpunkt war. Die Installation erfolgt ebenso über aptitude. Neben Ruby selbst sollten auch IRB, die interaktive Ruby Shell, hilfreich zum Debuggen, und der MySQL-Treiber installiert werden.
sudo aptitude --assume-yes install \ build-essential \ irb1.9.1 \ libmysql-ruby \ libmysql-ruby1.9.1 \ libreadline-ruby1.9.1 \ libruby1.9.1 \ rdoc \ rdoc1.9.1 \ ri \ ri1.9.1 \ ruby \ ruby1.9.1 \ ruby1.9.1-dev
Gem
Gems sind Softwarepakete, die einfach installiert werden können. Einen Großteil der Gems findet man auf github.com. Zur Verwaltung der Pakete (Suche, Installation, Update, Deinstallation) wird rubygems verwendet.
sudo aptitude install rubygems1.9.1
Ruby on Rails
Rails selbst wird über den eben installierten Gem-Installer installiert. Da sich die Versionen recht schnell ändern können, sollte man vorher einen Blick auf http://rubyonrails.org/ werfen. Es ist aber auch möglich, Rails sowie alle anderen Gem-Pakete gar nicht am Server zu installieren, sondern mittels „rake rails:freeze“ in der Rails-Anwendung selbst einzufrieren. Damit hat man die Sicherheit, dass das Projekt alle richtigen Versionen von Gems und Rails selbst hat.
Apache-Modul mod-rails
Der Apache-Webserver sollte auf dem Virtuellen-Server-Image von netcup.de schon vorinstalliert sein. Es fehlt nur noch das nötige Modul für Rails, gennant mod-rails oder passenger.
sudo gem install passenger sudo passenger-install-apache2-module
Am Ende der Installation sieht man die Beispielkonfigurationsdatei eines Virtuellen Hosts.
Caching mit memcached
Bei großen Anwendungen mit viel Web-Traffic empfiehlt sich ein Caching-Dienst. Ein sehr einfach aufzusetzender Dienst ist memcached, der auch von Rails gut unterstützt wird. Die Installation und der Betrieb von memcached ist sehr simpel.
sudo aptitude install memcached
Gestartet wird memcached mit
/etc/init.d/memcached start
Die Konfigurationsdatei befindet sich in /etc/memcached.conf. Man sollte kontrollieren, ob memcached nur auf das interne Interface (localhost) hört, damit niemand von außen Zugriff auf den Cache-Server hat.
Projektpflege mit Capistrano
Capistrano hilft beim Verwalten des Projekts, neudeutsch „deployen“. Es werden dabei Rezepte definiert, um z.B. den aktuellen Code aus dem Verwaltungssystem auszuchecken und am Produktionsserver zu aktualisieren oder die Datenbankstruktur zu ändern. Geht etwas schief, kann man ganz einfach auf den alten Stand zurücksetzen. Es ist ebenfalls möglich, eigene „Tasks“ zu definieren, um etwa Datenbankbackups lokal zu kopieren oder Skripte aufzurufen. Da Capistrano sehr mächtig ist, möchte ich auf die Website http://www.capify.org/ verweisen und an dieser Stelle nur anhand der Grundkonfiguration in deploy.rb für einen netcup-Server zeigen, wie mittels GIT-Repository geupdatet wird.
set :application, "railsprojekt" set :deploy_to, "/home/user/www/#{application}" set :deploy_via, :remote_cache set :scm, :git set :repository, "ssh://user@mein-netcupserver.de/home/user/git/railsprojekt.git" set :branch, "master" set :scm_username, "user" set :user, "user" set :ssh_options, { :forward_agent => true} set :use_sudo, false set :keep_releases, 4 role :web, "mein-netcupserver.de" role :app, "mein-netcupserver.de" role :db, "mein-netcupserver.de", :primary => true
Software-Wartungs-Tipps
Um per E-Mail Informationen über neue Pakete oder Sicherheitspatches zu bekommen, bietet sich apticron an. Dabei wird per Cron regelmäßig geprüft, ob neue Updates vorhanden sind und ein E-Mail an den User root geschickt.
sudo aptitude install apticron
Um Informationen über Updates für installierte Gems zu bekommen, verwende ich dieses kleine Ruby-Script, das als Cronjob eingetragen ist und ebenfalls ein E-Mail sendet.
require 'net/smtp' update = `gem outdate`.strip if update.size > 0 from_email = "from@example.org" to_email = "to@example.org" msg = <<MESSAGE From: #{from_email} <#{from_email}> To: #{to_email} <#{to_email}> Content-Type: text/plain; charset=UTF-8 Subject: neue GEM Updates gefunden #{update} MESSAGE Net::SMTP.start('example.org', 25) do |smtp| smtp.send_message msg, from_email, [to_email] end end
Eingesendet von Bernhard E.