Render.com에 Rails 8 애플리케이션을 배포하기 위한 주요 단계와 최적화 방안은 다음과 같습니다.
1. 데이터베이스 변경 및 Solid Tri-fecta 통합
-
PostgreSQL로 전환: Rails 8의 기본 SQLite 데이터베이스를 Render 환경에 적합한 PostgreSQL로 변경합니다.
rails db:system:change --to=postgresql명령어를 사용하여 Gemfile, Dockerfile, database.yml 파일을 업데이트합니다. -
단일 데이터베이스 전략: Rails 8은 Solid Cache, Solid Queue, Solid Cable을 기본적으로 별도의 데이터베이스에 구성하지만, 비용 효율성과 관리 편의성을 위해 이를 단일 PostgreSQL 데이터베이스로 통합합니다.
- Solid Cache, Solid Queue, Solid Cable의 스키마 마이그레이션을 단일 마이그레이션 파일로 병합하고, 별도의 스키마 파일(
db/q_schema.rb등)은 삭제합니다. config/database.yml,config/cable.yml,config/cache.yml파일에서 각 서비스가primary데이터베이스를 사용하도록 설정합니다.config/production.rb에서 Solid Queue의 별도 데이터베이스 연결 설정(config.solid_queue.connects_to)을 제거합니다.
- Solid Cache, Solid Queue, Solid Cable의 스키마 마이그레이션을 단일 마이그레이션 파일로 병합하고, 별도의 스키마 파일(
2. Solid Queue 설정 및 모니터링
-
개발 환경 설정:
config/development.rb에서config.active_job.queue_adapter = :solid_queue를 설정하여 개발 환경에서도 Solid Queue를 사용하여 비동기 작업을 처리하도록 합니다. -
프로덕션 환경 최적화: 별도의 워커 프로세스 없이 웹 서비스 내에서 Solid Queue를 실행하기 위해 Puma 플러그인을 활용합니다. Render 환경 변수에
SOLID_QUEUE_IN_PUMA=true를 설정하여 이를 활성화합니다. -
작업 모니터링:
mission_control-jobsGem을 설치하여 작업 대시보드를 제공하고, 대시보드를 통해 큐에 추가되거나 완료된 작업을 시각적으로 확인합니다. 개발 환경에서는 인증을 일시적으로 비활성화하여 접근 편의성을 높일 수 있습니다.
3. Render.com 배포 과정
- 수동 배포:
- Render에서 PostgreSQL 데이터베이스를 생성하고, 생성된
DATABASE_URL을 복사합니다. - 새로운 웹 서비스를 생성하고 GitHub 저장소를 연결합니다.
- 빌드 명령(
bundle exec rails db:migrate) 및 시작 명령(bundle exec rails server)을 설정합니다. - 환경 변수(
RAILS_MASTER_KEY,DATABASE_URL,SOLID_QUEUE_IN_PUMA=true)를 추가합니다. - 헬스 체크 경로를
/up으로 설정하고 자동 배포를 활성화합니다. - 배포 후 웹 애플리케이션, 게시물 생성, Rails 콘솔을 통한 작업 트리거 및 Mission Control 대시보드 확인을 통해 정상 작동을 검증합니다.
- Render에서 PostgreSQL 데이터베이스를 생성하고, 생성된
- Blueprint (render.yaml) 활용:
- Render Blueprints는
render.yaml파일을 통해 데이터베이스, 웹 서비스, 워커, 환경 변수 등 모든 인프라를 코드로 정의하고 자동화된 배포를 가능하게 합니다. render.yaml파일은 서비스 유형, 지역, 플랜, 디스크 크기, 빌드 및 시작 명령 등을 명시하여 일관되고 반복 가능한 배포를 지원합니다.- 원클릭 배포 버튼을 통해 손쉽게 애플리케이션을 배포할 수 있으며, 인프라 구성을 버전 관리하여 추적성을 높입니다.
- Render Blueprints는
4. 추가 최적화 및 Render 장점
-
Gemlock 적용:
LD_PRELOAD=/usr/lib/libjemalloc.so.2환경 변수를 설정하여 애플리케이션의 메모리 사용량을 최적화하고 감소시킵니다. -
Render의 이점: Render는 Heroku에 비해 더 긴 HTTP 요청 타임아웃(100분 대 30초), 더 저렴한 비용, 그리고 영구 디스크(Persistent Disks) 제공과 같은 장점을 가지고 있어, 특히 파일 업로드와 같이 영구적인 스토리지가 필요한 경우에 유리합니다.