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.
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.
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.
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