1. 배포
서버 설정을 마쳤으니 이제 실제 서버 배포 방법을 알아보자..
간혹가다 서버 배포설정을 안하고 ftp를 이용해 파일을 올린다던가 하는식으로 운영을 하는 경우가 있으나 상당히 위험하고 불편하다. 개인적으로 서버 배포 시스템은 필수로 구축해야 한다고 생각한다.
rails 배포 툴 중에 가장 잘 알려진 것이 capistrano 라는 gem 이다. 설정이 쉽고 다양한 플러그인을 지원한다. (예를 들면 옵션에 따라 배포시 db:migrate 를 자동으로 해주거나 데몬을 실행해주거나 하는등등) 현재 최신버전은 capistrano 3 이다.
capistrano + nginx + unicorn 조합인 경우 capistrano-unicorn-nginx 라는 플러그인이 있으니 그걸 함께 사용해보도록 하자.
2. 설정
- 로컬 프로젝트 GemFile 에 capistrano 와 capistrano-unicorn-nginx 추가 후 bundle 명령어로 gem 설치해보자
group :development do
gem 'capistrano', '~> 3.2.1'
gem 'capistrano-unicorn-nginx', '~> 3.2.0'
end
$bundle
이제 config/deploy/production.rb 에 적절히 설정값을 넣어준다.
server 'xxx.xxx.xxx.xxx(ip주소)', user: 'deployer', roles: %w{web app db}
set :nginx_server_name, 'fleamarkets.co.kr' #아직 도메인이 없는 경우 생략 가능
여기서 role 을 설정할때 db를 반드시 넣어줘야 서버 배포시 db migration 이 정상적으로 동작한다.
로컬 app config/database.yml db 설정은 빼먹지 말자.
production:
adapter: postgresql
database: fleamarket_production
encoding: unicode
host: localhost
pool: 5
username: fleamarket
password: xxxxxxxxx
timeout: 5000
Capfile 도 적절히 세팅해준다. db migration, asset pipeline 이 배포시 잘 동작하도록 설정해야한다. 나같은 경우 rbenv 로 루비 버전 관리를 하기 때문에 rbenv 플러그인도 포함시켜주었다.
# Load DSL and Setup Up Stages
require 'capistrano/setup'
# Includes default deployment tasks
require 'capistrano/deploy'
# Include plugin
require 'capistrano/unicorn_nginx'
require 'capistrano/bundler'
require 'capistrano/rbenv'
require 'capistrano/rails'
# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
만약 https 를 지원하고 싶으면 추가 적인 설정을 해줘야한다. https 를 지원하는 부분은 다음 포스팅에서 기본적인 부분만 다루도록할 예정이다.
자, 이제 거의 배포를 위한 준비가 완료된 상태이다.
capistrano-unicorn-nginx gem 의 경우 디폴트 배포 위치가 /var/www/app_name/ 안에 배포가 됨으로 미리 서버에 해당 디렉토리를 만들고 적절한 권한을 부여해야한다.
sudo mkdir /var/www/fleamarket
sudo chown deployer:admin /var/www/fleamarket/
bundle exec cap production setup
여기까지하면 잘되야하지만 실제로 해보니
sudo stdout: Nothing written
sudo stderr: sudo: no tty present and no askpass program specified
와 같은 에러를 뿜으며 종료되었다.
구글링을 해보니 sudo 명령어를 사용할때 deployer 유저인 경우 서버 password를 묻지 않도록 해야한다는 글이 있다.
특정 유저에게 sudo 권한을 주는건 간단하다.
sudo visudo
%admin ALL=(ALL) ALL 아래에
deployer ALL=(ALL:ALL) NOPASSWD:ALL 를 추가해주고 저장 해준다. editor 가 익숙하지 않다면 직접 vim을 이용해 sudoers 파일을 수정해줘도 된다.
수정시에 위치가 중요한데 어드민 설정 아래에 넣지 않으면 어드민이 NOPASSWD를 오버라이드해서 설정이 적용되지 않는다.
마지막으로 실서버 환경에 배포하려면 config/secret.yml 에 secret_key 를 세팅해줘야한다.
secret_key는 rake secret 명령어를 사용하면 자동으로 생성된다. 해당 값을 copy paste 로 붙여넣어준다. (실제 서버를 운영할때는 서버 환경 변수로 넣어주는 것이 보안상 좋다!)
production:
secret_key_base: xxxxxxx
secret_token: xxxxxxx
3. 배포
자 이제 드디어 최종 배포를 해본다.
bundle exec cap production deploy
이 과정에서 한번에 잘 되는경우도 있지만 다양한 에러가 나올 수 있다.
내 경우엔 rails asset precompile 과정중에 서버 메모리가 부족해서 process 가 kill 되는 문제가 있었다. 관련해서는 잘 정리된 thread를 참고하면된다.
성공적으로 deploy 됐다면 브라우져에 내 rails app이 잘 나오는지 확인해본다! Good!!