Kamal을 이용한 배포 워크플로우는 다음과 같습니다. 먼저 개발자의 로컬 머신에서 Kamal은 Git(GitHub)으로부터 최신 코드를 가져와 이를 기반으로 Docker 이미지를 빌드합니다. 이 이미지는 Ruby on Rails 애플리케이션을 실행하기 위한 컨테이너 역할을 합니다. 빌드된 Docker 이미지는 Docker Hub와 같은 컨테이너 레지스트리에 푸시됩니다. 이후 Kamal은 SSH를 통해 배포 대상 서버(예: Digital Ocean Droplet)에 접속하여 해당 레지스트리에서 이미지를 풀(pull)하고 컨테이너를 실행함으로써 애플리케이션을 구동합니다.
배포를 위한 핵심 설정은 config/deploy.yaml
파일에서 이루어집니다. 주요 설정 항목으로는 서비스 이름(예: doable
), 컨테이너 이미지 이름(예: Typcraft HQ/Doable
), 그리고 컨테이너 레지스트리 연결 정보가 있습니다. 컨테이너 레지스트리 연결을 위해 Docker Hub 토큰을 생성하고, 이를 KAMAL_REGISTRY_PASSWORD
환경 변수로 설정하여 사용합니다. 프로덕션 환경에서는 hatchbox
와 같은 Ruby Gem이나 1Password
와 같은 비밀 관리 도구를 활용하는 것이 권장됩니다.
서버 설정에 있어서 Kamal은 Digital Ocean과 같은 VPS(Virtual Private Server)에 SSH 접속만 가능하면 Docker 설치를 포함한 모든 필요한 환경 설정을 자동으로 처리합니다. 또한, deploy.yaml
파일의 proxy
섹션에서 호스트 도메인(예: doable.typcraft.dev
)을 설정하면 Let’s Encrypt를 통해 무료 SSL 인증서가 자동으로 적용되어 HTTPS를 통한 보안 접속을 지원합니다.
SQLite 데이터베이스와 같은 영구 데이터 저장을 위해서는 volume
설정을 통해 서버 외부의 영구 스토리지 볼륨을 마운트하는 것이 권장됩니다. 이는 서버 교체나 문제 발생 시 데이터 손실을 방지하는 모범 사례입니다.
배포 전 로컬 시스템에 Docker가 설치되어 있어야 하며, Rails 8은 기본적으로 애플리케이션 루트 디렉토리에 간단한 Dockerfile을 제공하여 이미지 빌드를 용이하게 합니다.
Kamal의 배포 과정은 kamal setup
명령어를 통해 시작됩니다. 이 명령어는 Docker 이미지 빌드 및 푸시, 서버 SSH 접속, 이미지 풀 및 컨테이너 실행 등 일련의 과정을 자동으로 수행하여 애플리케이션을 프로덕션에 배포합니다. 배포 후에는 kamal logs
를 통해 애플리케이션 로그를 확인하고, kamal console
을 통해 프로덕션 환경에서 Rails 콘솔에 접근할 수 있으며, kamal roll back
명령어를 사용하여 이전 버전으로 롤백하는 것도 가능합니다.