Ruby on Rails

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

juyeong.lee 2021. 8. 5. 17:21
반응형

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 ubuntu@x.xx.xx.xxx

환경 세팅

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

 

 

반응형