Introduction
Si vous n’en avez pas encore assez de répéter les mêmes tâches monotones pour mettre à jour vos serveurs d’application afin de mettre votre projet en ligne, vous le serez probablement à un moment donné. La joie que vous ressentez en développant votre projet tend à diminuer lorsque vient le temps des tâches ennuyeuses d’administration système (par exemple, téléverser votre base de code, modifier des configurations, exécuter des commandes encore et encore, etc.)
Mais ne craignez rien ! Capistrano, l’outil d’automatisation des tâches, est là pour vous aider.
Dans cet article de DigitalOcean, nous allons créer une configuration de serveur robuste, exécutant la dernière version de CentOS pour héberger des applications Ruby-on-Rails en utilisant Nginx et Passenger. Nous continuerons en apprenant comment automatiser le processus de déploiement – et de mise à jour – en utilisant l’outil d’automatisation basé sur Ruby, Capistrano.
Remarque : Cet article s’appuie sur les connaissances de notre précédent article sur Capistrano : Automatisation des déploiements avec Capistrano : Premiers pas. Afin d’acquérir une bonne connaissance de l’outil, ce qui est fortement recommandé si vous prévoyez de l’utiliser, il est conseillé de le lire avant de continuer avec cet article. De même, si vous souhaitez en savoir plus sur la préparation d’une nouvelle gouttelette pour le déploiement d’applications basées sur Rails avec Passenger (et Nginx), consultez l’article Comment déployer des applications Rails en utilisant Passenger avec Nginx.
Remarque : Capistrano s’appuie sur Git pour les déploiements. Pour en savoir plus, consultez les articles de la communauté DigitalOcean sur le sujet en cliquant ici.
Glossaire
1. Préparation du serveur de déploiement
- Mise à jour et préparation du système d’exploitation
- Configuration de l’environnement Ruby et de Rails
- Téléchargement et installation des serveurs d’application et HTTP
- Création du script de gestion de Nginx
- Configuration de Nginx pour le déploiement d’application
- Téléchargement et installation de Capistrano
- Création d’un utilisateur système pour le déploiement
2. Préparation des applications Rails pour le déploiement Capistrano basé sur Git
- Création d’une application Ruby-On-Rails de base
- Création d’un dépôt Git
3. Travailler avec Capistrano pour automatiser les déploiements
- Installation de Capistrano à l’intérieur du répertoire du projet
- Travailler avec
config/deploy.rb
à l’intérieur du répertoire du projet - Travailler avec
config/deploy/production.rb
à l’intérieur du répertoire du projet - Déploiement sur le serveur de production
Préparation du serveur de déploiement
Remarque : Pour mieux comprendre la section ci-dessous, qui peut être considérée comme un résumé détaillé, consultez l’article complet sur le sujet : Comment déployer des applications Rails en utilisant Passenger avec Nginx.
Mise à jour et préparation du système d’exploitation
Exécutez la commande suivante pour mettre à jour les outils par défaut de votre gouttelette basée sur CentOS :
yum -y update
Installez le bundle contenant les outils de développement en exécutant la commande suivante :
yum groupinstall -y 'development tools'
Certains des paquets dont nous avons besoin pour ce tutoriel (par exemple libyaml-devel, nginx, etc.) ne sont pas disponibles dans le référentiel officiel de CentOS.
Exécutez ce qui suit pour ajouter le référentiel EPEL :
sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'
yum -y update
Enfin, pour installer certaines bibliothèques et outils supplémentaires, exécutez la commande suivante :
yum install -y curl-devel nano sqlite-devel libyaml-devel
Configuration de l’environnement Ruby et Rails
Remarque : Cette section est un résumé de notre article dédié Comment installer Ruby 2.1.0 sur CentOS 6.5.
Exécutez les deux commandes suivantes pour installer RVM et créer un environnement système pour Ruby :
curl -L get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
rvm reload
rvm install 2.1.0
Comme Rails nécessite un interpréteur JavaScript, nous devrons également configurer Node.js.
Exécutez ce qui suit pour télécharger et installer nodejs en utilisant yum
:
yum install -y nodejs
Exécutez la commande suivante en utilisant gem
de RubyGems pour télécharger et installer rails
:
gem install bundler rails
Téléchargement et Installation des Serveurs d’Applications & HTTP
Note: Si votre VPS dispose de moins de 1 Go de RAM, vous devrez effectuer la procédure simple ci-dessous pour préparer un espace de SWAP de manière à être utilisé comme support de données temporaire (substitut de RAM). Comme les serveurs DigitalOcean sont équipés de disques SSD rapides, cela ne pose pas vraiment de problème lors de l’exécution des tâches d’installation des applications serveur.
# Créez un espace SWAP de 1024 Mo
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap
Phusion Passenger
Le gestionnaire de paquets par défaut de Red Hat Linux, RPM (RPM Package Manager), expédie les applications contenues dans des fichiers .rpm
. Malheureusement, dans le cas de Passenger, ils sont assez dépassés. Par conséquent, nous utiliserons à nouveau RubyGem pour télécharger et installer la dernière version disponible de Passenger – version 4.
Utilisez la commande ci-dessous pour simplement télécharger et installer Passenger :
gem install passenger
Nginx
Remarque : Normalement, pour télécharger et installer Nginx, vous pourriez ajouter le dépôt EPEL (comme nous l’avons déjà fait) et obtenir Nginx via yum
. Cependant, pour que Nginx fonctionne avec Passenger, son code source doit être compilé avec les modules nécessaires.
Exécutez ce qui suit pour commencer à compiler Nginx avec le module Passenger natif :
passenger-install-nginx-module
Une fois que vous avez exécuté la commande, appuyez sur Entrée et confirmez votre choix de langage(s) (c’est-à-dire Ruby, dans notre cas). Vous pouvez utiliser les touches de direction et la barre d’espace pour sélectionner Ruby seul, si vous le souhaitez.
Use <space> to select.
If the menu doesn't display correctly, ensure that your terminal supports UTF-8.
‣ ⬢ Ruby
⬢ Python
⬢ Node.js
⬡ Meteor
A l’étape suivante, choisissez Élément 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.
Et appuyez sur Entrée pour continuer.
Maintenant, le code source de Nginx sera téléchargé, compilé et installé avec le support de Passenger.
Remarque : Cette action pourrait prendre un peu de temps – probablement plus longtemps que ce que l’on aimerait ou s’attendrait!
Création du script de gestion de Nginx
Après avoir compilé Nginx, afin de le contrôler plus facilement, nous devons créer un script de gestion simple.
Exécutez les commandes suivantes pour créer le script :
nano /etc/rc.d/init.d/nginx
Copiez et collez le contenu ci-dessous :
#!/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
Appuyez sur CTRL+X et confirmez avec Y pour enregistrer et quitter.
Définissez le mode de ce script de gestion comme exécutable :
chmod +x /etc/rc.d/init.d/nginx
Configuration de Nginx pour le déploiement d’applications
Dans cette dernière étape de configuration de nos serveurs, nous devons créer un bloc serveur Nginx, qui se traduit grossièrement par les hôtes virtuels d’Apache.
Comme vous vous en souvenez peut-être lors de l’installation de Passenger pour Nginx, cette procédure consiste à ajouter un bloc de code au fichier de configuration de Nginx nginx.conf
. Par défaut, sauf indication contraire, ce fichier se trouve sous /opt/nginx/conf/nginx.conf
.
Tapez la commande suivante pour ouvrir ce fichier de configuration afin de le modifier avec l’éditeur de texte nano :
nano /opt/nginx/conf/nginx.conf
En tant que première étape, trouvez le nœud http {
et ajoutez ce qui suit juste après les directives passenger_root
et passenger_ruby
:
# Uniquement à des fins de développement.
# Supprimez cette ligne lorsque vous téléchargez une application réelle.
# Uniquement à des fins de * TEST *.
passenger_app_env development;
Faites défiler le fichier et trouvez server { ..
. Commentez l’emplacement par défaut, c’est-à-dire :
..
# location / {
# root html;
# index index.html index.htm;
# }
..
Et définissez votre racine d’application par défaut :
# Définissez le dossier où vous déploierez votre application.
# Nous utilisons : /home/deployer/apps/my_app
root /home/deployer/apps/my_app/public;
passenger_enabled on;
Appuyez sur CTRL+X et confirmez avec Y pour enregistrer et quitter.
Exécutez ce qui suit pour recharger Nginx avec la nouvelle configuration de l’application :
# !! N'oubliez pas de créer un script de gestion de Nginx
# en suivant l'article principal sur le déploiement Rails pour CentOS
# lié au début de cette section.
/etc/init.d/nginx restart
Pour vérifier l’état de Nginx, vous pouvez utiliser :
/etc/init.d/nginx status
Note : Pour en savoir plus sur Nginx, veuillez vous référer à Comment Configurer le Serveur Web Nginx sur un VPS.
Téléchargement et Installation de Capistrano
Une fois que notre système est prêt, obtenir la dernière version de Capistrano, grâce à RubyGems, est un jeu d’enfant.
Vous pouvez simplement utiliser ce qui suit pour obtenir la version 3 de Capistrano :
gem install capistrano
Création d’un Utilisateur Système pour le Déploiement
À cette étape, nous allons créer un utilisateur système CentOS pour effectuer les actions de déploiement. Cela sera l’utilisateur que Capistrano utilisera.
Remarque : Pour simplifier les choses, nous allons créer un utilisateur deployer
avec les privilèges nécessaires. Pour une configuration plus complète, envisagez d’utiliser l’exemple de groupes dans le tutoriel d’introduction à Capistrano.
Créez un nouvel utilisateur système deployer
:
adduser deployer
Configurez le mot de passe de deployer
:
passwd deployer
# Entrez un mot de passe
# Confirmez le mot de passe
Modifiez /etc/sudoers
à l’aide de l’éditeur de texte nano
:
nano /etc/sudoers
Faites défiler le fichier et trouvez où root
est défini :
..
## La section COMMANDS peut avoir d'autres options ajoutées.
##
## Autoriser root à exécuter toutes les commandes n'importe où
root ALL=(ALL) ALL
..
Ajoutez ce qui suit juste après root ALL=(ALL) ALL
:
deployer ALL=(ALL) ALL
Cette section du fichier /etc/sudoers
devrait maintenant ressembler à ceci :
..
## La section COMMANDS peut avoir d'autres options ajoutées.
##
## Autoriser root à exécuter toutes les commandes n'importe où
root ALL=(ALL) ALL
deployer ALL=(ALL) ALL
..
Appuyez sur CTRL+X et confirmez avec Y pour enregistrer et quitter.
Préparation des applications Rails pour le déploiement Capistrano basé sur Git
Une fois que nous avons notre système prêt, avec toutes les applications nécessaires configurées et fonctionnant correctement, nous pouvons passer à la création d’une application Rails exemplaire à utiliser comme exemple.
Dans la deuxième étape, nous allons créer un dépôt Git et pousser la base de code vers un emplacement central et accessible sur Github pour que Capistrano puisse l’utiliser pour les déploiements.
Remarque : Ici, nous créons une application exemple. Pour les déploiements réels, vous devez effectuer ces actions par vous-même, après avoir vérifié que tout est sauvegardé – au cas où ! De plus, veuillez noter que vous devrez exécuter Capistrano à partir d’un emplacement différent de celui du serveur où l’application doit être déployée.
Création d’une application Ruby-On-Rails de base
Remarque : L’étape ci-dessous consiste à créer une application Rails de remplacement pour essayer Capistrano.
Avec Ruby et Rails déjà installés, il nous suffit d’une seule commande pour commencer.
Exécutez la commande suivante pour que Rails crée une nouvelle application appelée my_app:
# Créer une application Rails de démonstration
rails new my_app
# Accéder au répertoire de l'application
cd my_app
# Créer une ressource de démonstration
rails generate scaffold Task title:string note:text
# Créer une base de données de démonstration
RAILS_ENV=development rake db:migrate
Pour tester que votre application est correctement configurée et que tout fonctionne correctement, entrez dans le répertoire de l’application et lancez un serveur simple via rails s
:
# Entrez dans le répertoire de l'application
cd my_app
# Lancez un serveur simple
rails s
# Vous devriez maintenant pouvoir y accéder en visitant : http://[l'adresse IP de votre droplet]:3000
# Pour arrêter le processus du serveur, appuyez sur CTRL+C
Création d’un dépôt Git
Note : Pour en savoir plus sur l’utilisation de Git, consultez le tutoriel Comment utiliser Git efficacement sur les pages de la communauté DigitalOcean.
Note : Pour suivre cette section, vous aurez besoin d’un compte Github. Alternativement, vous pouvez configurer un droplet pour héberger votre propre dépôt Git en suivant cet article DigitalOcean sur le sujet. Si vous choisissez cette option, assurez-vous d’utiliser l’URL pertinente dans les fichiers de déploiement.
Nous allons utiliser les instructions d’exemple fournies par Github pour créer un dépôt source.
Exécutez les commandes suivantes, explicites, à l’intérieur du répertoire my_app
pour initier un dépôt :
# !! Ces commandes doivent être exécutées sur
# votre machine de développement, depuis laquelle vous allez
# déployer vers votre serveur.
# Les instructions peuvent varier légèrement en fonction de
# votre choix de système d'exploitation.
#
# Assurez-vous de définir les chemins corrects pour l'application
# sinon Nginx risque de ne pas pouvoir le localiser.
# Initialiser le dépôt
git init
# Ajouter tous les fichiers au dépôt
git add .
# Valider les modifications
git commit -m "first commit"
# Ajouter le lien de votre dépôt Github
# Exemple: git remote add origin [email protected]:[nom d'utilisateur]/[nom du projet].git
git remote add origin [email protected]:user123/my_app.git
# Créer une clé RSA/SSH
# Suivre les instructions à l'écran
ssh-keygen -t rsa
# Afficher le contenu de la clé et l'ajouter à votre Github
# en copiant-collant depuis la session à distance actuelle en
# visitant: https://github.com/settings/ssh
# Pour en savoir plus sur le processus,
# visitez: https://help.github.com/articles/generating-ssh-keys
cat /root/.ssh/id_rsa.pub
# Définir vos informations Github
# Username:
# Utilisation: git config --global user.name "[votre nom d'utilisateur]"
git config --global user.name "user123"
# Email:
# Utilisation: git config --global user.email "[votre email]"
git config --global user.email "[email protected]"
# Pousser le code source du projet vers votre compte Github
git push -u origin master
Travailler avec Capistrano pour automatiser les déploiements
Comme vous vous en souviendrez de notre premier article sur Capistrano, la façon de commencer à utiliser la bibliothèque est en l’installant à l’intérieur du répertoire du projet. Dans cette section, nous verrons comment le faire, suivi de la création des fichiers nécessaires pour configurer les serveurs.
Installer Capistrano à l’intérieur du répertoire du projet
Une autre étape simple dans notre article est l’installation des fichiers Capistrano. La commande ci-dessous va créer quelques répertoires et fichiers à utiliser par l’outil pour le déploiement.
Exécutez la commande suivante pour initier (c’est-à-dire installer) les fichiers Capistrano :
cap install
# mkdir -p config/deploy
# création de config/deploy.rb
# création de config/deploy/staging.rb
# création de config/deploy/production.rb
# mkdir -p lib/capistrano/tasks
# Capified
Travailler avec config/deploy.rb à l’intérieur du répertoire du projet
Le fichier deploy.rb
contient des arguments et des paramètres pertinents pour le(s) serveur(s) de déploiement. Ici, nous indiquerons à Capistrano vers quel(s) serveur(s) nous souhaitons nous connecter et déployer, et comment le faire.
Remarque : Lors de l’édition du fichier (ou de la définition des configurations), vous pouvez soit les commenter, soit ajouter de nouvelles lignes. Assurez-vous de ne pas avoir des paramètres d’exemple qui pourraient annuler ceux que vous ajoutez.
Exécutez la commande suivante pour éditer le fichier avec l’éditeur de texte nano
:
nano config/deploy.rb
Ajoutez le bloc de code ci-dessous, en le modifiant selon vos propres paramètres:
# Définissez le nom de l'application
set :application, 'my_app'
# Définissez où Capistrano peut accéder au dépôt source
# set :repo_url, 'https://github.com/[nom d'utilisateur]/[nom de l'application].git'
set :scm, :git
set :repo_url, 'https://github.com/user123/my_app.git'
# Définissez où mettre le code de votre application
set :deploy_to, "/home/deployer/apps/my_app"
set :pty, true
set :format, :pretty
# Définissez les instructions post-déploiement ici.
# Une fois le déploiement terminé, Capistrano
# les exécutera comme décrit.
# Pour en savoir plus sur la création de tâches,
# consultez:
# http://capistranorb.com/
# namespace: deploy do
# desc 'Redémarrer l'application'
# task :restart do
# sur les rôles(:app), dans: :séquence, attendre: 5 faire
# # Votre mécanisme de redémarrage ici, par exemple:
# execute :touch, release_path.join('tmp/restart.txt')
# end
# end
# après :publication, :restart
# après :restart, :clear_cache faire
# sur les rôles(:web), dans: :groupes, limite: 3, attendre: 10 faire
# # Ici, nous pouvons faire n'importe quoi tel que:
# # dans release_path faire
# # execute :rake, 'cache:clear'
# # end
# end
# end
# end
Appuyez sur CTRL+X et confirmez avec Y pour enregistrer et quitter.
Travailler avec config/deploy/production.rb dans le répertoire du projet
Note : Tout comme deploy.rb
, vous devrez apporter certaines modifications au fichier production.rb
. Il vaut mieux modifier le code plutôt que d’ajouter le bloc ci-dessous.
Exécutez la commande suivante pour modifier le fichier à l’aide de l’éditeur de texte nano
:
nano config/deploy/production.rb
Entrez les paramètres de votre serveur, similairement à ce qui suit :
# Définir les rôles, l'utilisateur et l'adresse IP du serveur de déploiement
# rôle :nom, %{[utilisateur]@[adresse IP]}
role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db, %w{[email protected]}
# Définir le(s) serveur(s)
server '162.243.74.190', user: 'deployer', roles: %w{web}
# Options SSH
# Voir la section d'exemple commentée dans le fichier
# pour plus d'options.
set :ssh_options, {
forward_agent: false,
auth_methods: %w(password),
password: 'user_deployers_password',
user: 'deployer',
}
Appuyez sur CTRL+X et confirmez avec Y pour enregistrer et quitter.
Déploiement sur le serveur de production
Une fois les paramètres configurés, il est temps de déployer.
Exécutez le code suivant sur votre machine de développement pour déployer sur le serveur de production. Comme défini dans les fichiers ci-dessus, Capistrano va :
-
Se connecter au serveur de déploiement
-
Téléchargez la source de l’application
-
Effectuez les actions de déploiement (c.-à-d. redémarrer l’application passager)
cap production deploy
Pour en savoir plus sur Capistrano et ce qu’il peut faire, envisagez de lire la documentation de Capistrano.
<div class=“author”>Soumis par : <a
href=“https://twitter.com/ostezer”>O.S. Tezer</a></div>