백엔드 배포 지옥에 빠진 이야기

소개

해외 유튜브 영상으로 공부를 하고 있었는데 자막을 보다 보면 화면이 휙 지나가 버려서 다시 돌려서 보다 보니 원본 영상의 시간보다 훨씬 더 많은 시간이 걸렸어요. 외국어 유튜브 영상도 우리나라 영상처럼 편히 볼 수 있었으면 좋겠다는 생각이 들어서 유튜브 영상 더빙 서비스를 만들게 되었습니다.

진행 방법

어떤 도구를 사용했고, 어떻게 활용하셨나요?

  • Cursor - 전체 프로젝트 개발

  • Lovable, V0, Readdy - 프론트엔드 디자인

  • Vercel - 프론트엔드 배포

  • Fast API - Python으로 웹 API를 빠르게 만들 수 있게 도와주는 프레임워크

  • Render, Railway, Google Cloud Run - 백엔드 배포

  • Supabase - Railway에서 tasks를 저장하는 용도

  • ChatGPT, Claude - Railway 서비스팀에 보내는 이메일 초안 작성

먼저 ChatGPT와 대화를 오래 나누었어요. 어떤 기능들이 필요한지, 저작권 관련해서 문제는 없는지, 수익성은 있는지 등등... 그런 다음에 PRD(Product Requirements Document, 제품을 개발하거나 개선하기 위해 필요한 요구사항을 문서로 정리한 것)를 만들어 달라고 했어요.

그런 다음 GPT 새 채팅을 열어서 PRD를 넣어주고 어떻게 개발하면 좋을지 단계별 계획을 세워달라고 했어요. 그런 다음 Lovable에서 프론트엔드 디자인을 할건데 프롬프트를 써달라고 했고, 그 프롬프트를 Readdy, V0, Lovable에 똑같이 넣어서 프론트엔드 디자인을 해봤습니다.

프롬프트 : Create a mobile-first web app that lets users paste a YouTube link and receive Korean dubbing. The app should: - Ask for a YouTube URL - Show processing steps (Audio → Translate → TTS) - Display a video player with synced Korean dubbing - Allow voice gender selection and playback speed - Have an expandable advanced settings panel - Include a friendly tone, rounded UI, and soft colors - Show a notice: "For personal use only. All copyrights belong to the original creators.

  1. Readdy

한국 웹 사이트의 스크린 샷

  1. V0

  1. Lovable

Lovable이 마음에 들어서 그걸 쓰기로 결정했어요. Lovable에 Github에 연동 기능이 있어서 Github에 올리고 그걸 로컬에 다운받아서 Cursor에서 작업을 시작했습니다.

유튜브 영상 더빙을 위해서는 여러 단계의 작업(음성 파일 다운 -> STT -> 번역 -> TTS 등)이 필요해서 하나씩 진행하다가 백엔드 배포를 먼저 하고 나머지를 진행하기로 했어요. 프론트엔드를 Vercel에 배포했으니 백엔드도 한 곳에 하면 좋겠다 생각했는데 Vercel에는 Fast API를 올리지 못한다고 해서 무료로 사용해 볼 수 있는 Render에 올리는 것으로 방향을 바꾸었어요.

Render에 배포하기 위해 커서와 씨름하며 시간을 많이 보냈는데, 알고 보니 Render의 무료 플랜(Free Web Service)에서는 파이썬 패키지 설치는 가능하지만, 시스템 패키지 설치가 불가했어요ㅠㅠ

파이썬의 스크린 샷 - 파이썬 -Python -Pyth

GPT와 대화하며 다른 방법을 찾다가 Railway에서 처음에 5달러 크레딧을 준다고 해서 다시 방향을 틀었어요.

그런데 status를 조회하면 계속 404 에러가 떠서 해결하려고 온갖 노력을 다했는데 계속 풀리지 않아서 커서에게 각종 로그들을 캡처해서 올려줬더니 Railway(특히 무료 플랜)는 비동기 작업(BackgroundTasks)에서 실행되는 파이프라인 함수가 별도의 워커 프로세스에서 실행될 수 있고, 이 경우, 메인 프로세스의 메모리(tasks 딕셔너리)와 워커 프로세스의 메모리(tasks 딕셔너리)가 서로 달라서 그렇다는 결론을 내려줬어요.

