Wie man Ruby-On-Rails-Anwendungsbereitstellungen mithilfe von Capistrano automatisiert

Einführung


Wenn Sie noch nicht genug davon haben, die gleichen langweiligen Aufgaben zu wiederholen, um Ihre Anwendungsserver zu aktualisieren und Ihr Projekt online zu bringen, werden Sie es wahrscheinlich irgendwann sein. Die Freude, die Sie beim Entwickeln Ihres Projekts empfinden, neigt dazu, einen üblichen Rückschlag zu erleiden, wenn es um die langweiligen Teile der Systemadministration geht (z. B. das Hochladen Ihrer Codebasis, das Ändern von Konfigurationen, das Ausführen von Befehlen immer wieder usw.)

Aber keine Sorge! Capistrano, das Task-Automatisierungswerkzeug, ist hier, um zu helfen.

In diesem DigitalOcean-Artikel werden wir ein robustes Server-Setup erstellen, das die neueste Version von CentOS verwendet, um Ruby-on-Rails-Anwendungen mit Nginx und Passenger zu hosten. Wir werden damit fortfahren, zu lernen, wie man den Prozess von Bereitstellungen – und Updates – mithilfe des auf Ruby basierenden Automatisierungswerkzeugs Capistrano automatisiert.

Hinweis: Dieser Artikel baut auf dem Wissen aus unserem früheren Capistrano-Artikel auf: Bereitstellung automatisieren mit Capistrano: Erste Schritte. Um ein gutes Verständnis für das Werkzeug zu erlangen, was dringend empfohlen wird, wenn Sie es verwenden möchten, wird empfohlen, es vor der Fortsetzung dieses Beitrags zu lesen. Ebenso, wenn Sie mehr darüber erfahren möchten, wie man einen frischen Droplet für die Bereitstellung von Rails-basierten Anwendungen mit Passenger (und Nginx) vorbereitet, schauen Sie sich den Wie man Rails-Anwendungen mit Passenger und Nginx bereitstellt-Artikel an.

Hinweis: Capistrano verlässt sich auf Git für Bereitstellungen. Um mehr zu erfahren, lesen Sie DigitalOcean-Community-Artikel zu diesem Thema, indem Sie hier klicken.

Glossar


1. Vorbereiten des Bereitstellungsservers


  1. Das Betriebssystem aktualisieren und vorbereiten
  2. Einrichten der Ruby-Umgebung und Rails
  3. App und HTTP-Server herunterladen und installieren
  4. Erstellen des Nginx-Verwaltungsskripts
  5. Konfigurieren von Nginx für die Anwendungs bereitstellung
  6. Herunterladen und Installieren von Capistrano
  7. Erstellen eines Systembenutzers für die Bereitstellung

2. Vorbereiten von Rails-Anwendungen für die Git-basierte Capistrano-Bereitstellung


  1. Erstellen einer grundlegenden Ruby-On-Rails-Anwendung
  2. Erstellen eines Git-Repositories

3. Arbeiten mit Capistrano zur Automatisierung von Bereitstellungen


  1. Installieren von Capistrano im Projektverzeichnis
  2. Arbeiten mit config/deploy.rb im Projektverzeichnis
  3. Arbeiten mit config/deploy/production.rb im Projektverzeichnis
  4. Bereitstellung auf dem Produktions server

Vorbereiten des Bereitstellungsservers


Hinweis: Um einen besseren Überblick über den folgenden Abschnitt zu erhalten, der als ausführliche Zusammenfassung betrachtet werden kann, lesen Sie den vollständigen Artikel zu diesem Thema: Wie man Rails-Apps mit Passenger und Nginx bereitstellt.

Aktualisierung und Vorbereitung des Betriebssystems


Führen Sie den folgenden Befehl aus, um die Standardwerkzeuge Ihres auf CentOS basierenden Droplets zu aktualisieren:

yum -y update

Installieren Sie das Paket mit Entwicklungswerkzeugen durch Ausführen des folgenden Befehls:

