goodchuck 블로그

Vercel 무료 플랜으로 모노레포 앱 여러 개 배포하기 — 하루 배포 100번, 업로드 5,000개 한도를 피한 방법

5분 읽기

모노레포 하나에 웹 앱을 여러 개 두고, 전부 Vercel 무료(Hobby) 플랜으로 배포하고 있습니다. 혼자 쓰는 사이드 프로젝트라 무료로 충분하다고 생각했는데, 운영하다 보니 Vercel 무료 플랜의 한도 두 개에 차례로 걸렸어요.

  1. 하루 배포 100번 — Git 연동을 쓸 때
  2. 24시간 파일 업로드 5,000개 — CLI 로 직접 올릴 때

둘 다 오류 메시지만 보면 원인이 바로 안 보여서, 겪은 순서대로 정리해 둡니다.

한도 1 — Git 연동은 앱 전부를 배포한다

처음엔 Vercel 의 Git 연동을 썼습니다. 저장소를 연결해 두면 push 할 때마다 알아서 배포해 주니까요.

문제는 모노레포였어요. 저장소 하나에 Vercel 프로젝트(웹 앱)를 여러 개 연결해 두면, push 한 번에 연결된 프로젝트 전부에 배포가 생깁니다. 바뀌지 않은 앱은 "변경 없는 프로젝트 건너뛰기"로 취소되긴 하는데, 취소된 배포도 하루 배포 한도(100번)에 들어갑니다.

10월 18일에 실제로 이게 터졌어요. 그날 웹 앱 7개에 커밋 15개를 push 했더니 7 × 15 = 105, 하루 한도 100에 걸려 배포가 막혔습니다. 그중 65개는 아무것도 안 바뀌어서 건너뛴 배포였어요. vercel.json 에서 브랜치 배포를 꺼 봐도 배포 기록은 계속 생겼습니다.

해결 1 — Git 연동을 끊고 태그로 그 앱만 배포

그래서 각 프로젝트의 Git 연결을 끊고, 태그를 찍은 앱만 배포하는 방식으로 바꿨습니다.

blog-prod-v0.1.16   →  블로그만 운영 배포
vtuber-web-prod-v…  →  버튜버 웹만 운영 배포

태그를 push 하면 GitHub Actions 가 그 앱 하나만 빌드해서 Vercel 에 올립니다. 빌드는 Vercel 이 아니라 GitHub Actions 러너에서 하고(vercel build), 만들어진 결과물만 올려요(vercel deploy --prebuilt).

vercel pull --yes --environment=production   # 프로젝트 설정 받기
vercel build --prod                          # 러너에서 빌드
vercel deploy --prebuilt --prod              # 결과물만 업로드

이제 배포 기록은 태그를 찍은 앱에만 생겨서, 하루 배포 100번은 걱정할 일이 없어졌습니다. 앱마다 워크플로를 따로 쓰지 않고 공통 워크플로 하나를 두고 앱별 파일에서 불러 쓰게 했는데, 지금은 앱 9개가 같은 워크플로를 씁니다.

한도 2 — 업로드는 파일 하나하나가 센다

그렇게 잘 쓰다가, 10월 26일 새벽에 블로그 배포가 실패했습니다. 빌드는 성공했는데 업로드 단계에서 막혔어요.

Error: Too many requests - try again in 24 hours (more than 5000, code: "api-upload-free").
Try using `--archive=tgz` to limit the amount of files you upload.

api-upload-free 는 무료 플랜의 파일 업로드 한도입니다. vercel deploy --prebuilt 는 빌드 결과물을 파일 하나하나 올리는데, 그 파일 수가 24시간 동안 5,000개를 넘은 거예요.

블로그는 정적 사이트라 글마다 HTML 페이지, 데이터 파일, 공유 카드 이미지가 따로 생겨서 빌드 결과물 파일이 많습니다. 게다가 그날은 블로그와 다른 웹 앱을 여러 번 배포했어요. 실패하기 전 24시간 동안 Vercel 배포가 13번(버튜버 웹 10번, 블로그 3번)이었으니 5,000개가 찰 만했던 거예요.

배포 횟수 문제를 피하려고 고른 방식이, 이번엔 업로드 개수 문제를 만든 셈이에요.

해결 2 — 압축 한 덩어리로 올리기 (--archive=tgz)

해결책은 오류 메시지에 이미 있었습니다. --archive=tgz 를 붙이면 빌드 결과물을 압축 파일 하나로 묶어서 올려요. Vercel 이 받아서 서버에서 풀고, 배포 결과는 예전과 똑같습니다.

- vercel deploy --prebuilt --prod
+ vercel deploy --prebuilt --archive=tgz --prod

공통 워크플로의 이 한 줄만 바꾸고 바로 다시 배포해 봤어요. 한도에 막혔던 바로 그 시점이었는데도 통과했습니다. 업로드 로그는 이렇게 한 번으로 끝났어요.

Uploading [====================] (30.7MB/30.7MB)

파일 수천 개가 업로드 1건이 된 거라, 하루에 여러 번 배포해도 이 한도는 더 걱정하지 않아도 됩니다. 공통 워크플로를 고쳤으니 같은 워크플로를 쓰는 앱 9개가 한 번에 같이 해결됐고요.

대가와 모르는 것

잃는 것도 하나 있습니다. 파일 단위로 올릴 땐 Vercel 이 이미 받은 파일을 건너뛰어서, 바뀐 파일만 올라갑니다. 압축으로 올리면 매번 결과물 전체를 한 덩어리로 올려요. 블로그는 결과물이 30MB 남짓이라 한 번에 바로 올라갔지만, 결과물이 아주 큰 사이트라면 매번 전체를 올리는 시간이 부담될 수 있습니다.

한도가 언제 풀리는지는 확인하지 못했어요. 오류는 "24시간 뒤에 다시"라고만 알려 주고, 남은 개수나 초기화 시각은 알려 주지 않습니다. 최근 24시간 누적으로 세는 방식이라면 오래된 업로드가 빠지면서 조금씩 여유가 생기겠지만, 이건 추정이에요.

정리

방식하루 배포 100번24시간 업로드 5,000개비고
Git 연동❌ push 마다 앱 전부 셈✅ 파일을 올리지 않음모노레포에선 횟수가 금방 찬다
태그 + --prebuilt✅ 그 앱만❌ 결과물 파일마다 셈자주 배포하면 업로드가 찬다
태그 + --prebuilt --archive=tgz✅ 그 앱만✅ 압축 1건매번 전체를 올린다

무료 플랜으로 모노레포 앱 여러 개를 굴린다면, 앱별 태그 배포 + 압축 업로드 조합이 지금까지는 가장 편했습니다. 처음부터 이렇게 했다면 두 번 막히지 않았을 거예요.