해결하려면 작업 상태(tasks)를 메모리 딕셔너리 대신 파일이나 DB에 저장하면 여러 프로세스/스레드/워커 간에 작업 상태를 공유할 수 있다고 해서 Supabase에 tasks를 저장하기로 했어요.

한국어 한국어 한국인 한국인 한국인

Supabase 작업까지 마친 다음 다시 Railway에서 배포 시도를 했는데 아뿔싸! 이번엔 이미지 사이즈가 7.5G로 용량 초과되어 실패 ㅠㅠ

다시 커서한테 물어물어 이번에는 Google Cloud Run을 이용해 보라고 해서 시도했어요.

Google 클라우드가 실행됩니다

그런데 조직 내부가 아니라 일반인을 대상으로 서비스를 하는 게 정책상 막혀 있어서 Google Cloud Platform에서 조직 관리자가 권한을 주어야 한다고 해서 이걸 해결하려고 또 진땀을 뺐는데 결국 안 됐어요.

방법을 못 찾아서 며칠 다른 일을 하다가 다시 마음 잡고 이번엔 클로드와 대화를 했어요. 내가 이런이런 걸 만들려고 하는데 용량이 얼마나 되겠냐고 물으니 또 크게 대답을 하길래 "너무 크네"하고 대답했어요. 그랬더니 용량을 1~2G로 줄일 수 있는 방법이 있다고 했어요. 그래서 또 열심히 제시해준 방법들을 시도했어요.

그러다가 성공적으로 배포가 됐어요! 그런데 Fast API 서버에서 테스트를 해보니 에러가 났어요 ㅠㅠ Railway에 변수를 설정했는데 Supabase 관련 변수 5개를 불러오지 못하고 있었어요. Shared Variables에 분명히 저장을 했는데 못 불러왔어요. 원인은 잘 모르겠는데 터미널에서 CLI로 변수 설정을 하니 잘 불러와졌어요. Shared Variables보다 CLI로 설정한 변수가 우선순위가 높다고 합니다.

변수 설정을 마쳤는데 갑자기 어느 순간부터 배포 실패가 됐어요.

Nixpacks 빌드 오류

failed to calculate checksum of ref ... "/.nixpacks/nixpkgs-...nix": not found

커서가 알려주는 걸 이것저것 했는데도 해결이 안 돼서 결국은 지원팀에 문의를 하라고 했어요. 내용을 써달라고 해서 문의를 올렸는데 해결책에 대한 답을 얻지는 못했어요.

이미지 용량도 결국 또 7.5G가 돼서 5달러를 결제하고 시도했는데도 계속 같은 오류가 났어요. 새 프로젝트를 만들어서 설정을 하다가 새벽이라 멈추고 잤는데 나중에 보니 Railway에서 이메일이 와 있었어요.

저작권을 위반해서 중지되었다는 내용이었어요. 더빙 프로젝트가 유튜브 영상의 스크립트를 다운받아서 처리하는 방식이라서 자동 검열 시스템에 걸린 것 같았어요. 그래서 이메일 내용을 복사해서 GPT와 클로드에게 넣어주고 메일을 보내려고 하는데 초안을 써달라고 했어요.

아래는 GPT가 준 초안이고,

아래는 클로드가 써준 초안이에요. 클로드는 함께 첨부하면 좋은 내용들까지 써줘서 좋았어요.

PRD 문서를 첨부해서 이메일을 보내고 결과를 기다리고 있는 상황인데 좋은 소식을 전해드릴 수 있었으면 좋겠습니다.

결과와 배운 점

아직 해결하지 못해서 답답한 상태가 지속되고 있긴 하지만, 하다가 안 된다고 포기하지 않고 하나 하다가 안 되면 다른 방법을 시도하고, 또 안 되면 또 다른 방법을 찾고 하는 과정에서 많은 것들을 배우고 있습니다. 답답함을 이겨내고 방법을 찾다보면 갑자기 해결되는 경험을 여러 번 해왔기 때문에 또 새로운 시도를 할 수 있는 것 같습니다.

배포 관련해서 혹시나 도움을 주실 수 있는 분이 계시다면 손 내밀어 주시면 정말 감사하겠습니다^^

👉 이 게시글도 읽어보세요