내가 Rails 호스팅 비용을 70% 절감했습니다: Heroku에서 Railway로 마이그레이션
Source: Dev.to
(번역을 진행하려면 전체 텍스트를 제공해 주세요.)
TL;DR
Rails API를 Heroku + JawsDB에서 Railway로 마이그레이션했습니다.
결과
| 지표 | 이전 | 이후 |
|---|---|---|
| 호스팅 비용 | ~$20 / month | ~$6 / month |
| 마이그레이션 시간 | — | ~20–30 minutes |
| 다운타임 | 없음 | 없음 |
| 데이터베이스 마이그레이션 | 스트리밍 명령 하나 | — |
내 원래 설정
Rails API
│
Heroku Dyno
│
JawsDB (MySQL)
월간 대략 비용
| Service | Provider | Cost |
|---|---|---|
| 앱 호스팅 | Heroku | ~$7–10 |
| MySQL | JawsDB | ~$10–12 |
| 총합 | — | ~$20/month |
크지는 않지만, 사이드 프로젝트에서는 인프라를 간단하고 저렴하게 유지하는 것을 선호합니다.
새로운 설정
Rails API
│
Railway App
│
Railway MySQL
새로운 비용 내역
| 서비스 | 제공자 | 비용 |
|---|---|---|
| 앱 호스팅 | Railway | ~$3–4 |
| MySQL | Railway | ~$2 |
| 총합 | — | ~$6/month |
대략 70 % 비용 절감입니다.
Source: …
Migration Strategy
마이그레이션은 네 단계로 구성되었습니다:
- Link the Railway project
- Export the database from JawsDB
- Import the data into Railway MySQL
- Update the Rails configuration
다운타임은 필요하지 않았습니다.
Step 1: Link Your Railway Project
- Railway CLI를 설치하고 인증합니다.
- 다음을 실행합니다:
railway link
What this does
- 로컬 레포를 Railway 프로젝트에 연결합니다
- CLI가 해당 프로젝트에 대해 명령을 실행할 수 있게 합니다
- 로컬에
.railway폴더를 생성합니다
이 단계는 레포지토리당 한 번만 수행하면 됩니다.
Step 2: Dump Data from JawsDB and Import into Railway
덤프 파일을 만든 뒤 나중에 가져오는 대신, 데이터베이스를 직접 스트리밍할 수 있습니다.
mysqldump \
-h [jawsdb-host] \
-u [jawsdb-user] \
-p[jawsdb-password] \
--no-tablespaces \
--set-gtid-purged=OFF \
--single-transaction \
[jawsdb-database] \
| railway run -s MySQL mysql \
-h $MYSQLHOST \
-u $MYSQLUSER \
-p$MYSQLPASSWORD \
$MYSQLDATABASE
What this does
- JawsDB에서 데이터베이스를 내보냅니다
- 출력 결과를 바로 Railway MySQL에 파이프합니다
Why These Flags Matter
| Flag | Reason |
|---|---|
--no-tablespaces | JawsDB는 AWS RDS에서 실행되며, 테이블스페이스 덤프에 필요한 권한이 제한됩니다. |
--set-gtid-purged=OFF | 복제 메타데이터가 가져오기 중 충돌을 일으키는 것을 방지합니다. |
--single-transaction | 내보내는 동안 일관된 스냅샷을 생성합니다(InnoDB 테이블에 이상적). |
Why Streaming the Database Is Powerful
파이프(|)를 사용해 SQL 출력을 직접 Railway로 스트리밍합니다:
JawsDB → mysqldump → pipe → Railway MySQL
Benefits
- 중간 덤프 파일이 필요 없음
- 마이그레이션 속도 향상
- 디스크 사용량 감소
- 대용량 데이터베이스에 적합
Step 3: Verify the Migration
가져온 후, 다음 명령으로 마이그레이션을 확인합니다:
railway run -s MySQL mysql \
-h $MYSQLHOST \
-u $MYSQLUSER \
-p$MYSQLPASSWORD \
$MYSQLDATABASE \
-e "SHOW TABLES;"
테이블 목록이 표시되어야 합니다. 예:
users
transactions
posts
comments
Step 4: Update Rails Configuration
이전에는 Rails 앱이 JawsDB DATABASE_URL을 사용했습니다. Railway는 자동으로 다음 환경 변수를 제공합니다:
MYSQLHOST
MYSQLPORT
MYSQLUSER
MYSQLPASSWORD
MYSQLDATABASE
MYSQL_URL
가장 간단한 Rails 설정은 다음과 같습니다:
production:
adapter: mysql2
url:
코드를 푸시하면 Railway가 자동으로 애플리케이션을 재배포합니다.
Heroku vs Railway (간단 비교)
| 기능 | Heroku + JawsDB | Railway |
|---|---|---|
| 호스팅 모델 | 앱 다이노 + 애드온 | 하나의 플랫폼에서 앱 + 서비스 |
| 데이터베이스 | JawsDB MySQL 애드온 | 네이티브 관리형 MySQL |
| 비용 (소규모 프로젝트) | ~$20 / 월 | ~$6 / 월 |
| 배포 | Git push | Git push (자동 재배포) |
결론: Heroku + JawsDB에서 Railway로 작은 Rails API를 옮김으로써, 월 호스팅 비용을 약 70 % 절감했으며, 30 분 이내에 마이그레이션을 완료했고 다운타임 없이 진행했습니다. 🚀
Git push / GitHub integration
| Feature | Heroku | Railway |
|---|---|---|
| Environment variables | 지원 | 지원 |
| CLI tools | Heroku CLI | Railway CLI |
| Database migration | 수동 덤프 / 가져오기 | railway run 으로 간편하게 |
| Infrastructure management | 관리형 | 관리형 |
| Static outbound IP | 보장되지 않음 | 보장되지 않음 |
| Best suited for | 성숙한 프로덕션 앱 | 사이드 프로젝트 및 소규모 앱 |
Final Thoughts
Heroku는 여전히 최고의 개발자 경험 중 하나를 제공합니다.
하지만 소규모 프로젝트나 사이드 툴의 경우, 인프라를 단순화하고 비용을 절감하는 것이 의미가 있을 수 있습니다.
내 Rails API를 Railway 로 옮기면서 얻은 점은 다음과 같습니다:
- 간소화된 스택
- 호스팅 비용 약 70% 절감
- 최소한의 마이그레이션 노력
Heroku에서 MySQL을 사용하고 있는 소규모 Rails 프로젝트를 운영 중이라면, Railway 를 검토해 보는 것이 좋을 것입니다.
Question for Other Developers
사이드 프로젝트를 호스팅하고 있다면:
- 아직도 Heroku를 사용하고 있나요?
- 아니면 Railway, Fly.io, Render 같은 플랫폼으로 옮겼나요?
여러분의 스택이 어떻게 구성되어 있는지 궁금합니다.