Eine Rails-Anwendung deployen

Voraussetzungen

Um Ihre Rails-Anwendung auf einem entfernten Server zu deployen, können Sie das Tool Capistrano verwenden.

Um Capistrano einzusetzen, fügen Sie die folgenden Gems zu Ihrem Gemfile hinzu. Diese ermöglichen es, Bundler und die Rails Asset Pipeline zusammen mit Capistrano zu verwenden.

gem 'capistrano'
gem 'capistrano-bundler'
gem 'capistrano-rails'

Installieren Sie anschließend die Gems mittels Bundler.

$ bundle install

Diese Anleitung geht davon aus, dass Sie in Ihrer Rails-Anwendung den Rails Connector installiert haben. Beachten Sie bitte, dass Capistrano Deployments nur aus einem Git-Repository heraus ermöglicht. Stellen Sie daher bitte sicher, dass Ihr Projekt vor dem Deployment in einem vom Zielserver erreichbaren Git-Repository abgelegt wurde.

Konfiguration

Richten Sie Capistrano für Ihre Rails-Anwendung ein:

$ cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
Capified

Damit Capistrano Bundler und die Asset Pipeline verwenden kann, müssen die betreffenden Module im Capfile aktiviert werden. Kommentieren Sie hierfür die folgenden Zeilen ein:

require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'

Bearbeiten Sie anschließend die Datei meinProjekt/config/deploy.rb, die die allgemeine Konfiguration enthält:


set :application, '<em>meinProjekt</em>'
set :repo_url, '<em>Git-Repository-URL</em>'

set :deploy_to, '<em>Zielpfad</em>'

set :scm, :git

set :linked_files, %w{config/database.yml}

set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}

namespace :deploy do
  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      execute :touch, release_path.join('tmp/restart.txt')
    end
  end
  after :publishing, :restart
  after :restart, :clear_cache 
end

SSHKit.config.command_map[:rake] = "bundle exec rake"

Die beteiligten Server und deren Zugangsdaten können anschließend in der jeweiligen zu deployenden Umgebung konfiguriert werden. Dies wird hier am Beispiel der production-Umgebung gezeigt, also anhand der Datei config/deploy/production.rb. Für andere Umgebungen kann das Deployment analog dazu eingerichtet werden.

role :app, %w{Remote-Login@Production-App-Server}
role :web, %w{Remote-Login@Production-Web-Server}
role :db,  %w{Remote-Login@Production-DB-Server}

server 'Production-App-Server', user: 'Remote-Login', roles: %w{app}
server 'Production-Web-Server', user: 'Remote-Login', roles: %w{web}

set :ssh_options, {
    user: 'Remote-Login',
    auth_methods: %w(publickey)
}

Passen Sie die Konfiguration Ihren Bedürfnissen entsprechend an:

  • meinProjekt ist der Verzeichnisname Ihrer Rails-Anwendung.
  • Git-Repository-URL ist die Git-Repository-Adresse (git checkout) Ihrer Rails-Anwendung.
  • Zielpfad ist das Verzeichnis, in dem Ihre Rails-Anwendung auf dem Zielrechner deployt werden soll.
  • Remote-Login ist das Login, unter dem Ihre Rails-Anwendung auf dem Zielrechner deployt werden soll.
  • Production-App-Server ist der Name des Servers, über den die Applikation ausgeliefert wird.
  • Production-Web-Server ist der Name des Servers, über den die Applikation nach dem Deployment vom Internet aus erreichbar sein wird. Bei der Verwendung von Rails entspricht dies Ihrem App-Server.
  • Production-DB-Server ist der Name des Servers, auf dem die Datenbank der Applikation zur Verfügung steht.

Die Werte gesetzter Variablen können als Bestandteil anderer Werte genutzt werden. Wenn Sie beispielsweise den Projektnamen in der Repository-Adresse verwenden möchten, können Sie ihn folgendermaßen referenzieren: https://github.com/account/#{application}.

Beachten Sie bitte, dass in Ihrem Git-Repository ein zum Remote-Login passender Deploy Key hinterlegt worden sein muss, um dem Ziel-Server den Zugriff auf das Git-Repository zu ermöglichen.

Initiales Deployment

Bevor Sie Ihre Rails-Anwendung für ein Environment (hier als Beispiel production) deployen können, muss es auf dem Zielserver eingerichtet werden. Führen Sie hierzu bitte den folgenden Befehl aus:

$ cap production deploy:check

DEBUG[bc509946]   mkdir: created directory 'Zielpfad/meinProjekt/shared/bin'
DEBUG[bc509946]   mkdir: created directory 'Zielpfad/meinProjekt/shared/log'
DEBUG[bc509946]   mkdir: created directory 'Zielpfad/meinProjekt/shared/tmp'
DEBUG[bc509946]   mkdir: created directory 'Zielpfad/meinProjekt/shared/tmp/pids'
DEBUG[bc509946]   mkdir: created directory 'Zielpfad/meinProjekt/shared/tmp/cache'
DEBUG[bc509946]   mkdir: created directory 'Zielpfad/meinProjekt/shared/tmp/sockets'
DEBUG[bc509946]   mkdir: created directory 'Zielpfad/meinProjekt/shared/vendor'
DEBUG[bc509946]   mkdir: created directory 'Zielpfad/meinProjekt/shared/vendor/bundle'
DEBUG[bc509946]   mkdir: created directory 'Zielpfad/meinProjekt/shared/public'
DEBUG[bc509946]   mkdir: created directory 'Zielpfad/meinProjekt/shared/public/system'

Wenn alle Voraussetzungen erfüllt sind, können Sie Ihre Rails-Anwendung deployen:

$ cap production deploy

Wenn sich im Zuge eines Updates Ihrer Rails-Anwendung das Datenbankschema ändert, so verwenden Sie cap production deploy:migrations, um die Datenbank auf den aktuellen Stand zu bringen.

Kommandos für weitere Administrationsaufgaben

Capistrano bietet neben den oben beschriebenen Kommandos (Tasks) auch weitere für andere Administrationsaufgaben an. Sie können die verfügbaren Kommandos folgendermaßen ausgeben lassen:

$ cap -T

cap deploy                         # Deploy a new release
cap deploy:check                   # Check required files and directories exist

cap deploy:updated                 # Updated
cap deploy:updating                # Update server(s) by setting up a new release
cap install                        # Install Capistrano, cap install STAGES=staging,production