[RUBY] Automatisez le déploiement

introduction

La procédure pour «utiliser le serveur AWS» est écrite en 5 parties.

Veuillez consulter les articles ci-dessous.

Configuration initiale de EC2Créer une base de données dans l'environnement de productionRails de démarrage de EC2Configurer le serveur WebAutomatiser le déploiement ← Imakoko

Automatisation du déploiement

Le travail de déploiement manuel (signifie démarrer le serveur à l'aide de la "commande unicorn_rails"), Vous permet de le faire avec une seule commande depuis votre terminal local. Pour cela, nous utilisons ce qu'on appelle un "outil de déploiement automatique".

Cette fois, nous allons introduire un outil de déploiement automatique appelé Capistrano.

Préparation à l'introduction

Installez Gem pour utiliser Capistrano dans Gemfile Puis regroupez l'installation dans le répertoire de l'application

group :development, :test do
  gem 'capistrano'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano3-unicorn'
end

Après avoir chargé la gemme, entrez la commande suivante

Terminal (local)

% bundle exec cap install

Le fichier est généré comme ci-dessous Image from Gyazo

Modifier Capfile

capfile

require "capistrano/setup"
require "capistrano/deploy"
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano3/unicorn'

Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }

Modifier production.rb

config/deploy/production.rb


server 'IP élastique préparé', user: 'ec2-user', roles: %w{app db web}

Modifier deploy.rb

Supprimez toute la description de deploy.rb et collez le code suivant Points d'attention "Version Capistrano" → décrit dans Gemfile.lock "Nom de l'application" "Nom d'utilisateur GitHub, nom du référentiel" "La version de ruby utilisée dans cette application" "Nom de la paire de clés propre"

config/deploy.rb


#Décrit la version de capistrano. Continuer à utiliser la version fixe et éviter les problèmes dus aux changements de version
lock 'Version Capistrano'

#Utilisé pour afficher les journaux Capistrano
set :application, 'Nom de l'application propre'

#Spécifiez à partir de quel référentiel extraire l'application
set :repo_url,  '[email protected]:Nom d'utilisateur Github/Nom du référentiel.git'

#Spécifiez un répertoire qui est couramment référencé même si la version change
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')

set :rbenv_type, :user
set :rbenv_ruby, 'La version de ruby utilisée dans cette application' #Si vous procédez selon l'article, «2.6.5’

#Quelle clé publique utiliser pour le déploiement
set :ssh_options, auth_methods: ['publickey'],
                                  keys: ['~/.ssh/Nom de la paire de clés propre.pem'] 

#Emplacement du fichier contenant le numéro de processus
set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" }

#Emplacement du fichier de configuration Unicorn
set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" }
set :keep_releases, 5

#Description du redémarrage de Unicorn une fois le processus de déploiement terminé
after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
  task :restart do
    invoke 'unicorn:restart'
  end
end

Une fois le déploiement automatique par Capistrano exécuté, le répertoire de l'application dans l'environnement de production change. Plusieurs répertoires sont créés, comme la sauvegarde d'applications avec Capistrano.

** Les trois suivants sont particulièrement importants **

`` répertoire des versions ''

Le «répertoire des versions» est une collection d'applications déployées via Capistrano. En conservant les anciennes applications ici, vous pouvez revenir à la version précédente même si quelque chose ne va pas pendant le déploiement. La description de "set: keep_releases" dans deploy.rb spécifie le nombre de fichiers enregistrés dans le passé. Cette fois, 5 sont configurés pour enregistrer la version précédente.

`` répertoire courant ''

Dans le "répertoire courant", le plus récent dans le dossier des versions est Il semble qu'il est copié automatiquement. En d'autres termes, "contenu actuellement déployé = contenu actuel".

`` répertoire partagé ''

Un répertoire qui stocke les répertoires qui sont couramment référencés même si la version change. Plus précisément, les répertoires log, public, tmp et vendor sont stockés.

Modifier le fichier de configuration Unicorn

Le répertoire de l'application Rails est plus volumineux lors du déploiement automatique que lors du déploiement manuel. C'est un pas de plus. Par conséquent, il est nécessaire d'apporter des modifications.

[Avant de modifier] config/unicorn.rb


#Placez le répertoire où le code de l'application sur le serveur est installé dans une variable
app_path = File.expand_path('../../', __FILE__)

#Déterminer les performances du serveur d'applications
worker_processes 1

#Spécifiez le répertoire dans lequel l'application est installée
working_directory app_path

#Spécifiez l'emplacement des fichiers requis pour démarrer Unicorn
pid "#{app_path}/tmp/pids/unicorn.pid"

#Spécifiez le numéro de port
listen 3000

#Spécifiez un fichier pour consigner les erreurs
stderr_path "#{app_path}/log/unicorn.stderr.log"

#Spécifiez un fichier pour enregistrer les journaux normaux
stdout_path "#{app_path}/log/unicorn.stdout.log"

(réduction)

[Après modification] config/unicorn.rb


# 「../Augmente de un
app_path = File.expand_path('../../../', __FILE__)

#Déterminer les performances du serveur d'applications
worker_processes 1

