Hoe Ruby On Rails Applicatie-implementaties te automatiseren met Capistrano

Inleiding


Als je nog niet genoeg hebt van het herhalen van dezelfde alledaagse taken om je toepassingsservers bij te werken om je project online te krijgen, zul je dat waarschijnlijk uiteindelijk wel zijn. De vreugde die je voelt tijdens het ontwikkelen van je project krijgt meestal een deuk wanneer het aankomt op de saaie aspecten van systeembeheer (bijv. het uploaden van je codebase, het aanpassen van configuraties, herhaaldelijk commando’s uitvoeren, enz.)

Maar vrees niet! Capistrano, de taakautomatiseringstool, is hier om te helpen.

In dit DigitalOcean-artikel gaan we een ijzersterke serverconfiguratie maken, waarbij de nieuwste versie van CentOS wordt gebruikt om Ruby-on-Rails-toepassingen te hosten met behulp van Nginx en Passenger. We zullen doorgaan met het leren hoe we het proces van implementaties – en updates – kunnen automatiseren met behulp van de op Ruby gebaseerde automatiseringstool Capistrano.

Opmerking: Dit artikel bouwt voort op de kennis uit ons vorige Capistrano-artikel: Automatisering van implementaties met Capistrano: aan de slag. Om een goede kennis van de tool te krijgen, wat ten zeerste wordt aanbevolen als je het gaat gebruiken, wordt aangeraden om het te lezen voordat je verder gaat met dit stuk. Op dezelfde manier, als je meer wilt weten over het voorbereiden van een nieuwe droplet voor het implementeren van Rails-applicaties met Passenger (en Nginx), bekijk dan het artikel Hoe Rails-apps te implementeren met Passenger en Nginx.

Opmerking: Capistrano is afhankelijk van Git voor implementaties. Om meer te leren, overweeg DigitalOcean community-artikelen over het onderwerp te lezen door hier te klikken hier.

Glossarium


1. Voorbereiden van de implementatieserver


  1. Het bijwerken en voorbereiden van het besturingssysteem
  2. Instellen van Ruby-omgeving en Rails
  3. Het downloaden en installeren van App. & HTTP-servers
  4. Het maken van het Nginx-beheerscript
  5. Het configureren van Nginx voor applicatie-implementatie
  6. Het downloaden en installeren van Capistrano
  7. Het aanmaken van een systeemgebruiker voor implementatie

2. Voorbereiden van Rails-toepassingen voor Git-gebaseerde Capistrano-implementatie


  1. Het maken van een basis Ruby-On-Rails-toepassing
  2. Het maken van een Git-opslagplaats

3. Werken met Capistrano om implementaties te automatiseren


  1. Het installeren van Capistrano binnen de projectmap
  2. Werken met config/deploy.rb binnen de projectmap
  3. Werken met config/deploy/production.rb binnen de projectmap
  4. Het implementeren naar de productieserver

Voorbereiden van de implementatieserver


Opmerking: Om een beter begrip te krijgen van de onderstaande sectie, die beschouwd kan worden als een uitgebreide samenvatting, bekijk het volledige artikel over het onderwerp: Hoe Rails-apps te implementeren met Passenger en Nginx.

Het bijwerken en voorbereiden van het besturingssysteem


Voer het volgende commando uit om de standaardtools van uw op CentOS gebaseerde ‘droplet’ bij te werken:

yum -y update

Installeer het bundel met ontwikkelingstools door het volgende commando uit te voeren:

yum groupinstall -y 'development tools'

Sommige van de pakketten die we nodig hebben voor deze tutorial (bijv. libyaml-devel, nginx etc.) zijn niet te vinden in de officiële CentOS-opslagplaats.

Voer het volgende uit om het EPEL-opslagplaats toe te voegen:

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

yum -y update

Tenslotte, om enkele aanvullende bibliotheken en tools te installeren, voer het volgende commando uit:

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

Het opzetten van de Ruby-omgeving en Rails


