Kamal 2는 Capistrano의 현대적인 컨테이너 배포 도구로서, 37signals에서 AWS EKS에서 자체 하드웨어로 애플리케이션을 이전하는 과정에서 개발되었습니다. 이 도구는 Docker 컨테이너를 활용하여 무중단(Zero-downtime), 명령형(imperative), 그리고 빠른 배포를 핵심 목표로 삼고 있습니다. 특히 복잡한 Kubernetes 대신 단순한 Docker와 SSH를 기반으로 하여, 개발자들이 배포 과정을 직관적으로 제어할 수 있도록 설계되었습니다. Kamal 2는 Rails 8과 함께 기본적으로 제공될 예정이며, 단일 서버부터 다수의 호스트에 이르는 다양한 환경에서의 효율적인 배포를 지원합니다.
Kamal 2의 배포 과정은 먼저 로컬 또는 배포 호스트에서 Docker 이미지를 빌드하고 레지스트리에 푸시한 다음, 애플리케이션 호스트에서 해당 이미지를 풀(pull)하는 방식으로 이루어집니다. 초기 설정은 kamal setup
으로 Docker 설치 및 이미지 풀을 처리하며, 이후의 배포는 kamal deploy
명령으로 새로운 컨테이너를 구동하고 트래픽을 전환합니다.
가장 주목할 만한 개선 사항 중 하나는 Asset Bridging 기능입니다. 기존 배포 방식에서는 구버전과 신버전의 애플리케이션이 동시에 서비스될 때 자산(CSS, JS 등)의 404 오류가 발생할 수 있었으나, Kamal 2는 모든 자산을 단일 공유 폴더에 통합하여 서빙함으로써 이러한 문제를 해결하고 완벽한 무중단 배포를 가능하게 합니다. 이는 CDN 없이도 자산 관리의 복잡성을 크게 줄여줍니다.
또 다른 핵심 변경 사항은 자체 개발된 Kamal Proxy의 도입입니다. Kamal 1에서 사용했던 Traefik은 선언적(declarative) 특성으로 인해 Kamal의 명령형(imperative) 배포 철학과 불일치하고, 요청 드레인(drain) 및 문제 해결에 어려움이 있었습니다. Kamal Proxy는 이러한 문제를 해결하기 위해 Kamal의 배포 흐름에 완벽하게 맞춰 개발되었으며, 명령-응답(command-response) 방식의 즉각적인 트래픽 전환을 제공합니다. 이 프록시는 단일 서버에서 여러 애플리케이션을 호스팅하고 Let’s Encrypt를 통해 자동으로 SSL을 설정하는 기능을 내장하여, 소규모 배포 환경에서도 편리함을 제공합니다.
비밀(secret) 관리도 크게 간소화되었습니다. 기존의 복잡한 템플릿 기반 방식 대신, Ruby dotenv
gem의 변수 치환 기능을 활용하고 1Password, LastPass 등 외부 비밀 관리자와의 연동을 지원하는 kamal secrets fetch
명령을 도입하여 비밀을 안전하고 효율적으로 관리할 수 있게 되었습니다.
마지막으로, kamal console
, kamal shell
, kamal logs
와 같은 편리한 별칭(aliases) 기능이 추가되어, 프로덕션 환경에서 Rails 콘솔 접근, 셸 실행, 로그 확인 등을 더욱 쉽게 할 수 있게 되었습니다. 이는 Rails 8에서 기본적으로 제공될 예정입니다.
Kamal 2는 단순함, 속도, 그리고 안정성을 최우선으로 하는 현대적인 컨테이너 배포 솔루션입니다. 복잡한 인프라 관리 없이도 Docker 기반의 Ruby on Rails 애플리케이션을 효율적으로 배포하고자 하는 개발자들에게 최적화되어 있습니다. 특히 Kamal Proxy의 도입과 Asset Bridging, 간소화된 비밀 관리, 그리고 사용자 친화적인 별칭 기능들은 배포 과정을 더욱 매끄럽고 예측 가능하게 만듭니다. Rails 8과 함께 기본 제공될 예정인 Kamal 2는 개인 개발자부터 중소규모 팀에 이르기까지, 최소한의 노력으로 견고한 배포 파이프라인을 구축할 수 있는 강력한 도구로 자리매김할 것입니다.