yum groupinstall -y 'development tools'

Einige der Pakete, die wir für dieses Tutorial benötigen (z. B. libyaml-devel, nginx usw.), sind nicht im offiziellen CentOS-Repository zu finden.

Führen Sie das Folgende aus, um das EPEL-Repository hinzuzufügen:

sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'

yum -y update

Zum Schluss führen Sie den folgenden Befehl aus, um einige zusätzliche Bibliotheken und Werkzeuge zu installieren:

yum install -y curl-devel nano sqlite-devel libyaml-devel

Einrichten der Ruby-Umgebung und Rails


Hinweis: Dieser Abschnitt ist eine Zusammenfassung unseres dedizierten Artikels Wie man Ruby 2.1.0 auf CentOS 6.5 installiert.

Führen Sie die folgenden beiden Befehle aus, um RVM zu installieren und eine Systemumgebung für Ruby zu erstellen:

curl -L get.rvm.io | bash -s stable

source /etc/profile.d/rvm.sh
rvm reload
rvm install 2.1.0

Da Rails einen JavaScript-Interpreter benötigt, müssen wir auch Node.js einrichten.

Führen Sie Folgendes aus, um Node.js mit yum herunterzuladen und zu installieren:

yum install -y nodejs

Führen Sie den folgenden Befehl mit RubyGems‘ gem aus, um rails herunterzuladen und zu installieren:

gem install bundler rails

Herunterladen und Installieren von Anwendungs- & HTTP-Servern


Hinweis: Wenn Ihr VPS weniger als 1 GB RAM hat, müssen Sie das folgende einfache Verfahren durchführen, um einen SWAP-Festplattenspeicherplatz vorzubereiten, der als temporärer Datenträger (RAM-Ersatz) verwendet wird. Da DigitalOcean-Server über schnelle SSD-Festplatten verfügen, stellt dies bei der Durchführung von Installationsaufgaben für Serveranwendungen kein wirkliches Problem dar.

# Erstellen Sie einen 1024 MB SWAP-Speicherplatz
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap

Phusion Passenger


Red Hat Linux’s Standard-Paketmanager RPM (RPM Package Manager) liefert Anwendungen in .rpm-Dateien. Leider sind sie im Fall von Passenger ziemlich veraltet. Daher werden wir erneut RubyGem verwenden, um die neueste verfügbare Version von Passenger – Version 4 – herunterzuladen und zu installieren.

Verwenden Sie den folgenden Befehl, um Passenger einfach herunterzuladen und zu installieren:

gem install passenger

Nginx


Hinweis: Normalerweise können Sie Nginx herunterladen und installieren, indem Sie das EPEL-Repository hinzufügen (wie wir bereits getan haben) und Nginx über yum beziehen. Um jedoch Nginx mit Passenger zum Laufen zu bringen, muss dessen Quellcode mit den erforderlichen Modulen kompiliert werden.

Führen Sie zum Kompilieren von Nginx mit dem nativen Passenger-Modul folgendes aus:

passenger-install-nginx-module

Nachdem Sie den Befehl ausgeführt haben, drücken Sie Enter und bestätigen Sie Ihre Auswahl an Sprachen (in unserem Fall Ruby). Sie können die Pfeiltasten und die Leertaste verwenden, um nur Ruby auszuwählen, wenn Sie möchten.

Use <space> to select.
If the menu doesn't display correctly, ensure that your terminal supports UTF-8.

 ‣ ⬢  Ruby
   ⬢  Python
   ⬢  Node.js
   ⬡  Meteor

Wählen Sie im nächsten Schritt Element 1 aus:

1. Yes: download, compile and install Nginx for me. (recommended)
    The easiest way to get started. A stock Nginx 1.4.4 with Passenger
    support, but with no other additional third party modules, will be
    installed for you to a directory of your choice.

Und drücken Sie Enter, um fortzufahren.

Jetzt wird der Nginx-Quellcode heruntergeladen, kompiliert und mit Passenger-Unterstützung installiert.

