Recette pour déployer des applications Rails sur AWS EC2

introduction

Après avoir créé une application personnelle dans Rails, j'oublie toujours comment le faire lors du déploiement sur AWS, alors j'aimerais l'écrire ici.

supposition

--Supposant Rails 5.2 ou supérieur

1. Création d'une instance EC2 / création d'une paire de clés

image.png

image.png

image.png

image.png Vous pouvez créer une nouvelle paire de clés ou une paire de clés existante. La paire de clés ne doit pas contenir d'espaces.

2. Liaison avec Elastic IP

image.png

image.png

image.png

image.png

3. Ouvrez le port

image.png

image.png

image.png

Définissez le type sur "HTTP", le protocole sur "TCP", la plage de ports sur "80" et la source sur "Custom / 0.0.0.0/0, :: / 0".

Ce qui suit est également publié afin que la connexion HTTP puisse être établie

image.png

image.png

image.png

4. Connectez-vous en tant qu'utilisateur EC2

local


$ cd ~

$ mkdir ~/.ssh
# .Créez un répertoire appelé ssh
#Même si vous obtenez une erreur indiquant que le fichier existe.Le répertoire ssh existe déjà, alors continuons.

$ mv Downloads/Le nom de la clé téléchargée.pem .ssh/
#Utilisez la commande mv pour télécharger le fichier pem à partir du répertoire de téléchargement..Accédez au répertoire ssh.

$ cd .ssh/

$ ls
#Vérifiez si le fichier pem existe

$chmod 600 Nom de la clé téléchargée.pem

$ ssh -i Le nom de la clé téléchargée.pem ec2-user@Adresse IP élastique associée à l'instance EC2 créée
#(Par exemple, Elastic IP est 123.456.Si c'est 789, ssh-i Le nom de la clé téléchargée.pem [email protected] commande est 789)
#(En utilisant la clé téléchargée, ec2-Connectez-vous en tant qu'utilisateur)

5. Paquets requis ・ Installez Ruby

serveur


