uycep2ed’s blog

IT関連のニュースで思ったこと感じたこと、プログラミングの勉強の備忘録を書いていきたいと思います。

AWSサーバーのデプロイのあれこれ

今回オリジナルアプリをAWSサーバーを使ってデプロイした時に、備忘録....

 

自動デプロ化の実装

Capistranoを使いました。

しよするためにまずはGemのインストール

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

※bundle installを忘れずに!

その後自分のアプリのディレクトリーで

bundle exec cap install

これで必要なファイルの作成ができました。

そのあとは、生成された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 }

デプロイに際して必要な動作がひととおり記述完了!

次にproduction.rbの編集

記述内容は、

サーバーホスト名(or IPアドレス)

AWSのサーバーへログインできるユーザー名

サーバーロール(後述)

sshの設定

その他サーバーに紐づく任意の設定

server '用意したElastic IP', user: 'ec2-user', roles: %w{app db web}

 次に、deploy.rbの編集

lock 'Capistranoのバージョン'

set :application, 'ご自身のアプリケーション名'

set :repo_url,  'git@github.com:Githubのユーザー名/レポジトリ名.git'

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, 'このアプリで使用しているrubyのバージョン' 

set :ssh_options, auth_methods: ['publickey'],
                                  keys: ['~/.ssh/ご自身のキーペア名.pem'] 

set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" }

set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" }
set :keep_releases, 5

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

Capistranoのバージョン確認はGemfile.lockで確認可能

 

ここまで完了したらunicorn.rbの編集

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

worker_processes 1

working_directory "#{app_path}/current" 

pid "#{app_path}/shared/tmp/pids/unicorn.pid"  

listen "#{app_path}/shared/tmp/sockets/unicorn.sock"

stderr_path "#{app_path}/shared/log/unicorn.stderr.log"

stdout_path "#{app_path}/shared/log/unicorn.stdout.log"
(省略)

 

次にNginvファイルの編集

EC2(ターミナル)で

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

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

  server unix:/var/www/アプリケーション名/shared/tmp/sockets/unicorn.sock;
}

server {
  listen 80;
  server_name Elastic IP;

  client_max_body_size 2g;

  root /var/www/アプリケーション名/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    root /var/www/アプリケーション名/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;
}

nginxを編集したら必ず再起動する。

$ sudo systemctl reload nginx
$ sudo systemctl restart nginx

ここまできたらあと少し!!!

$ sudo systemctl status mariadb 

でデータベースが起動しているか確認し、オッケーなら

Unicornのプロセスが起動しているので、

 ps aux | grep unicorn

でmainってやつの番号を確認、その後

kill プロセス番号

完了したらローカルで全てmasterにプッシュしているか確認して

ローカルのアプリケーションディレクトリーで

bundle exec cap production deploy

これで完了!

 

あとはローカルで修正したら場合は、その修正箇所によって少し違うが簡単にデプロイが可能になります。

 

ローカルで修正入れた場合

<状況自動デプロイ前にやること>

・ローカルでVSCodeを修正した場合変更点をリモートリポジトリにcommit→pushする

(本番環境でサーバー再起動をする場合)一度プロセスをkillした上で「bundle exec cap production deploy」


・ローカルでデータベース関連の内容を修正した場合本番環境で「rails db:drop RAILS_ENV=production」「rails db:create RAILS_ENV=production」を実行
(※実行する際、「DISABLE_DATABASE_ENVIRONMENT_CHECK=1」というオプションが必要)

(本番環境でサーバー再起動をする場合)一度プロセスをkillした上で「bundle exec cap production deploy」 

 

・Nginxを修正した場合「sudo systemctl restart nginx」を実行

 

うまくいかない時の確認場所

・ローカルでは問題なく動いているのか?
・ローカルからGiuHubへのpushのし忘れはないか(mergeできているか)
GitHubからEC2への反映(git pull origin master)のし忘れは?
・EC2サーバー側でエラーログの内容を確認し、原因を見つけたか?
・Nginxは正しく起動しているか?
・EC2サーバー側の環境変数は正しく設定できているか?
・EC2インスタンスの再起動を行ってみる