Hinweis: Diese Aktion kann eine Weile dauern – wahrscheinlich länger als man es sich wünschen oder erwarten würde!

Erstellen des Nginx-Verwaltungsskripts


Nachdem Nginx kompiliert wurde, müssen wir zur einfachen Steuerung ein einfaches Verwaltungsskript erstellen.

Führen Sie die folgenden Befehle aus, um das Skript zu erstellen:

nano /etc/rc.d/init.d/nginx

Kopieren und fügen Sie den folgenden Inhalt ein:

#!/bin/sh
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
[ "$NETWORKING" = "no" ] && exit 0

nginx="/opt/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $”Reloading $prog: ”
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
    $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

Drücken Sie STRG+X und bestätigen Sie mit Y, um zu speichern und zu verlassen.

Setzen Sie den Modus dieses Verwaltungsskripts als ausführbar:

chmod +x /etc/rc.d/init.d/nginx

Konfiguration von Nginx für die Anwendungsbereitstellung


In diesem letzten Schritt der Konfiguration unserer Server müssen wir einen Nginx-Serverblock erstellen, der ungefähr den virtuellen Hosts von Apache entspricht.

Wie Sie sich vielleicht während der Nginx-Installation von Passenger erinnern, besteht dieses Verfahren darin, einen Codeblock zur Nginx-Konfigurationsdatei nginx.conf hinzuzufügen. Standardmäßig, sofern nicht anders angegeben, befindet sich diese Datei unter /opt/nginx/conf/nginx.conf.

Geben Sie den folgenden Befehl ein, um diese Konfigurationsdatei mit dem Texteditor nano zu öffnen:

nano /opt/nginx/conf/nginx.conf