Opmerking: Deze sectie is een samenvatting van ons toegewijde artikel Hoe Ruby 2.1.0 te installeren op CentOS 6.5.

Voer de volgende twee commando’s uit om RVM te installeren en een systeemomgeving voor Ruby aan te maken:

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

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

Aangezien Rails een JavaScript-interpreter nodig heeft, moeten we ook Node.js instellen.

Voer het volgende uit om Node.js te downloaden en te installeren met yum:

yum install -y nodejs

Voer het volgende commando uit met RubyGems’ gem om rails te downloaden en te installeren:

gem install bundler rails

Downloaden en installeren van applicatie- en HTTP-servers


Let op: Als je VPS minder dan 1 GB RAM heeft, moet je de onderstaande eenvoudige procedure uitvoeren om een SWAP-schijfruimte aan te maken die kan worden gebruikt als tijdelijke gegevenshouder (RAM-vervanger). Aangezien DigitalOcean-servers worden geleverd met snelle SSD-schijven, vormt dit niet echt een probleem bij het uitvoeren van installatietaken voor servertoepassingen.

# Maak een SWAP-ruimte van 1024 MB aan
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap

Phusion Passenger


De standaard pakketbeheerder RPM (RPM Package Manager) van Red Hat Linux levert applicaties in .rpm-bestanden. Helaas zijn ze in het geval van Passenger behoorlijk verouderd. Daarom zullen we opnieuw RubyGem gebruiken om de nieuwste beschikbare versie van Passenger te downloaden en te installeren – versie 4.

Gebruik de onderstaande opdracht om eenvoudig Passenger te downloaden en te installeren:

gem install passenger

Nginx


Opmerking: Normaal gesproken kunt u Nginx downloaden en installeren door de EPEL-opslagplaats toe te voegen (zoals we al hebben gedaan) en Nginx via yum te verkrijgen. Om echter Nginx te laten werken met Passenger, moet de bron ervan worden gecompileerd met de benodigde modules.

Voer het volgende uit om Nginx te compileren met de native Passenger-module:

passenger-install-nginx-module

Zodra u de opdracht uitvoert, drukt u op Enter en bevestigt u uw keuze van taal(talen) (dat wil zeggen Ruby, in ons geval). U kunt de pijltoetsen en de spatiebalk gebruiken om alleen Ruby te selecteren, indien gewenst.

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

 ‣ ⬢  Ruby
   ⬢  Python
   ⬢  Node.js
   ⬡  Meteor

In de volgende stap kiest u Item 1:

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.

En druk op Enter om door te gaan.

Nu wordt de Nginx-bron gedownload, gecompileerd en geïnstalleerd met Passenger-ondersteuning.

Opmerking: Deze actie kan even duren – waarschijnlijk langer dan men zou willen of verwachten!

Het maken van het Nginx-beheerscript


Na het compileren van Nginx moeten we om het gemakkelijk te kunnen bedienen een eenvoudig beheerscript maken.

Voer de volgende commando’s uit om het script te maken:

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

Kopieer en plak de onderstaande inhoud:

#!/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

Druk op CTRL+X en bevestig met Y om op te slaan en af te sluiten.

Stel de modus van dit beheerscript in als uitvoerbaar:

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

Nginx configureren voor toepassingsimplementatie


In deze laatste stap van het configureren van onze servers moeten we een Nginx-serverblok maken, wat ruwweg overeenkomt met de virtuele hosts van Apache.

Zoals je je misschien herinnert van tijdens de installatie van Passenger voor Nginx, bestaat deze procedure uit het toevoegen van een blok code aan het configuratiebestand van Nginx, nginx.conf genaamd. Standaard, tenzij anders aangegeven, bevindt dit bestand zich onder /opt/nginx/conf/nginx.conf.

Type de volgende opdracht om dit configuratiebestand te openen om het te bewerken met de teksteditor nano:

nano /opt/nginx/conf/nginx.conf

