이 글에서는 Ruby on Rails 애플리케이션에 Capistrano를 설정하는 방법을 알아보겠습니다. 이후 Ubuntu 운영체제가 실행되는 클라우드 인스턴스에 앱을 배포할 텐데요, 이 과정은 호스팅 업체와 무관하게 진행됩니다. 어떤 클라우드 서비스든, 심지어 온프레미스 서버를 사용해서도 여기서 소개하는 단계들을 그대로 테스트하거나 재현할 수 있습니다.
앱 배포가 완료되면 AppSignal을 활용해 배포 현황을 모니터링하는 방법도 간단히 살펴보겠습니다.
그런데 본격적으로 시작하기 전에 궁금증이 생길 수 있습니다. 지금 와서 굳이 Capistrano를 써야 할까요?
Ruby on Rails 앱에서 Capistrano를 선택해야 하는 이유
요즘은 배포와 CI(지속적 통합)에 사용할 수 있는 도구와 서비스가 워낙 많아서, Capistrano를 계속 사용하는 것이 여전히 의미가 있는지 고민될 수 있습니다.
이 질문에 답하려면 Capistrano의 탄생 배경과 현재까지의 발전 과정을 되짚어볼 필요가 있습니다. Capistrano 저장소의 첫 번째 태그는 2006년에 생성되었습니다. 당시 목표는 DSL을 사용해 SSH를 통해 여러 머신에서 명령어를 병렬로 원격 실행하는 것이었죠. 그 후 Capistrano는 버전이 거듭되며 다양한 기능을 추가하며 발전해왔습니다.
16년이 지난 지금 버전 3까지 도달한 Capistrano는 여전히 활발히 개발되고 있으며, 이제는 자동화된 배포 스크립트를 구축하기 위한 프레임워크로 자리 잡았습니다.
다시 말해, 더 이상 단순히 원격 머신에서 명령어만 실행하는 도구가 아니라는 뜻입니다. Capistrano 자체의 기능 외에도 Capistrano와 함께 동작하도록 만들어진 수많은 플러그인과 젬(gem)들이 존재합니다.
이러한 이유들과 여전히 큰 커뮤니티가 Capistrano를 사용하고 있다는 점을 고려하면, 자동화 배포 도구로서 여전히 훌륭한 선택지라고 할 수 있습니다.
Ruby on Rails 앱에 Capistrano 추가하기
먼저 Ruby on Rails 애플리케이션을 Capistrano와 통합하도록 설정해야 합니다. 공식 문서를 참고할 수도 있지만, 문서에는 이 글의 범위를 넘어서는 내용까지 담겨 있습니다. 따라서 이 글에서는 실제로 필요한 단계와 설정만 간결하게 정리해서 소개하겠습니다.
설정을 시작하려면 Gemfile의 development 섹션에 Capistrano 젬을 추가하세요:
capistrano-rails 젬은 데이터베이스 마이그레이션 실행과 에셋 처리에 필요합니다. 자세한 내용은 다음 섹션에서 다룹니다.
이제 bundle install을 실행해 애플리케이션에 Capistrano를 추가합니다:
그다음 Capistrano를 설치합니다:
이 명령어는 필요한 라이브러리를 불러오고 설정하는 Capfile이라는 파일을 생성합니다. 또한 config 폴더 안에 deploy.rb 파일이 생성되는데, Capistrano로 배포할 때 필요한 모든 설정이 이 파일에 들어갑니다.
참고: Capistrano는 staging과 production 환경별로 deploy.rb 설정을 덮어쓰기 위한 파일도 생성하지만, 이 글에서는 다루지 않습니다.
여기까지 완료했다면, 이제 Rails 애플리케이션과 서버 간의 통신을 위한 설정을 시작할 준비가 된 것입니다.
Capistrano를 활용한 Rails 앱 서버 설정
이 단계에서는 Capistrano 설정 파일에 서버 관련 지침을 추가합니다. 앱이 어디에 배포될지 서버에 전달하고, 접근 정보와 보안 설정을 정의하는 작업입니다.
프로덕션 환경에서 개발 환경과 동일한 버전의 Ruby가 실행되도록 하려면 RVM이나 rbenv 같은 Ruby 버전 관리자를 사용하세요(Capistrano는 두 가지 모두 지원합니다).
이 글에서는 RVM을 사용하겠습니다. 개발 머신과 프로덕션 서버 양쪽에 RVM이 설치되어 있는지 확인하고, 각 환경과 프로젝트의 Ruby 버전이 일치하는지도 점검하세요.
capistrano-rvm 젬 추가하기
Capistrano 프로젝트는 RVM을 손쉽게 설정할 수 있는 capistrano-rvm 젬을 제공합니다. 프로젝트에 포함하려면 Gemfile의 development 그룹에 추가한 뒤 bundle install을 다시 실행하세요.
Capfile에 capistrano-rvm 임포트 구문을 추가합니다:
배포 파일에는 Ruby 버전과 RVM 경로(특히 기본 경로가 아닌 곳에 RVM을 설치한 경우)를 지정하는 설정을 추가하세요.
Ruby 버전을 별도로 지정하지 않으면, Capistrano는 배포 대상 서버에 설치된 최신 버전을 자동으로 선택합니다.
Capistrano::RVM에는 RVM 관련 설정이 더 있지만, 여기 소개한 것들만으로도 시작하기에 충분합니다.
서버 구성 설정하기
배포 전용 사용자를 정의하는 것이 좋습니다. 배포를 시작하기 전에 서버에서 아래 단계들을 반드시 수행하세요:
- 로컬 머신에서 생성한 공개 키를
~/home/YOUR_USER/.ssh/authorized_keys파일에 추가합니다. - 키를 하나 생성하고 공개 키를 코드 저장소에 등록합니다. 이렇게 하면 프로덕션 서버에서 프로젝트를 클론할 수 있습니다. GitHub를 사용한다면 공식 문서를 참고하세요.
/var/www/디렉터리에 쓰기 권한을 부여합니다.
Capistrano는 필요한 어떤 환경으로든 설정할 수 있습니다. config/deploy/<환경이름>.rb 파일을 새로 생성한 뒤, 서버에 연결할 IP 또는 DNS와 사용자 이름을 설정하기만 하면 됩니다.
배포 설정을 마무리하려면 애플리케이션 이름과 코드 저장소 URL 같은 앱 정보를 추가하세요. 모든 환경에서 공통으로 사용되는 정보는 config/deploy.rb에 넣고, 특정 환경에만 적용되는 설정은 config/deploy/<환경이름>.rb에 분리해서 관리하는 것이 좋습니다.
capistrano-secrets-yml 젬 설정하기
또한 capistrano-secrets-yml 젬도 설정해야 합니다.
Gemfile에 젬을 추가한 후 bundle install을 실행하세요:
Capfile에 임포트합니다:
그다음 애플리케이션에 config/secret.yml 파일을 생성하고, secret key base를 환경 변수로 포함합니다. 이 변수는 프로덕션 서버에서 생성됩니다. 이 파일은 저장소에 커밋하면 안 됩니다.
애플리케이션 폴더에서 터미널을 열고 아래 명령어로 secret key base를 생성합니다:
생성된 키를 복사해 프로덕션 서버의 SECRET_KEY_BASE 값으로 사용하세요. 프로덕션 서버에 접속해 ~/.bashrc 파일 마지막에 SECRET_KEY_BASE 변수를 export하면 항상 사용할 수 있습니다:
source 명령을 실행하면 환경에 즉시 적용됩니다:
이제 다시 로컬 머신으로 돌아가 터미널에서 애플리케이션 폴더로 이동한 뒤, 아래 Capistrano 명령어를 실행하면 프로덕션 서버에 config/secrets.yml 파일이 생성됩니다:
모두 끝났습니다! 이제 마이그레이션을 실행하도록 Capistrano를 설정해 보겠습니다.
데이터베이스 마이그레이션을 위한 Capistrano 설정
이제 Capistrano가 데이터베이스 관련 명령어를 실행하도록 설정할 차례입니다.
Gemfile에 이미 포함된 capistrano-rails 젬은 매 배포 시점에 마이그레이션을 수행하도록 설정할 수 있습니다. Capfile에 임포트만 하면 됩니다:
만약 배포 시 시드(seeds) 데이터도 함께 실행하고 싶다면, 마이그레이션 이후에 실행되는 새로운 태스크를 생성해야 합니다:
이제 드디어 앱을 배포할 준비가 완료되었습니다!
Ruby on Rails 앱 배포 시작하기
로컬 머신에서 배포 명령을 실행해 서버를 앱의 새 버전으로 직접 업데이트하는 방법을 살펴보겠습니다.
배포 명령을 실행하면 Capistrano가 서버에 접속합니다. 이어서 설정 파일(config/deploy.rb)에 정의된 저장소에서 코드를 클론하려 시도하고, 배포 흐름에 따라 나머지 태스크들이 순차적으로 수행됩니다.
Capistrano의 deploy:check 명령어는 Git 설정이 올바른지, 그리고 배포에 사용될 디렉터리들에 대한 접근 권한이 제대로 설정되어 있는지 검증합니다.
이 명령어를 사용할 때는 환경을 함께 지정해야 합니다. 여기서는 production을 사용하겠습니다:
설정에 문제가 없다면 프로덕션 배포를 시작할 수 있습니다:
추가로, 아래 명령어로 Capistrano에서 사용 가능한 모든 태스크를 확인할 수 있습니다:
이제 마지막 단계입니다. Ruby on Rails 애플리케이션을 AppSignal과 통합해 모니터링을 시작해 보겠습니다.
AppSignal을 Capistrano 및 Rails 앱과 통합하는 방법
AppSignal은 모니터링 도구인데, 굳이 이 글에 등장하는 이유가 궁금할 수 있습니다. 타당한 질문입니다. 모니터링은 배포와 직접적인 관련이 없으니까요.
하지만 AppSignal은 Ruby on Rails 애플리케이션을 모니터링하고 각 환경의 배포 이력을 추적하는 데 매우 유용한 도구입니다. 그럼 앱에 AppSignal을 설정하는 방법을 살펴보겠습니다.
먼저 AppSignal 계정이 필요하며, 회원가입 페이지에서 생성할 수 있습니다. 언어로 Ruby를 선택한 뒤 안내에 따라 애플리케이션에 AppSignal을 설치하세요.
설치가 완료되면 AppSignal을 설정하는 파일이 생성됩니다. 여기서 중요한 것은 revision 값을 정의하는 것입니다. 이 정보는 배포 후 새 버전의 애플리케이션이 배포되었는지 확인하는 데 사용됩니다. 여기서는 Git 로그를 revision 정보로 사용해, 새 코드가 배포될 때마다 AppSignal에 알림이 가도록 하겠습니다.
또한 AppSignal 환경 변수를 프로덕션 서버에 export하는 것이 좋습니다(특히 API 키는 AppSignal 설정 파일에 그대로 두지 않는 것이 안전합니다).
이제 배포를 다시 실행해 보겠습니다. 모든 설정이 올바르게 되어 있다면 배포 마지막에 다음과 같은 메시지가 표시됩니다:
이제 AppSignal에서 여러분의 애플리케이션을 확인할 수 있습니다! 🎉

그리고 배포에 대한 상세 정보도 확인할 수 있습니다:

배포 통합과 Ruby on Rails 애플리케이션에서 사용할 수 있는 다른 기능에 대해 더 알고 싶다면, AppSignal의 배포 문서 페이지를 방문해 보세요.
마무리 및 다음 단계
이번 글에서는 Capistrano를 활용해 Ruby on Rails 앱을 배포하는 방법을 살펴봤습니다. 앱에 Capistrano를 추가하는 것부터 시작해 설정과 배포를 진행했고, 마지막으로 AppSignal로 모니터링 환경까지 구축했습니다.
더 나아가고 싶다면, 저장소 파이프라인에 연결된 통합 환경에서 Capistrano가 실행되도록 설정할 수도 있습니다. Bitbucket, GitHub, GitLab 같은 도구들은 이 과정을 관리할 수 있는 설정을 제공하며, Capistrano와 함께 사용할 수 있습니다.
즐거운 코딩 되세요!
P.S. Ruby Magic의 글을 발행 즉시 읽어보고 싶다면 Ruby Magic 뉴스레터를 구독하고 어떤 글도 놓치지 마세요!