Als ersten Schritt finden Sie den Knoten http { und fügen Sie das Folgende direkt nach den Direktiven passenger_root und passenger_ruby hinzu:

# Nur für Entwicklungszwecke.
# Entfernen Sie diese Zeile, wenn Sie eine tatsächliche Anwendung hochladen.
# Nur für * TESTZWECKE *.
passenger_app_env development;    

Scrollen Sie in der Datei nach unten und finden Sie server { ... Kommentieren Sie die Standardposition aus, d. h.:

..

#    location / {
#            root   html;
#            index  index.html index.htm;
#        }

..

Und definieren Sie Ihr Standardanwendungsverzeichnis:

# Legen Sie den Ordner fest, in dem Sie Ihre Anwendung bereitstellen werden.
# Wir verwenden: /home/deployer/apps/my_app
root              /home/deployer/apps/my_app/public;
passenger_enabled on;

Drücken Sie STRG+X und bestätigen Sie mit Y, um zu speichern und zu beenden.

Führen Sie folgendes aus, um Nginx mit der neuen Anwendungskonfiguration neu zu laden:

# !! Denken Sie daran, ein Nginx-Verwaltungsskript zu erstellen
#    indem Sie dem Hauptartikel zur Rails-Bereitstellung für CentOS
#    folgen, der am Anfang dieses Abschnitts verlinkt ist.

/etc/init.d/nginx restart

Um den Status von Nginx zu überprüfen, können Sie verwenden:

/etc/init.d/nginx status

Hinweis: Um mehr über Nginx zu erfahren, lesen Sie bitte Wie man den Nginx-Webserver auf einem VPS konfiguriert.

Herunterladen und Installieren von Capistrano


Sobald unser System bereit ist, ist es ein Kinderspiel, die neueste Version von Capistrano dank RubyGems zu bekommen.

Sie können einfach folgendes verwenden, um Capistrano Version 3 zu erhalten:

gem install capistrano

Erstellen eines Systembenutzers für die Bereitstellung


In diesem Schritt erstellen wir einen CentOS-Systembenutzer, um die Bereitstellung durchzuführen. Dies wird der Benutzer sein, den Capistrano verwenden wird.

Hinweis: Um die Dinge einfach zu halten, erstellen wir einen Benutzer namens deployer mit den erforderlichen Berechtigungen. Für eine umfassendere Einrichtung können Sie das Beispiel Gruppen aus dem Capistrano-Einführungstutorial verwenden.

Erstellen Sie einen neuen Systembenutzer deployer:

adduser deployer

Richten Sie das Passwort für deployer ein:

passwd deployer

# Geben Sie ein Passwort ein
# Bestätigen Sie das Passwort

Bearbeiten Sie /etc/sudoers mit dem Texteditor nano:

nano /etc/sudoers

Scrollen Sie in der Datei nach unten und finden Sie, wo root definiert ist:

..

## Der BEREICHSABSCHNITT kann um weitere Optionen ergänzt werden.
##
## Erlauben Sie root, beliebige Befehle überall auszuführen
root    ALL=(ALL)	ALL

..

Fügen Sie Folgendes direkt nach root ALL=(ALL) ALL hinzu:

deployer ALL=(ALL) ALL

Dieser Abschnitt der Datei /etc/sudoers sollte jetzt so aussehen:

..

## Der BEREICHSABSCHNITT kann um weitere Optionen ergänzt werden.
##
## Erlauben Sie root, beliebige Befehle überall auszuführen
root     ALL=(ALL)	ALL
deployer ALL=(ALL) ALL

..

Drücken Sie STRG+X und bestätigen Sie mit Y, um zu speichern und zu beenden.

Vorbereitung von Rails-Anwendungen für die Git-basierte Capistrano-Bereitstellung


Sobald wir unser System bereit haben, mit allen erforderlichen Anwendungen eingerichtet und korrekt funktionierend, können wir mit der Erstellung einer exemplarischen Rails-Anwendung fortfahren, die als Muster verwendet werden soll.

In der zweiten Phase werden wir ein Git-Repository erstellen und den Code-Stand an einen zentralen, zugänglichen Ort auf Github hochladen, den Capistrano für Bereitstellungen verwenden kann.

Hinweis: Hier erstellen wir eine Beispielanwendung. Für die tatsächlichen Bereitstellungen sollten Sie diese Aktionen selbst durchführen, nachdem Sie sichergestellt haben, dass alles gesichert ist – nur für den Fall! Beachten Sie auch, dass Sie Capistrano von einem anderen Ort als dem Server ausführen müssen, auf dem die Anwendung bereitgestellt werden soll.

Erstellen einer einfachen Ruby-On-Rails-Anwendung


Hinweis: Der folgende Schritt dient dazu, eine Ersatz-Rails-Anwendung zu erstellen, um Capistrano auszuprobieren.

Da Ruby und Rails bereits installiert sind, benötigen wir nur noch einen einzigen Befehl, um zu starten.

Führen Sie den folgenden Befehl aus, um Rails eine neue Anwendung namens my_app zu erstellen:

# Erstellt eine Beispiels-Rails-Anwendung
rails new my_app

# Wechselt in das Anwendungsverzeichnis
cd my_app

# Erstellt eine Beispiels-Ressource
rails generate scaffold Task title:string note:text

# Erstellt eine Beispieldatenbank
RAILS_ENV=development rake db:migrate

Um zu überprüfen, ob Ihre Anwendung richtig eingestellt ist und alles ordnungsgemäß funktioniert, geben Sie das Anwendungsverzeichnis ein und starten Sie einen einfachen Server über rails s:

# Geben Sie das Anwendungsverzeichnis ein
cd my_app

# Starten Sie einen einfachen Server
rails s

# Sie sollten jetzt darauf zugreifen können, indem Sie
# http://[Ihre Droplet-IP]:3000 besuchen

# Um den Serverprozess zu beenden,
# drücken Sie STRG+C

Ein Git-Repository erstellen


Hinweis: Um mehr über die Arbeit mit Git zu erfahren, schauen Sie sich das Tutorial So verwenden Sie Git effektiv auf den Community-Seiten von DigitalOcean an.

Hinweis: Um diesem Abschnitt zu folgen, benötigen Sie ein Github-Konto. Alternativ können Sie einen Droplet einrichten, um Ihr eigenes Git-Repository gemäß diesem DigitalOcean-Artikel zu hosten. Wenn Sie sich dafür entscheiden, stellen Sie sicher, dass Sie die relevante URL in den Bereitstellungsdateien verwenden.

Wir werden die Beispielanweisungen von Github verwenden, um ein Quellrepository zu erstellen.

Führen Sie die folgenden selbsterklärenden Befehle im Verzeichnis my_app aus, um ein Repository zu initiieren:

# !! Diese Befehle sind auszuführen auf
#    Ihrer Entwicklermaschine, von wo aus Sie
#    auf Ihren Server deployen werden.
#    Die Anweisungen können je nach
#    Betriebssystem leicht variieren.
#
#    Stellen Sie sicher, dass die Pfade für die Anwendung korrekt gesetzt sind,
#    sonst könnte Nginx sie möglicherweise nicht finden.

# Initialisiere das Repository
git init

# Füge alle Dateien zum Repository hinzu
git add .

# Committe die Änderungen
git commit -m "first commit"

# Füge deinen Github Repository Link hinzu 
# Beispiel: git remote add origin [email protected]:[Benutzername]/[Projektname].git
git remote add origin [email protected]:user123/my_app.git

# Erstelle einen RSA/SSH Schlüssel
# Folge den Anweisungen auf dem Bildschirm
ssh-keygen -t rsa

# Betrachte den Inhalt des Schlüssels und füge ihn zu deinem Github hinzu
# indem du ihn aus der aktuellen Remote-Sitzung kopierst und einfügst indem du
# besuchst: https://github.com/settings/ssh
# Um mehr über den Prozess zu erfahren,
# besuche: https://help.github.com/articles/generating-ssh-keys
cat /root/.ssh/id_rsa.pub

# Setze deine Github-Informationen
# Username:
# Nutzung: git config --global user.name "[dein Benutzername]"
git config --global user.name "user123"

# Email:
# Nutzung: git config --global user.email "[deine E-Mail]"
git config --global user.email "[email protected]"

# Pushe den Quellcode des Projekts auf dein Github-Konto
git push -u origin master

Arbeiten mit Capistrano zur Automatisierung von Bereitstellungen


Wie Sie sich aus unserem ersten Capistrano-Artikel erinnern werden, ist der Weg, die Bibliothek zu verwenden, indem Sie sie im Projektverzeichnis installieren. In diesem Abschnitt sehen wir, wie das geht, gefolgt von der Erstellung der für die Einrichtung von Servern erforderlichen Dateien.

Installation von Capistrano im Projektverzeichnis


Eine weitere einfache Schritt in unserem Artikel ist die Installation der Capistrano-Dateien. Der folgende Befehl wird einige Verzeichnisse und Dateien erstellen, die vom Tool für die Bereitstellung verwendet werden.

Führen Sie folgendes aus, um die Capistrano-Dateien zu initialisieren (d. h. zu installieren):

cap install

# mkdir -p config/deploy
# Erstellen config/deploy.rb
# Erstellen config/deploy/staging.rb
# Erstellen config/deploy/production.rb
# mkdir -p lib/capistrano/tasks
# Capified

Arbeiten mit config/deploy.rb innerhalb des Projektverzeichnisses


Die Datei deploy.rb enthält Argumente und Einstellungen, die für den Bereitstellungsserver relevant sind. Hier geben wir Capistrano an, mit welchen Server(n) wir uns verbinden und wie wir bereitstellen möchten.

Hinweis: Beim Bearbeiten der Datei (oder beim Definieren der Konfigurationen) können Sie sie entweder auskommentieren oder neue Zeilen hinzufügen. Stellen Sie sicher, dass nicht einige Beispieleinstellungen diejenigen überschreiben, die Sie hinzufügen.

Führen Sie folgendes aus, um die Datei mit dem nano-Texteditor zu bearbeiten:

nano config/deploy.rb

Fügen Sie den folgenden Codeblock hinzu und passen Sie ihn an Ihre eigenen Einstellungen an:

# Definieren Sie den Namen der Anwendung
set :application, 'my_app'

# Definieren Sie, wo Capistrano auf das Quellenrepository zugreifen kann
# set :repo_url, 'https://github.com/[Benutzername]/[Anwendungsname].git'
set :scm, :git
set :repo_url, 'https://github.com/user123/my_app.git'

# Definieren Sie, wo Sie Ihren Anwendungscode platzieren möchten
set :deploy_to, "/home/deployer/apps/my_app"

set :pty, true

set :format, :pretty

# Legen Sie die Post-Deployment-Anweisungen hier fest.
# Sobald die Bereitstellung abgeschlossen ist, wird Capistrano
# beginnen, sie wie beschrieben auszuführen.
# Um mehr über das Erstellen von Aufgaben zu erfahren,
# schauen Sie hier nach:
# http://capistranorb.com/

# namespace: deploy do

#   desc 'Anwendung neu starten'
#   task :restart do
#     auf rollen(:app), in: :sequenz, warte: 5 do
#       # Ihre Neustartmechanismus hier, zum Beispiel:
#       execute :touch, release_path.join('tmp/restart.txt')
#     end
#   end

#   nach :veröffentlichen, :restart

#   nach :neustart, :cache_leeren do
#     auf rollen(:web), in: :gruppen, limit: 3, warte: 10 do
#       # Hier können wir alles machen, wie zum Beispiel:
#       # innerhalb von release_path tun
#       #   execute :rake, 'cache:clear'
#       # end
#     end
#   end

# end

Drücken Sie STRG+X und bestätigen Sie mit Y, um zu speichern und zu beenden.

Arbeiten mit config/deploy/production.rb im Projektverzeichnis


Hinweis: Ähnlich wie bei deploy.rb müssen Sie einige Änderungen an der Datei production.rb vornehmen. Es ist besser, den Code zu ändern, anstatt den untenstehenden Block anzuhängen.

Führen Sie Folgendes aus, um die Datei mit dem Texteditor nano zu bearbeiten:

nano config/deploy/production.rb

Geben Sie die Einstellungen Ihres Servers ein, ähnlich wie unten gezeigt:

# Rollen, Benutzer und IP-Adresse des Bereitstellungsservers definieren
# Rolle :name, %{[Benutzer]@[IP-Adresse]}
role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db,  %w{[email protected]}

# Server definieren
server '162.243.74.190', user: 'deployer', roles: %w{web}

# SSH-Optionen
# Siehe den auskommentierten Abschnitt im Datei
# für weitere Optionen.
set :ssh_options, {
    forward_agent: false,
    auth_methods: %w(password),
    password: 'user_deployers_password',
    user: 'deployer',
}

Drücken Sie Strg+X und bestätigen Sie mit Y, um zu speichern und zu verlassen.

Bereitstellen auf dem Produktionsserver


Wenn wir mit den Einstellungen fertig sind, ist es Zeit zu bereitstellen.

Führen Sie den folgenden Code auf Ihrer Entwicklungsmaschine aus, um auf den Produktionsserver zu bereitstellen. Wie in den obigen Dateien definiert, wird Capistrano:

  • Mit dem Bereitstellungsserver verbinden

  • Lade die Anwendungsquelle herunter

  • Führe die Bereitstellungsschritte durch (z.B. Passenger neu starten die Anwendung)

cap production deploy

Um mehr über Capistrano und seine Funktionen zu erfahren, empfehlen wir das Lesen der Capistrano-Dokumentation.

<div class=“author”>Eingereicht von: <a
href=“https://twitter.com/ostezer”>O.S. Tezer</a></div>

Source:
https://www.digitalocean.com/community/tutorials/how-to-automate-ruby-on-rails-application-deployments-using-capistrano