Als eerste stap zoek je het knooppunt http { en voeg je het volgende toe direct na de passenger_root en passenger_ruby richtlijnen:

# Alleen voor ontwikkelingsdoeleinden.
# Verwijder deze regel wanneer je een daadwerkelijke toepassing uploadt.
# Alleen voor * TESTDOELEINDEN *.
passenger_app_env development;    

Blader door het bestand omlaag en zoek server { ... Comment de standaardlocatie uit, d.w.z. :

..

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

..

En definieer de standaardtoepassingsroot:

# Stel de map in waarin je je applicatie gaat implementeren.
# We gebruiken: /home/deployer/apps/my_app
root              /home/deployer/apps/my_app/public;
passenger_enabled on;

Druk op CTRL+X en bevestig met Y om op te slaan en af te sluiten.

Voer het volgende uit om Nginx te herladen met de nieuwe applicatieconfiguratie:

# !! Vergeet niet om een Nginx-beheerscript te maken
#    door het hoofdartikel over Rails-implementatie voor CentOS
#    te volgen dat aan het begin van dit gedeelte is gelinkt.

/etc/init.d/nginx restart

Om de status van Nginx te controleren, kun je het volgende gebruiken:

/etc/init.d/nginx status

Opmerking: Om meer te weten te komen over Nginx, raadpleeg Hoe Nginx-webserver te configureren op een VPS.

Capistrano Downloaden En Installeren


Zodra ons systeem klaar is, is het verkrijgen van de nieuwste versie van Capistrano via RubyGems een fluitje van een cent.

Je kunt eenvoudig de volgende opdracht gebruiken om Capistrano versie 3 te krijgen:

gem install capistrano

Een Systeemgebruiker Maken Voor Implementatie


In deze stap gaan we een CentOS-systeemgebruiker aanmaken om de handelingen van implementatie uit te voeren. Dit wordt de gebruiker die Capistrano zal gebruiken.

Opmerking: Om het eenvoudig te houden, gaan we een deployer-gebruiker aanmaken met de benodigde rechten. Voor een meer complete configuratie kun je het voorbeeld van de groepen gebruiken uit de introductietutorial van Capistrano.

Maak een nieuwe systeemgebruiker deployer aan:

adduser deployer

Stel het wachtwoord voor deployer in:

passwd deployer

# Voer een wachtwoord in
# Bevestig het wachtwoord

Bewerk /etc/sudoers met de teksteditor nano:

nano /etc/sudoers

Scroll naar beneden in het bestand en zoek waar root wordt gedefinieerd:

..

## Het gedeelte COMMANDS kan andere opties bevatten.
##
## Sta root toe om alle commando's overal uit te voeren
root    ALL=(ALL)	ALL

..

Voeg direct na root ALL=(ALL) ALL het volgende toe:

deployer ALL=(ALL) ALL

Dit gedeelte van het bestand /etc/sudoers zou er nu zo uit moeten zien:

..

## Het gedeelte COMMANDS kan andere opties bevatten.
##
## Sta root toe om alle commando's overal uit te voeren
root     ALL=(ALL)	ALL
deployer ALL=(ALL) ALL

..

Druk op CTRL+X en bevestig met Y om op te slaan en af te sluiten.

Voorbereiden van Rails-applicaties voor Git-gebaseerde Capistrano-implementatie


Zodra we ons systeem klaar hebben, met alle benodigde applicaties ingesteld en correct werken, kunnen we doorgaan met het maken van een voorbeeld Rails applicatie om te gebruiken als voorbeeld.

In de tweede fase gaan we een Git repository maken en de codebasis naar een centrale, toegankelijke locatie op Github pushen voor Capistrano om te gebruiken voor implementaties.

Opmerking: Hier maken we een voorbeeldapplicatie aan. Voor de werkelijke implementaties moet u deze handelingen uitvoeren nadat u ervoor heeft gezorgd dat alles is back-up – voor het geval dat! Let ook op dat u Capistrano moet uitvoeren vanaf een andere locatie dan de server waar de applicatie moet worden geïmplementeerd.

Het maken van een basis Ruby-On-Rails applicatie


Opmerking: De onderstaande stap is bedoeld om een vervangende Rails-applicatie te maken om Capistrano uit te proberen.

Met Ruby en Rails al geïnstalleerd, hebben we slechts één opdracht nodig om te beginnen.

Voer de volgende opdracht uit om Rails een nieuwe applicatie genaamd my_app te laten maken:

# Maak een voorbeeld Rails applicatie
rails new my_app

# Ga naar de applicatiemap
cd my_app

# Maak een voorbeeld resource
rails generate scaffold Task title:string note:text

# Maak een voorbeeld database
RAILS_ENV=development rake db:migrate

Om te controleren of je applicatie correct is ingesteld en alles goed werkt, ga naar de app-directory en start een eenvoudige server via rails s:

# Ga naar de applicatiemap
cd my_app

# Start een eenvoudige server
rails s

# Je zou er nu toegang toe moeten hebben door
# te bezoeken: http://[het IP-adres van je droplet]:3000

# Om het serverproces te stoppen,
# Druk op CTRL+C

Een Git-repository maken


Opmerking: Om meer te leren over werken met Git, bekijk de tutorial Hoe Git Effectief te Gebruiken op de DigitalOcean community pagina’s.

Opmerking: Om dit gedeelte te volgen, heb je een Github-account nodig. Als alternatief kun je een droplet instellen om je eigen Git-repository te hosten door dit DigitalOcean-artikel over het onderwerp te volgen. Als je ervoor kiest om dit te doen, zorg er dan voor dat je de relevante URL gebruikt in implementatiebestanden.

We gaan de voorbeeldinstructies gebruiken die worden geleverd door Github om een bronrepository te maken.

Voer de volgende, zelfverklarende commando’s uit binnen de my_app map om een repository te starten:

# !! Deze commando's moeten worden uitgevoerd op
#    uw ontwikkelingsmachine, vanwaar u zult
#    implementeren naar uw server.
#    Instructies kunnen iets verschillen, afhankelijk van
#    uw keuze van besturingssysteem.
#
#    Zorg ervoor dat u de juiste paden instelt voor de applicatie
#    Anders kan Nginx het niet vinden.

# Initialiseer het repository
git init

# Voeg alle bestanden toe aan het repository
git add .

# Commit de wijzigingen
git commit -m "first commit"

# Voeg uw Github-repositorylink toe 
# Voorbeeld: git remote add origin [email protected]:[gebruikersnaam]/[proj. naam].git
git remote add origin [email protected]:user123/my_app.git

# Maak een RSA/SSH-sleutel aan
# Volg de instructies op het scherm
ssh-keygen -t rsa

# Bekijk de inhoud van de sleutel en voeg deze toe aan uw Github
# door te kopiëren en te plakken vanuit de huidige externe sessie door
# te bezoeken: https://github.com/settings/ssh
# Voor meer informatie over het proces,
# bezoek: https://help.github.com/articles/generating-ssh-keys
cat /root/.ssh/id_rsa.pub

# Stel uw Github-informatie in
# Username:
# Gebruik: git config --global user.name "[uw gebruikersnaam]"
git config --global user.name "user123"

# Email:
# Gebruik: git config --global user.email "[uw e-mail]"
git config --global user.email "[email protected]"

# Duw de broncode van het project naar uw Github-account
git push -u origin master

Werken met Capistrano om implementaties te automatiseren


Zoals je je zult herinneren uit ons eerste artikel over Capistrano, is de manier om de bibliotheek te gaan gebruiken door deze te installeren binnen de projectdirectory. In dit gedeelte zullen we zien hoe dat moet, gevolgd door het aanmaken van bestanden die nodig zijn om servers in te stellen.

Capistrano installeren binnen de projectdirectory


Nog een eenvoudige stap in ons artikel is het installeren van de Capistrano-bestanden. Met het onderstaande commando wordt een aantal mappen en bestanden aangemaakt die door de tool gebruikt zullen worden voor de implementatie.

Voer het volgende uit om de Capistrano-bestanden te initialiseren (d.w.z. installeren):

cap install

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

Werken met config/deploy.rb binnen de projectdirectory


Het bestand deploy.rb bevat argumenten en instellingen die relevant zijn voor de implementatieserver(s). Hier vertellen we Capistrano naar welke server(s) we willen verbinden en implementeren, en hoe.

Opmerking: Bij het bewerken van het bestand (of het definiëren van de configuraties) kunt u ze ofwel uitcommentariëren of nieuwe regels toevoegen. Zorg ervoor dat u geen voorbeeldinstellingen heeft die de instellingen die u toevoegt overschrijven.

Voer het volgende uit om het bestand te bewerken met de nano teksteditor:

nano config/deploy.rb

Voeg het onderstaande codeblok toe en pas het aan om bij uw eigen instellingen te passen:

# Definieer de naam van de applicatie
set :application, 'my_app'

# Definieer waar Capistrano toegang heeft tot de bronrepository
# set :repo_url, 'https://github.com/[gebruikersnaam]/[applicatienaam].git'
set :scm, :git
set :repo_url, 'https://github.com/user123/my_app.git'

# Definieer waar je de code van je applicatie wilt plaatsen
set :deploy_to, "/home/deployer/apps/my_app"

set :pty, true

set :format, :pretty

# Stel hier de instructies na implementatie in.
# Zodra de implementatie is voltooid, zal Capistrano
# beginnen met het uitvoeren ervan zoals beschreven.
# Om meer te leren over het maken van taken,
# bekijk:
# http://capistranorb.com/

# namespace: implementeren doe

#   desc 'Herstart applicatie'
#   taak :herstarten doe
#     op rollen(:app), in: :sequentie, wacht: 5 doe
#       # Je herstartmechanisme hier, bijvoorbeeld:
#       executeer :aanraken, release_pad.join('tmp/herstart.txt')
#     end
#   end

#   na :publiceren, :herstarten

#   na :herstarten, :cache_legen doe
#     op rollen(:web), in: :groepen, limiet: 3, wacht: 10 doe
#       # Hier kunnen we van alles doen zoals:
#       # binnen release_pad doen
#       #   executeer :rake, 'cache:legen'
#       # end
#     end
#   end

# end

Druk op CTRL+X en bevestig met Y om op te slaan en af te sluiten.

Werken met config/deploy/production.rb binnen de projectmap


Opmerking: Net als bij deploy.rb, moet je enkele aanpassingen maken aan het bestand production.rb. Je kunt beter de code wijzigen dan het onderstaande blok toevoegen.

Voer het volgende uit om het bestand te bewerken met de nano teksteditor:

nano config/deploy/production.rb

Voer de instellingen van je server in, vergelijkbaar met het volgende:

# Definieer rollen, gebruiker en IP-adres van de implementatieserver
# rol: :naam, %{[gebruiker]@[IP-adres.]}
role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db,  %w{[email protected]}

# Definieer server(s)
server '162.243.74.190', user: 'deployer', roles: %w{web}

# SSH-opties
# Zie het voorbeeld dat uitgecommentarieerd is in het bestand
# voor meer opties.
set :ssh_options, {
    forward_agent: false,
    auth_methods: %w(password),
    password: 'user_deployers_password',
    user: 'deployer',
}

Druk op CTRL+X en bevestig met Y om op te slaan en af te sluiten.

Implementeren naar de productieserver


Zodra we klaar zijn met de instellingen, is het tijd om te implementeren.

Voer de volgende code uit op je ontwikkelmachine om naar de productieserver te implementeren. Zoals gedefinieerd in de bovenstaande bestanden, zal Capistrano:

  • Verbinding maken met de implementatieserver

  • Download de broncode van de applicatie

  • Voer de implementatieacties uit (bijv. laat Passenger de applicatie opnieuw opstarten)

cap production deploy

Om meer te weten te komen over Capistrano en wat het kan doen, overweeg het lezen van de Capistrano documentatie.

<div class=“auteur”>Ingediend door: <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