Rails6 프로젝트 AWS EC2에 배포하기

Rails6 프로젝트 AWS EC2에 배포하기

AWS EC2 인스턴스(Ubuntu Server 18.04) 생성 및 Elastic IP 연결 후 ssh로 서버 접속

# 접근 권한 부여 # chmod 400 [pem key 경로] $ chmod 400 "~/rails_workspace/my-aws-pem.pem" # AWS 서버 접속 # ssh -i [pem key 경로] ubuntu@[public ip 주소] $ ssh -i ~/rails_workspace/my-aws-pem.pem [email protected]

환경 세팅

rbenv로 ruby 설치

$ sudo apt-get update $ sudo apt-get install build-essential # rbenv 설치 $ git clone https://github.com/rbenv/rbenv.git ~/.rbenv $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc $ echo 'eval "$(rbenv init -)"' >> ~/.bashrc $ source ~/.bashrc # rbenv 설치 확인 which rbenv # ruby 설치를 위한 플러그인 다운로드 $ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash $ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-doctor | bash rbenv install 2.7.3 # ruby 설치 # rbenv install [ruby version] $ rbenv install 2.7.3

이후 아래와 같은 오류가 발생했다.

/tmp/ruby-build.20210804134436.7485.FWbxST/ruby-2.7.3/lib/rubygems/core_ext/kernel_require.rb:83:in `require': cannot load such file -- openssl (LoadError)

https://github.com/rvm/rvm/issues/4764#issuecomment-624796884 의 방법으로 해결했다

다시 ruby 설치하려니 설치가 안 된 패키지가 있었는지 또 다른 오류 발생

ERROR: Ruby install aborted due to missing extensions

Try running `apt-get install -y zlib1g-dev` to fetch missing dependencies.

명령어 그대로 입력해서 패키지 설치 진행했다. 이후 ruby 설치가 정상적으로 진행되었다.

# ruby version 확인 $ rbenv versions # 특정 버전을 가리키도록 변경 # rbenv global [ruby version] $ rbenv global 2.7.3

Rails 설치

# Rails 설치 # gem install rails --version=[rails version] $ gem install rails --version=6.1.4

PostgreSQL 설치

$ sudo apt-get update $ sudo apt-get -y install libpq-dev postgresql postgresql-contrib

Ruby 컴파일을 위한 dependency 설치

# Node.js repository 추가 $ curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - # Yarn repository 추가 $ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - $ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list # Refresh packages list with the new repositories $ sudo apt-get update # Install our dependencies for compiiling Ruby along with Node.js and Yarn $ sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev software-properties-common libffi-dev dirmngr gnupg apt-transport-https ca-certificates redis-server redis-tools nodejs yarn

Bundler 설치

$ gem install bundler # bundler 설치 확인 $ bundle -v

nginx & passenger 설치

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7 $ sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list' $ sudo apt-get update $ sudo apt-get install -y nginx-extras libnginx-mod-http-passenger $ if [ ! -f /etc/nginx/modules-enabled/50-mod-http-passenger.conf ]; then sudo ln -s /usr/share/nginx/modules-available/mod-http-passenger.load /etc/nginx/modules-enabled/50-mod-http-passenger.conf ; fi $ sudo ls /etc/nginx/conf.d/mod-http-passenger.conf # passenger가 올바른 ruby version 가리키도록 수정해줘야 함 $ sudo vim /etc/nginx/conf.d/mod-http-passenger.conf

passenger_ruby 줄을 ubuntu에 설치한 ruby 경로로 지정해준다.

$ passenger-config about ruby-command

를 입력하면 알 수 있다. 복사해서 붙여넣으면 된다.

nginx 시작

$ sudo service nginx start

public ip주소로 사이트에 접속했을 때 아래와 같이 nginx 메인 페이지가 나오면 성공

Rails application을 위한 nginx 설정

# default nginx 설정 제거 $ sudo rm /etc/nginx/sites-enabled/default # sudo vim /etc/nginx/sites-enabled/[rails app name] # rails app name은 프로젝트의 config/deploy.rb에 설정한 대로 쓰기 # (set :application, "myaap" 인 경우 myapp) $ sudo vim /etc/nginx/sites-enabled/myapp

아래 내용 입력하기

server { listen 80; listen [::]:80; server_name _; root /home/ubuntu/[project name]/current/public; passenger_enabled on; passenger_app_env production; location /cable { passenger_app_group_name [project name]_websocket; passenger_force_max_concurrent_requests_per_process 0; } # Allow uploads up to 100MB in size client_max_body_size 100m; location ~ ^/(assets|packs) { expires max; gzip_static on; } }

production 이외 환경이라면 passenger_app_env 부분을 변경해주면 된다.

아래 사진에서 초록색 자리에 Rails 프로젝트 이름이 들어가면 된다.

# nginx.conf에 내용이 잘 입력되었는지 확인 $ sudo nginx -t # Restart server $ sudo service nginx reload

PostgreSQL database 설정

$ sudo su - postgres # createuser --pwprompt [username] $ createuser --pwprompt judy # createdb -O [username] [database name] $ createdb -O judy myapp_production $ exit # database에 접속 되는지 확인 # psql -U [username] -W -h 127.0.0.1 -d [database name] $psql -U judy -W -h 127.0.0.1 -d myapp_production

접속이 잘 되는 걸 확인한 후 빠져나오려면 \q 입력하면 된다.

SSH Keygen 설정

$ ssh-keygen

엔터 쳐서 3번 모두 skip

$ cat ~/.ssh/id_rsa.pub

출력된 key 복사 후 GitHub repository settings > Deploy keys > Add deploy key > 추가

production에 배포하기 (capistrano 이용)

$ bundle exec cap production deploy

참고자료

* https://kbs4674.tistory.com/190#chapter1

* https://gorails.com/deploy/ubuntu/18.04

from http://juyeonglee.tistory.com/37 by ccl(A) rewrite - 2021-08-05 17:26:18