J'ai utilisé Capistrano pour déployer ma propre application Rails.
En gros, j'ai fait référence à l'article suivant. (Édition Capistrano) Le commentaire AWS le plus poli au monde. Jusqu'à ce que vous apportiez l'application Rails à AWS à l'aide d'EC2
Dans cet article, j'ai résumé les parties remplies d'erreurs avec l'article de référence, j'espère donc que vous le trouverez utile.
Côté local
Côté serveur (EC2)
Gemfile Liste des gemmes à installer.
(local)Gemfile
group :development, :test do
 gem 'capistrano'
 gem 'capistrano-bundler'
 gem 'capistrano-rails'
 gem 'capistrano-rbenv'
end
group :production, :staging do
  gem 'unicorn'
end
D'autres documents peuvent utiliser le gem'capistrano3-unicorn ', mais il n'est pas utilisé ici pour les paramètres détaillés.
Capfile
Il s'agit du fichier de paramétrage pour l'ensemble du capistrano.
(local)Capfile
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
#Configuré pour lire le fichier qui décrit la tâche. Spécifiez l'emplacement et l'extension.
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
Dans l'article de référence, la dernière ligne est "~ / *. Rb", mais dans la version actuelle, rake est la valeur par défaut, alors utilisez-la.
Notez que le format de fichier lib / capistrano / tasks / unicorn.rake que vous créerez plus tard est **. Rake **. Faisons du format de fichier défini le même format de fichier. (Je suis un peu coincé ici.)
config/deploy/production.rb
Il s'agit d'un fichier qui décrit les paramètres de l'environnement de production.
(local)config/deploy/production.rb
#Décrivez l'adresse IP du serveur EC2, le nom d'utilisateur pour vous connecter au serveur EC2 et le rôle du serveur.
server '**.***.***.***', user: 'yuki', roles: %w[app db web]
#Décrivez les informations clés pour la connexion SSH au serveur à déployer
set :ssh_options, keys: '~/.ssh/app_key_rsa'
config/deploy.rb
Décrivez les paramètres qui s'appliquent à la fois à l'environnement de production et à l'environnement de stading.
(local)config/deploy.rb
#Version fixe de capistrano
lock '3.14.1'
#Nom de l'application à déployer
set :application, 'golfour'
#dépôt git à cloner
set :repo_url, '[email protected]:app/app_aws.git'
#La branche à déployer. Il n'est pas nécessaire que la valeur par défaut soit master.
set :branch, 'master'
#Le répertoire dans lequel effectuer le déploiement.
set :deploy_to, '/var/www/rails/app'
# secret_base_Ajouté pour lire la clé
set :linked_files, %w[config/master.key]
#Un fichier avec un lien symbolique.
set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/settings.yml', '.env')
#Un dossier avec des liens symboliques.
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system')
#Le nombre de versions à conserver. Enregistrez jusqu'à 5 historiques.
set :keep_releases, 5
#version rubis
set :rbenv_ruby, '2.5.1'
#Le niveau du journal à sortir.
set :log_level, :debug
namespace :deploy do
  desc 'Restart application'
  task :restart do
    invoke 'unicorn:restart'
  end
  desc 'Create database'
  task :db_create do
    on roles(:db) do |_host|
      with rails_env: fetch(:rails_env) do
        within current_path do
          execute :bundle, :exec, :rake, 'db:create'
        end
      end
    end
  end
  desc 'Run seed'
  task :seed do
    on roles(:app) do
      with rails_env: fetch(:rails_env) do
        within current_path do
          execute :bundle, :exec, :rake, 'db:seed'
        end
      end
    end
  end
  after :publishing, :restart
  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
    end
  end
end
Les deux codes suivants sont ajoutés en plus de l'article de référence.
Ici, vers des liens symboliques (fichiers que vous ne souhaitez pas ouvrir, comme la configuration dans gitignore)
# secret_base_Ajouté pour lire la clé
set :linked_files, %w[config/master.key]
#Un fichier avec un lien symbolique.
set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/settings.yml', '.env')
lib/capistrano/tasks/unicorn.rake
Un fichier qui décrit la tâche de configuration de la licorne.
(local)lib/capistrano/tasks/unicorn.rake
#Spécifiez le fichier pid de la licorne et le répertoire du fichier de configuration
namespace :unicorn do
  task :environment do
    set :unicorn_pid,    "#{current_path}/tmp/pids/unicorn.pid"
    set :unicorn_config, "#{current_path}/config/unicorn/production.rb"
  end
  #Méthode pour démarrer la licorne
  def start_unicorn
    within current_path do
      execute :bundle, :exec, :unicorn, "-c #{fetch(:unicorn_config)} -E #{fetch(:rails_env)} -D"
    end
  end
  #Méthode pour arrêter la licorne
  def stop_unicorn
    execute :kill, "-s QUIT $(< #{fetch(:unicorn_pid)})"
  end
  #Méthode pour redémarrer la licorne
  def reload_unicorn
    execute :kill, "-s USR2 $(< #{fetch(:unicorn_pid)})"
  end
  #Méthode pour tuer unicron
  def force_stop_unicorn
    execute :kill, "$(< #{fetch(:unicorn_pid)})"
  end
  #tâche pour démarrer la licorne
  desc 'Start unicorn server'
  task start: :environment do
    on roles(:app) do
      start_unicorn
    end
  end
  #tâche d'arrêter la licorne
  desc 'Stop unicorn server gracefully'
  task stop: :environment do
    on roles(:app) do
      stop_unicorn
    end
  end
  #Si la licorne est déjà en cours d'exécution, redémarrez-la, sinon, démarrez la tâche
  desc 'Restart unicorn server gracefully'
  task restart: :environment do
    on roles(:app) do
      if test("[ -f #{fetch(:unicorn_pid)} ]")
        reload_unicorn
      else
        start_unicorn
      end
    end
  end
  #tâche de tuer la licorne
  desc 'Stop unicorn server immediately'
  task force_stop: :environment do
    on roles(:app) do
      force_stop_unicorn
    end
  end
