Kamal 2.0 업그레이드 후기
Kamal 2.0 릴리즈
Rails World 2024에서 Kamal 2.0 릴리즈를 발표했어요. Kamal 2.0은 웹 어플리케이션 배포를 간소화하고 가속화하는 도구로, 다양한 규모의 서버에 유연하게 적용할 수 있어요. 새로운 프록시를 사용해 중단 없는 배포를 지원하며, HTTPS 자동 설정과 SECRET 관리 기능이 개선됐어요. Kamal 2.0은 Rails 8.0에 기본 포함되지만, 다른 언어와 프레임워크에서도 사용 가능해요.
Kamal 1.8.1에서 2.0으로 업그레이드
Kamal 2.0이 공개되면서 Kamal 공식 문서도 2.0에 맞게 업데이트 됐어요. 문서에는 Upgrade Guide를 지원하고 있는데 큰 어려움 없이 업그레이드를 마칠 수 있었지만 사소하지만 문서에 나오지 않는 부분들이 있어서 후기를 작성하게 됐어요.
Kamal1과 2의 가장 큰 변경사항은 아래와 같아요.
- Traefik을 kamal-proxy로 변경
- 모든 컨테이너를 custom docker network로 관리
- 몇몇 하위 호환 되지 않는 설정 변경 사항
- Secret을 컨테이너로 전달하는 방식 변경
Kamal 1.9.x로 업그레이드
Kamal을 2.0으로 업그레이드 하기 위해서는 먼저 1.9.x 버전까지 업그레이드를 하는 게 필요해요. 저는 1.9.0으로 업그레이드 하고 배포를 한 번 한 다음에 업그레이드를 진행했어요.
Kamal 2.0 업그레이드
1.9.0 업그레이드 후에 바로 최신 버전인 2.0으로 업그레이드를 진행했어요.
설정 호환성 체크
kamal config
커맨드를 통해서 이전 설정 중에 맞지 않는 것들을 찾아냈어요. 제가 수정을 했던 부분은 아래와 같아요.
- traefik 설정 제거
- proxy 설정 추가
- builder 부분에서 multiarch 제거 (명시적으로 적어두게 변경됨)
- 설정 상단에 dotenv 읽어오는 부분 추가
대부분의 설정 변경사항은 가이드 문서의 링크를 참고했어요.
.env 파일을 .kamal/secrets로 변경
가이드 문서에서 상세한 내용을 다르고 있어서 크게 어려운 점은 없었어요.
업그레이드 진행
Kamal 2.0 환경으로의 업그레이드는 kamal upgrade
커맨드 하나로 모두 진행이 되고 추가적인 조치는 에러 메시지에 따라 진행했어요
가이드 문서에서 놓쳤거나 알 수 없었던 문제
kamal custom docker network 적용에 따른 기존 network 연결 문제
저는 kamal의 accessory로 db와 redis도 쓰고 있었는데 이때 설정값으로 private network를 따로 생성해서 사용하고 있었어요. 가이드 문서에서 network를 따로 만들어서 쓴다는 부분은 인지하지 못하고 업그레이드를 진행했는데 배포 과정에서 네트워크 연결 문제가 발생했어요.
해결 방법은 기존 설정의 network 설정을 제거하는 것으로 쉽게 할 수 있었어요.
Cloudflare DNS를 사용하는 경우, proxy의 ssl을 활성화하면 발생하는 TOO_MANY_REDIRECT 문제
저는 프로젝트를 Cloudflare DNS를 통해서 외부와 연결하고 있는데, 기존에는 Traefik을 통해서 자체 인증서도 발급해서 쓰고 있었어요. 그 관성대로 그대로 ssl 설정을 활성화했는데 이 경우에는 무한 리다이렉트 문제가 발생했고, 가이드 문서에서는 해결 방법을 찾기 어려웠어요.
다행히 Kamal Discord에서 비슷한 질문과 ssl 설정을 끄라는 답변이 있어서 쉽게 마무리 할 수 있었어요.
proxy:
ssl: false
후기
저는 비교적 최근에 DHH의 팬이 됐고, 그래서 Kamal도 나오자마자 개인 프로젝트에 적극적으로 적용해서 사용하고 있었어요. Rails World에서 Rails8과 Kamal 2.0의 소식을 전할거라는 예고를 듣고 기대가 많았는데, 업그레이드 과정에서 약간의 삽질이 있긴 했지만 그럼에도 불구하고 난이도가 높았던 문제는 아니었어요. 보통의 프레임워크나 도구의 메이저 버전을 올릴 때의 경험을 생각해보면 큰 어려움이 아니었고 앞으로의 Kamal도 기대되는 업그레이드 과정이었어요.
제가 업그레이드를 빠르게 진행해본 이유 중에 하나는 하나의 머신에 여러 프로젝트를 Kamal로 배포할 수 있다는 점인데, 그 부분은 다음에 한 번 다뤄보려고 해요.