#Spécifiez "courant"
working_directory "#{app_path}/current"

#Changé pour faire référence à l'intérieur "partagé"
listen "#{app_path}/shared/tmp/sockets/unicorn.sock"

#Changé pour faire référence à l'intérieur "partagé"
pid "#{app_path}/shared/tmp/pids/unicorn.pid"

#Changé pour faire référence à l'intérieur "partagé"
stderr_path "#{app_path}/shared/log/unicorn.stderr.log"

#Changé pour faire référence à l'intérieur "partagé"
stdout_path "#{app_path}/shared/log/unicorn.stdout.log"
(réduction)

Modifier le fichier de configuration Nginx

Similaire au fichier de configuration d'Unicorn, comparé au déploiement manuel Les répertoires d'applications Rails sont une étape plus profonde lors du déploiement automatique. Par conséquent, il est nécessaire d'apporter des modifications.

Exécuter dans le terminal (dans EC2)

$ sudo vim /etc/nginx/conf.d/rails.conf

Modifier ci-dessous ① 3e ligne: modifiez en "~ nom de l'application / shared / tmp / ~" ② 14ème ligne: Ajoutez la ligne entière → root / var / www / nom de l'application / current / public; ③ 20e ligne: ajoutez toute la ligne → root / var / www / nom de l'application / current / public;

/etc/nginx/conf.d/rails.conf


upstream app_server {
  #Paramètres de liaison avec Unicorn
  server unix:/var/www/Nom de l'application/shared/tmp/sockets/unicorn.sock;
}

# {}La partie entourée s'appelle un bloc. Peut définir le serveur
server {
  #Numéro de port où ce programme accepte les connexions
  listen 80;
  #Demande d'URL pour accepter la connexion Impossible d'accéder avec l'URL non écrite ici
  server_name Elastic IP;

  #Définissez la taille maximale des fichiers téléchargés depuis le client sur 2 giga. La valeur par défaut est de 1 méga, alors gardez-la grande
  client_max_body_size 2g;

#Répertoire racine lors de la connexion
  root /var/www/Nom de l'application/current/public;

#fichier des actifs(Fichiers CSS et JavaScript, etc.)Paramètres appliqués lors de l'accès
  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    root /var/www/Nom de l'application/current/public;
  }

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  error_page 500 502 503 504 /500.html;
}

Une fois la saisie terminée, exécutez dans l'ordre "touche esc" → ": wq" et enregistrez. N'oubliez pas de recharger / redémarrer après avoir modifié les paramètres Nginx

Exécuter dans le terminal (dans EC2)

[ec2-user@ip-***-**-**-*** ~]$ sudo systemctl reload nginx
[ec2-user@ip-***-**-**-*** ~]$ sudo systemctl restart nginx

Confirmer le démarrage de la base de données

Si la base de données n'est pas démarrée, le déploiement échouera, vérifiez donc l'état de la base de données avec la commande suivante.

Exécuter dans le terminal (dans EC2)

[ec2-user@ip-***-**-**-*** ~]$ sudo systemctl status mariadb 

Si «actif» s'affiche comme indiqué ci-dessous, il est en cours d'exécution.

● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
   Active: active (running)depuis Kim 2020-07-17 03:46:51 UTC; 8s ago
  Process: 17044 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)
  Process: 17008 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
 Main PID: 17043 (mysqld_safe)
   CGroup: /system.slice/mariadb.service
           ├─17043 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
           └─17206 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --so...

Tuer le processus de licorne

Vous devez tuer le processus de la licorne avant le déploiement automatique. Si vous déployez automatiquement avec le serveur Unicorn déjà en cours d'exécution, Parce que vous devrez démarrer le serveur deux fois. (Le déploiement automatique joue également un rôle dans le lancement du serveur)

① Vérifiez le processus

[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$ ps aux | grep unicorn

ec2-user 17877  0.4 18.1 588472 182840 ?       Sl   01:55   0:02 unicorn_rails master -c config/unicorn.rb -E production -D
ec2-user 17881  0.0 17.3 589088 175164 ?       Sl   01:55   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
ec2-user 17911  0.0  0.2 110532  2180 pts/0    S+   02:05   0:00 grep --color=auto unicorn

② tuer le processus

#Dans l'exemple ci-dessus, "7877"
[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$numéro de processus de destruction

Transférer tous les correctifs locaux vers le maître

Assurez-vous que toutes les modifications du code local sont transmises à master. La préparation du déploiement automatique est maintenant terminée.

Effectuer un déploiement automatique

Revenez au terminal local et exécutez le déploiement automatique avec la commande suivante

#Exécuter dans le répertoire des applications
% bundle exec cap production deploy

Exécuter dans le terminal (dans EC2)

[ec2-user@ip-***-**-**-*** ~]$ sudo systemctl restart mariadb 
[ec2-user@ip-***-**-**-*** ~]$ sudo systemctl restart nginx

Vérifier avec le navigateur

Accès avec Elastic IP depuis un navigateur.


c'est tout. Je vous remercie pour votre travail acharné.

Recommended Posts

Automatisez le déploiement