[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y update
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install git make gcc-c++ patch libyaml-devel libffi-devel libicu-devel zlib-devel readline-devel libxml2-devel libxslt-devel ImageMagick ImageMagick-devel openssl-devel libcurl libcurl-devel curl
[ec2-user@ip-172-31-25-189 ~]$ sudo curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install nodejs
[ec2-user@ip-172-31-25-189 ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 
#Traverser
[ec2-user@ip-172-31-25-189 ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile 
#Description de l'appel à rbenv
[ec2-user@ip-172-31-25-189 ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
#.bash_Profil de charge
[ec2-user@ip-172-31-25-189 ~]$ source .bash_profile
#ruby-installer build
[ec2-user@ip-172-31-25-189 ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
#Faire rehash
[ec2-user@ip-172-31-25-189 ~]$ rbenv rehash  
[ec2-user@ip-172-31-25-189 ~]$ rbenv install 2.5.1
[ec2-user@ip-172-31-25-189 ~]$ rbenv global 2.5.1
[ec2-user@ip-172-31-25-189 ~]$ rbenv rehash  #Faire rehash
[ec2-user@ip-172-31-25-189 ~]$ ruby -v #Vérifier la version

#Installez MySQL
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install mysql56-server mysql56-devel mysql56
[ec2-user@ip-172-31-25-189 ~]$ sudo service mysqld start
[ec2-user@ip-172-31-25-189 ~]$ sudo /usr/libexec/mysql56/mysqladmin -u root password 'Le mot de passe que vous souhaitez définir ici'

#Vérifiez si vous pouvez entrer avec le PW défini dans MySQL
[ec2-user@ip-172-31-25-189 ~]$ mysql -u root -p

6. Enregistrez la clé SSH sur Github

Serveur EC2


[ec2-user@ip-172-31-23-189 ~]$ ssh-keygen -t rsa -b 4096

Vous pouvez être invité à entrer environ 3 étapes telles que la phrase de passe sur le chemin, mais veuillez continuer avec la touche Entrée sans rien entrer.

Serveur EC2


[ec2-user@ip-172-31-23-189 ~]$ cat ~/.ssh/id_rsa.pub

Accédez au Github et enregistrez la clé publique affichée par cat. https://github.com/settings/keys

image.png

Après avoir enregistré la clé dans Github, vérifiez si la connexion SSH est possible avec la commande suivante

Serveur EC2


[ec2-user@ip-172-31-23-189 ~]$ ssh -T [email protected]

7. Préparation de Capistrano

Gemfile


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

local


$ bundle install
$ bundle exec cap install

Modifier 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 }

config/deploy/production.rb


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

config/deploy.rb


# config valid only for current version of Capistrano
#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>' 

#Quelle clé publique utiliser pour le déploiement
set :ssh_options, auth_methods: ['publickey'],
                  keys: ['<Clé SSH pour l'instance EC2 sur PC local(pem)Chemin vers (par exemple~/.ssh/key_pem.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

set :linked_files, %w{ config/master.key }

after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
  task :restart do
    invoke 'unicorn:stop'
    invoke 'unicorn:start'
  end

  desc 'upload master.key'
  task :upload do
    on roles(:app) do |host|
      if test "[ ! -d #{shared_path}/config ]"
        execute "mkdir -p #{shared_path}/config"
      end
      upload!('config/master.key', "#{shared_path}/config/master.key")
    end
  end
  before :starting, 'deploy:upload'
  after :finishing, 'deploy:cleanup'
end

config/database.yml


production:
  <<: *default
  database: application_name_production
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

8. Paramètres du serveur d'applications (licorne)

Gemfile


group :production do
  gem 'unicorn', '5.4.1'
end

local


bundle install

config/unicorn.rb


app_path = File.expand_path('../../../', __FILE__)

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

#Changé pour faire référence à chacun dans partagé
listen "#{app_path}/shared/tmp/sockets/unicorn.sock"
pid "#{app_path}/shared/tmp/pids/unicorn.pid"
stderr_path "#{app_path}/shared/log/unicorn.stderr.log"
stdout_path "#{app_path}/shared/log/unicorn.stdout.log"

timeout 60

#Ce qui suit est un paramètre appliqué, donc l'explication est omise.

preload_app true
GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true

check_client_connection false

run_once = true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) &&
    ActiveRecord::Base.connection.disconnect!

  if run_once
    run_once = false # prevent from firing again
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exist?(old_pid) && server.pid != old_pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH => e
      logger.error e
    end
  end
end

after_fork do |_server, _worker|
  defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end

config/environments/production.rb (après modification)


# config.assets.js_compressor = :uglifier

9. Cloner le code de Github

Commençons par nous engager et pousser depuis GitHub Desktop. À ce stade, assurez-vous de le faire dans la branche principale.

serveur ec2


#Créez un nouveau répertoire avec la commande mkdir
[ec2-user@ip-172-31-23-189 ~]$ sudo mkdir /var/www/
#Autorisations Ec2 sur le répertoire www créé-Changer d'utilisateur
[ec2-user@ip-172-31-23-189 ~]$ sudo chown ec2-user /var/www/

image.png

serveur ec2


[ec2-user@ip-172-31-23-189 ~]$ cd /var/www/
[ec2-user@ip-172-31-23-189 www]$ git clone https://github.com/<Nom d'utilisateur>/<Nom du référentiel>.git

10. Paramètres Nginx

serveur ec2


#Installation
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install nginx

#Démarrer le fichier de configuration
[ec2-user@ip-172-31-25-189 ~]$ sudo vim /etc/nginx/conf.d/rails.conf

rails.conf


upstream app_server {
  #Changé pour faire référence à dans partagé
  server unix:/var/www/<Nom de l'application>/shared/tmp/sockets/unicorn.sock;
}

server {
  listen 80;
  server_name <Remplissez l'adresse IP élastique>;

#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;

  #Changé pour faire référence à dans le courant
  root /var/www/<Nom de l'application>/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    #Changé pour faire référence à dans le courant
    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;
}

serveur ec2


#Modifier les autorisations nginx
[ec2-user@ip-172-31-25-189 ~]$ cd /var/lib
[ec2-user@ip-172-31-25-189 lib]$ sudo chmod -R 775 nginx  
[ec2-user@ip-172-31-25-189 lib]$ cd ~
[ec2-user@ip-172-31-25-189 ~]$ sudo service nginx restart
#redémarrage de nginx
[ec2-user@ip-172-31-25-189 ~]$ sudo service nginx reload
[ec2-user@ip-172-31-25-189 ~]$ sudo service nginx restart

11. Extension de capacité EC2 / installation du bundler

serveur ec2


[ec2-user@ip-172-31-25-189 ~]$ cd
[ec2-user@ip-172-31-25-189 ~]$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512
[ec2-user@ip-172-31-25-189 ~]$ sudo chmod 600 /swapfile1
[ec2-user@ip-172-31-25-189 ~]$ sudo mkswap /swapfile1
[ec2-user@ip-172-31-25-189 ~]$ sudo swapon /swapfile1
[ec2-user@ip-172-31-25-189 ~]$ sudo sh -c 'echo "/swapfile1  none        swap    sw              0   0" >> /etc/fstab'

[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ gem install bundler -v x.x.x
#Présentez la version confirmée localement du bundler
[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ bundle install
#La commande ci-dessus peut prendre plusieurs minutes ou plus.

12. Définition des variables d'environnement

serveur ec2


[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ rake secret
69619d9a75b78f2e1c87ec5e07541b42f23efeb6a54e97da3723de06fe74af29d5718adff77d2b04b2805d3a1e143fa61baacfbf4ca2c6fcc608cff8d5a28e8d
#Copier la chaîne

serveur ec2


[ec2-user@ip-172-31-23-189 ~]$ sudo vim /etc/environment

/etc/environment


DATABASE_PASSWORD='Mot de passe de l'utilisateur root MySQL'
SECRET_KEY_BASE='Le secret que vous avez copié plus tôt_key_base'

Après l'écriture, appuyez sur échap (touche d'échappement) puis entrez: wq pour enregistrer le contenu. Une fois enregistré, déconnectez-vous pour appliquer les variables d'environnement.

local


$ ssh -i [Le nom de la clé téléchargée].pem ec2-user@[Adresse IP élastique associée à l'instance EC2 créée]
(En utilisant la clé téléchargée, ec2-Connectez-vous en tant qu'utilisateur)

serveur ec2


[ec2-user@ip-172-31-23-189 ~]$ env | grep SECRET_KEY_BASE
SECRET_KEY_BASE='secret_key_base'

[ec2-user@ip-172-31-23-189 ~]$ env | grep DATABASE_PASSWORD
DATABASE_PASSWORD='Mot de passe de l'utilisateur root MySQL'

serveur ec2


#Création d'une base de données d'environnement de production
[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ cd /var/www/nom de l'application/releases
[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ ll 
#Un dossier avec un nom numérique représentant la date s'affiche Exemple: 20200218063515
numéro inférieur du cd#=>Exemple cd 20200218063515
[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ rails db:create RAILS_ENV=production
# => Created database '<Nom de la base de données>'
[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ rails db:migrate RAILS_ENV=production

13. Déploiement automatique

Transférer toutes les modifications locales vers le maître

local


#Exécuter dans le répertoire de l'application
$ bundle exec cap production deploy

Comment vérifier le journal des erreurs Côté serveur Vérifiez / var / www / <nom du référentiel> / current / log / unicorn.stderr.log avec la commande less ou cat et vérifiez s'il y a des erreurs (plus le journal est bas, plus le journal est à jour. Notez que c'est UTC)

Recommended Posts

Recette pour déployer des applications Rails sur AWS EC2
Lancez EC2 Rails
Déployer RAILS sur EC2
Installer docker sur AWS EC2
[Rails] Conception de bases de données pour le site EC
Erreur lors du déploiement d'EC2 avec CircleCI
Lancer des rails sur EC2 (déploiement manuel)
[EC2 / Vue / Rails] Procédure de déploiement EC2 pour Vue + Rails
[Rails] Construction de l'environnement d'instance AWS EC2
Tutoriel 1 pour créer des applications avec Rails (Premiers pas pour Yay! Vous êtes sur Rails!)
Monter EFS sur Ubuntu EC2 sur AWS (amazon-efs-utils)
Déploiement facile avec Capistrano + AWS (EC2) + Rails
Essayez de déployer l'application Rails sur EC2-Part 1-
Connaissances requises pour intégrer les applications Rails à AWS
[Rails] Publication d'images par CarrierWave [AWS EC2]
Explication de Ruby sur rails pour les débutants ①
[Mémo personnel] Résumé des obstacles lors du déploiement des applications Rails sur AWS
Paramètres de validation pour la fonction de connexion Ruby on Rails
[Ruby on Rails] Mémo d'introduction Select2 pour Webpacker
[Rails] Procédure de liaison de bases de données avec Ruby On Rails
Vent arrière sur les rails
EC2 sur Docker-compose
Comment installer Ruby sur une instance EC2 d'AWS
Mémo pour créer un environnement Servlet sur EC2 d'AWS
Créer un environnement de développement Ruby on Rails sur AWS Cloud9
Déployer laravel à l'aide de docker sur EC2 sur AWS ① (Créer une instance EC2)
Explication de Ruby sur rails pour les débutants ⑥ ~ Création de validation ~
Une facture élevée d'AWS lors du développement sur rails ...
Explication de Ruby on rails pour les débutants ② ~ Création de liens ~
Explication de Ruby on rails pour les débutants ⑦ ~ Implémentation Flash ~