end
Comme je l'ai expliqué dans Capfile, veuillez noter qu'il s'agit d'unicorn.rake. S'il est défini dans .rb dans Capfile, ce sera unicorn.rb.
config/unicorn/production.rb Ceci est le fichier de configuration de la licorne.
(local)config/unicorn/production.rb
#Nombre de travailleurs. Voir ci-dessous
$worker = 2
#Décidez du nombre de secondes écoulées avant de supprimer le travailleur
$timeout = 30
#Notez que le nom de votre application, actuel, est joint.
$app_dir = '/var/www//rails/golfour/current'
#Spécifiez le numéro de port pour recevoir la demande. Voir ci-dessous
$listen = File.expand_path 'tmp/sockets/.unicorn.sock', $app_dir
#Répertoire des fichiers de gestion PID
$pid = File.expand_path 'tmp/pids/unicorn.pid', $app_dir
#Répertoire des fichiers qui crachent les journaux d'erreurs
$std_log = File.expand_path 'log/unicorn.log', $app_dir
#Défini de sorte que ce qui est défini ci-dessus soit appliqué
worker_processes  $worker
working_directory $app_dir
stderr_path $std_log
stdout_path $std_log
timeout $timeout
listen  $listen
pid $pid
#Définir s'il faut déployer à chaud
preload_app true
#Définissez ce qu'il faut faire avant la fourchette. Voir ci-dessous
before_fork do |server, _worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      Process.kill 'QUIT', File.read(old_pid).to_i
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end
#Définissez quoi faire après la fourchette. Voir ci-dessous
after_fork do |_server, _worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
shared/config/settings.yml
(server)shared/config/settings.yml
production:
  secret_key_base: jr934ugr89vwredvu9iqfj394vj9edfjcvnxii90wefjc9weiodjsc9o i09fiodjvcijdsjcwejdsciojdsxcjdkkdsv 
(#Collez le nombre aléatoire généré)
shared/config/database.yml
(server)shared/config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
  <<: *default
  database: golfour_development
  username: yuki
  password: password
  host: db
  socket: /tmp/mysql.sock
test:
  <<: *default
  database: golfour_test
  username: yuki
  password: password
  host: db-test
  socket: /tmp/mysql.sock
production:
  <<: *default
  database: <%= ENV['DB_NAME'] %>
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  host: <%= ENV['DB_HOSTNAME'] %>
shared/.env
Décrivez ici les variables d'environnement utilisées dans datacbase.yml.
(server)shared/.env
DB_NAME=*****
DB_USERNAME=*****
DB_PASSWORD=*****
DB_HOSTNAME=*****
/etc/nginx/conf.d/app.conf
conf:(server)/etc/nginx/conf.d/app.conf
#Paramètres de répertoire pour divers journaux
  error_log  /var/www/rails/mumu/current/log/nginx.error.log;
  access_log /var/www/rails/mumu/current/log/nginx.access.log;
#Capacité maximale pour recevoir le traitement
  client_max_body_size 2G;
  upstream app_server {
#Chemin de socket Licorne avec lequel travailler
    server unix:/var/www/rails/mumu/current/tmp/sockets/.unicorn.sock fail_timeout=0;
  }
  server {
    listen 80;
    server_name 127.0.0.1; #Changez pour votre propre adresse IP!
#Temps d'attente pour la prochaine requête (secondes)
    keepalive_timeout 5;
#Répertoire pour lire les fichiers statiques
    root /var/www/rails/mumu/current/public;
#Répertoire du cache
    try_files $uri/index.html $uri.html $uri @app;
    location @app {
      # HTTP headers
      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;
    }
#Où placer la page d'erreur
    error_page 500 502 503 504 /500.html;
    location = /500.html {
      root /var/www/rails/mumu/current/public;
    }
  }
bundle exec cap production deploy
Se produit après l'exécution d'un déploiement. Cela était dû à une mémoire insuffisante de EC2.
console
virtual memory exhausted
Il s'agit d'une méthode d'amplification de la mémoire afin qu'elle puisse être utilisée en déplaçant temporairement la mémoire inutilisée vers un autre emplacement. Si vous vous référez à l'article suivant, vous pouvez facilement l'implémenter, alors faites-le.
référence: Qu'est-ce qu'un fichier d'échange [Rails] Déployer sur EC2 avec Capistrano: dépanner EC2 à court de mémoire virtuelle
Missing secret_key_base for 'production' environment
Il s'agit également d'une erreur survenue lors de l'exécution du déploiement.
La cause était que le fichier master.key était manquant. Le secret_key_base est répertorié dans le fichier credentials.yml.enc en premier lieu. Cependant, ce fichier était chiffré et j'avais besoin de master.key pour le lire, mais j'obtenais une erreur car je ne l'avais pas.
・ Créer shared / master.key -Ajout de master.key au lien symbolique
Ce faisant, l'erreur a disparu.
Recommended Posts