Dans cet article, nous allons voir comment déployer une application Laravel avec Capistrano sur votre serveur de production.
Vous venez de créer une application Web et vous prévoyez de la mettre en ligne.
Comment déployer automatiquement une application Laravel avec deployer
Cela peut être fait de plusieurs manières.
Nous allons passer par les étapes suivantes par exemple d’application Laravel mais cela peut être appliqué à n’importe quel autre langage ou technologie.
Déployer une application Laravel avec Capistrano
Dans le passé
Vous avez peut-être déjà mis certains sites Web en ligne dans le passé. Vous avez probablement utilisé un client FTP et téléchargé les bits et octets à la main.
Ou peut-être vous êtes-vous toujours connecté à votre serveur via ssh et avez extrait les modifications manuellement.
L’objectif
Notre objectif est de simplifier au maximum ce processus. L’idée est d’utiliser votre référentiel de code comme source pour chaque déploiement.
L’outil de déploiement, dans notre cas capistrano, se connectera automatiquement à votre serveur et construira votre système directement à partir de votre référentiel.
Ce dont vous aurez besoin
Pour déployer une application Laravel avec capistrano, nous avons besoin de quelques réglages et configurations:
- Sur votre serveur distant
Votre serveur distant doit fournir un accès SSH. Il devrait également avoir installé toutes les dépendances nécessaires à votre projet telles que GIT, PHP, MySQL, Composer, … En plus de cela, vous n’avez besoin d’aucun logiciel supplémentaire sur votre serveur de production.
- Sur votre ordinateur local
Pour installer et utiliser capistrano, vous avez besoin d’au moins Ruby 1.9 (si vous n’avez pas installé Ruby, je vous recommande de l’installer en utilisant rbenv).
Pour installer capistrano, il vous suffit d’exécuter:
$ gem install capistrano
Alors pourquoi capistrano, demandez-vous. Comme toujours, il existe de nombreuses façons d’accomplir une tâche, mais dans mon cas, capistrano a toujours semblé être l’approche la plus simple et la plus flexible.
Vous pouvez le configurer selon tous vos besoins et il existe de nombreux plugins qui simplifient à nouveau votre travail.
Capistrano est un utilitaire et un framework pour exécuter des commandes en parallèle sur plusieurs machines distantes, via SSH. Il utilise un DSL simple (emprunté en partie à Rake) qui vous permet de définir des tâches, qui peuvent être appliquées à des machines dans certains rôles.
Il prend également en charge les connexions de tunnel via une machine passerelle pour permettre aux opérations d’être effectuées derrière les VPN et les pare-feu.
Maintenant, nous avons tout ce dont nous avons besoin, alors configurons nos paramètres de déploiement.
Mais d’abord, nous devons créer un dossier sur le serveur distant où tous les fichiers doivent être déployés.
Connectez-vous à votre serveur avec SSH et créez un dossier. Un endroit commun est /var/www/. Alors faisons ceci:
$ sudo mkdir /var/www/my-app $ sudo chown -R username:group /var/www/my-app
C’est ça. Il n’y a plus rien à faire sur le serveur distant, vous pouvez donc fermer la connexion ssh et continuer. Allez dans votre projet (ou dans tout autre dossier, cela n’a pas d’importance pour le moment) et exécutez:
$ cd my-project $ cap install
Cette commande créera les fichiers de base dont nous avons besoin.
Après cela, votre dossier devrait ressembler à ceci.
. ├── Capfile ├── config │ ├── deploy │ │ ├── production.rb │ │ └── staging.rb │ └── deploy.rb └── lib └── capistrano └── tasks
Le fichier Capfile est comme le point de montage de capistrano, mais pour l’instant, nous aurons juste besoin d’éditer config/deploy.rb et config/deploy/production.rb.
Le premier fichier est responsable de toutes les étapes de construction, le second fichier représente un « environnement ».
Vous pouvez avoir plusieurs environnement comme la production, les tests …
Dans chaque fichier de configuration de environnement, vous pouvez spécifier votre (vos) serveur (s).
Ouvrons ces deux fichiers dans votre éditeur de texte préféré et remplaçons le contenu par les extraits de code suivants. Nous passerons en revue le code par la suite.
Nous allons commencer par config/deploy/production.rb:
role :app, %w{username@123.456.789.123} # EDIT your ssh username and server ip address set :ssh_options, { auth_methods: %w(password), password: "" # EDIT your ssh password }
Ensuite, nous modifierons config/deploy.rb:
set :application, "Your app name" # EDIT your app name set :repo_url, "https://github.com/laravel/laravel.git" # EDIT your git repository set :deploy_to, "/var/www/my-app" # EDIT folder where files should be deployed to namespace :deploy do desc "Build" after :updated, :build do on roles(:app) do within release_path do execute :composer, "install --no-dev --quiet" # install dependencies execute :chmod, "u+x artisan" # make artisan executable end end end desc "Restart" task :restart do on roles(:app) do within release_path do execute :chmod, "-R 777 app/storage/cache" execute :chmod, "-R 777 app/storage/logs" execute :chmod, "-R 777 app/storage/meta" execute :chmod, "-R 777 app/storage/sessions" execute :chmod, "-R 777 app/storage/views" end end end end
Vous devez maintenant mettre vos données dans chaque ligne avec un commentaire #EDIT (adresse IP, git repo, utilisateur ssh, mot de passe, etc.).
La variable :deploy_to doit être le dossier que nous venons de créer.
Votre serveur web (Apache, Nginx, …) doit pointer vers /var/www/my-app/current/public
Dans le bloc namespace :deploy du fichier deploy.rb, vous spécifiez ce qui doit réellement se passer pour chaque déploiement.
Il y a donc deux tâches. Dans la tâche de construction, nous installons mettre toutes vos dépendances PHP, comme vous y êtes habitué pendant le développement.
Après cela, nous rendons le fichier artisan exécutable afin de l’utiliser pour les migrations.
Dans la tâche de redémarrage, nous corrigeons les autorisations pour les dossiers de stockage.
Toutes ces tâches sont appelées dans l’ordre suivant. Vous pouvez vous connecter à chaque tâche si vous en avez besoin, mais pour l’instant, nous nous en tenons à notre configuration simple.
deploy:starting - start a deployment, make sure everything is ready deploy:started - started hook (for custom tasks) deploy:updating - update server(s) with a new release deploy:updated - updated hook deploy:publishing - publish the new release deploy:published - published hook deploy:finishing - finish the deployment, clean up everything deploy:finished - finished hook
Chaque déploiement est stocké dans /var/www/my-app/releases/.
La tâche intégrée deploy: publication crée un lien symbolique du déploiement récent vers le dossier actuel.
De cette façon, vous pouvez conserver les anciennes versions et changer de version sans vous déconnecter pendant une seconde. Lorsque cette tâche a été exécutée, votre dernière version est en ligne.
Déployer l’application
C’est donc le moment que vous attendiez. Le plus dur est fait. Pour l’instant, à chaque fois que vous souhaitez fournir les mises à jour de votre application, il vous suffit d’exécuter la commande magique suivante. Capistrano lira vos fichiers config/deploy.rb et config/deploy/production.rb et exécutera chaque tâche.
Si une tâche échoue, le déploiement s’arrêtera et l’ancienne version est toujours en ligne.
Vous pouvez facilement ajouter vos propres tâches si votre processus de génération nécessite des étapes supplémentaires.
Pour plus d’informations, je vous recommande de lire la documentation officielle.
Après ces étapes de configuration de base, nous sommes prêts pour notre premier déploiement.
$ cap production deploy
Vous verrez un tas de texte en sortie et après peu de temps (selon votre serveur) tout devrait être terminé. C’était facile, non?
Remarque: Pour l’instant, nous avons juste configuré notre environnement de production, mais vous pouvez remplacer la production par un autre environnement, par exemple votre serveur de test et exécuter $ cap staging deploy.
Quelques trucs supplémentaires
Sécurité
Peut-être serez-vous un peu inquiet si vous devez mettre votre mot de passe en clair dans le fichier de configuration.
J’ai juste choisi cette façon de rendre la démonstration aussi simple que possible, mais dans le monde réel, vous voudrez peut-être utiliser une clé SSH.
Vous pouvez en importer un comme ceci:
set :ssh_options, { keys: %w("/path/to/your/key.pem"), # EDIT your ssh key auth_methods: %w(publickey) }
Base de données
Pour l’instant, nous nous sommes simplement concentrés sur le déploiement des fichiers réels dans leur nouveau domicile, mais dans de nombreux scénarios, vous pouvez également faire quelque chose avec votre base de données.
Laravel a un outil parfait pour cela: les migrations. Vous pouvez simplement ajouter une nouvelle étape où vous exécutez ces migrations.
Après cela, notre tâche de construction pourrait ressembler à ceci:
desc "Build" after :updated, :build do on roles(:app) do within release_path do execute :composer, "install --no-dev --quiet" # install dependencies execute :chmod, "u+x artisan" # make artisan executable execute :php, "artisan migrate" # run migrations end end end
Vous devez également ajouter cette tâche dans le bloc de transaction de la tâche de mise à jour. Désormais, chaque fois que vous déployez, la base de données sera mise à jour avec vos dernières migrations.
Retour en arrière
Parfois, vous déployez une version non fonctionnelle de votre application et vous devez annuler ces modifications. Capistrano a une fonction intégrée pour cela appelée « rollback ».
Exécutez simplement:
$ cap production deploy:rollback
Conclusion
Vous venez d’apprendre une manière très simple comment déployer une application Laravel avec capistrano sur vos serveurs de production.
Une fois le travail de configuration terminé, il suffit d’une seule commande pour déployer votre dernière version en quelques secondes.
1 Comment