on
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