Vercel 무료 플랜에서 무료 Postgres와 자체 도메인을 사용하여 전체 n8n 실행하기
요약
Vercel의 서버리스 환경에서 무료 Postgres와 자체 도메인을 활용하여 n8n을 성공적으로 배포하는 방법을 설명합니다. Vercel 함수가 요청을 받아 내부 프로세스로 n8n을 시작하고, 유휴 시에는 중지(scale to zero)시켜 비용 효율성을 유지하는 것이 핵심입니다.
핵심 포인트
- Vercel의 단명 함수와 지속 작동 서버인 n8n을 결합한 실험적 배포 방식입니다.
- 유휴 시 프로세스를 종료(idle shutdown)하고 Neon Postgres를 활용하여 비용을 최소화합니다.
- 프록시 핸들러, 슈퍼바이저, 설정 빌더 등 세 가지 구성 요소가 필요합니다.
- 서버리스 환경에 맞게 n8n의 여러 설정을 조정해야 합니다 (예: N8N_PUSH_BACKEND=sse).
저는 운영하는 데 비용이 전혀 들지 않는 셀프 호스팅 n8n을 원했습니다. n8n은 데이터베이스와 백그라운드 프로세스가 있는, 계속 작동하는 서버를 위해 구축되었습니다. 반면 Vercel은 단명하는(short-lived) 함수를 위해 구축되었습니다. 이는 잘 맞지 않는 조합처럼 보였지만, 저는 이를 실험으로 시도해 보았습니다.
제한 사항이 있지만, 작동합니다. 이 게시물에서는 어떻게 했는지, 무엇을 테스트했는지, 그리고 무엇이 작동하지 않았는지를 다룹니다.
레포: https://github.com/muhammad-zulqarnain-awan/n8n-on-vercel
이것은 개인적이고 비상업적인 용도의 취미 프로젝트입니다. n8n의 라이선스와 Vercel의 Hobby 플랜 모두 이를 요구합니다. 자신만의 사본을 배포하고, 인스턴스의 접근 권한을 공유하거나 판매하지 마십시오.
아이디어
하나의 Vercel 함수가 n8n 앞에 위치합니다:
vercel.json은 모든 URL을 단일 함수로 재작성(rewrites)합니다.- 첫 번째 요청이 오면, 이 함수는
127.0.0.1에서 자식 프로세스로 n8n을 시작합니다. - n8n의 준비 상태 확인(readiness check)을 기다린 후, 요청을 n8n으로 프록시(proxies)합니다.
- 트래픽이 4분 동안 없으면, n8n을 중지시킵니다.
유휴 시 종료(idle shutdown)가 핵심 트릭입니다. n8n은 몇 초 간격으로 데이터베이스를 폴링(polls)하는데, 이는 무료 Neon 데이터베이스를 한 달 내내 깨어 있게 만들 것이고, 유휴 프로세스 또한 Vercel의 무료 할당량을 소모할 것입니다. n8n을 중지하면 Neon이 0으로 스케일(scale to zero)되고 사용량이 적게 유지됩니다. 다음 요청이 오면 단순히 n8n을 다시 시작하기만 하면 됩니다.
모든 상태는 Neon Postgres에 저장됩니다: 워크플로우, 자격 증명(암호화됨), 실행 기록. 중요한 것은 함수의 임시 디스크에 남지 않으므로 재시작해도 아무것도 잃지 않습니다.
구성 요소들
- 요청(스트리밍 응답 포함)을 로컬 n8n으로 전달하는 프록시 핸들러.
- n8n을 시작하고, 준비될 때까지 기다린 다음, 유휴 상태일 때 중지시키는 슈퍼바이저.
- 사용자의 Neon 연결 URL과 도메인을 n8n의 설정으로 변환하는 설정 빌더. n8n은 연결 문자열(connection string)이 아닌 개별
DB_POSTGRESDB_*변수를 사용하므로, 설정 빌더는 이 URL을 분할합니다.
서버리스 환경에서는 몇 가지 n8n 설정이 중요합니다:
N8N_PUSH_BACKEND=sse로 설정했습니다. 이는 라이브 에디터 업데이트가 서버 전송 이벤트(Server-Sent Events)를 통해 작동하며 웹소켓(WebSockets)을 피하기 위함입니다.N8N_DEFAULT_BINARY_DATA_MODE=database로 설정했습니다. 함수 인스턴스 간에 공유 디스크가 없기 때문입니다.- 무료 데이터베이스에 부담을 덜 주기 위해 작은 데이터베이스 풀과 느린 데이터베이스 핑(ping) 설정을 사용합니다.
- 커뮤니티 패키지는 비활성화했습니다. 이는 해당 패키지들이 삭제되는 폴더에 설치될 것이기 때문입니다.
- 요청 크기 제한을 Vercel의 제한보다 약간 낮게 설정하여, 오류가 플랫폼 자체에서 발생하는 것이 아니라 n8n에서 발생하도록 했습니다.
테스트한 내용
위 모든 내용은 실제 Postgres 데이터베이스를 대상으로 로컬 환경에서 프록시를 통해 실행되었으며, 현재 프로젝트는 제 도메인에 배포되어 작동하고 있습니다:
- 소유자 설정(Owner setup), 로그인 및 에디터 UI
- 코드 노드(Code node)를 포함한 프로덕션 웹훅(webhooks)
- 콜드 스타트 후 가장 첫 번째 요청: 매번 올바르게 응답합니다.
- 폼 트리거: 폼이 렌더링되고 제출이 실행됩니다.
- 자격 증명(Credentials): 암호화되어 저장되며, 전체 재시작 후에도 여전히 복호화됩니다.
- 20개의 병렬 웹훅 호출: 모두 200으로 반환되었습니다.
- 유휴 종료(Idle shutdown): n8n이 깔끔하게 종료되고 모든 데이터베이스 연결이 끊어집니다.
로컬 환경에서는 콜드 부트(cold boot)에 약 9~10초, CPU 사용량은 약 9.5 CPU-seconds가 소요되었습니다. Vercel에서는 다를 수 있으니 직접 측정해 보시기 바랍니다.
작동하지 않는 내용
솔직하게 말씀드리자면 다음과 같은 제한 사항이 있습니다:
- 스케줄 및 폴링 트리거는 신뢰성이 떨어집니다. 이러한 기능은 항상 실행되는 프로세스가 필요합니다. Hobby 플랜에서는 크론(cron) 주기가 최대 일 단위입니다.
- 콜드 스타트: 유휴 상태에서 대기한 후 n8n이 부팅될 때까지 첫 번째 요청을 기다립니다.
- **4.5MB가 넘는 요청 본문(Request bodies)**은 Vercel에 의해 거부됩니다.
- 실행 시간은 300초로 제한됩니다.
- 커뮤니티 노드와 Python Code 노드는 사용할 수 없습니다.
- n8n은 내부 태스크 러너 모드(internal task-runner mode) 및 비컨테이너 설치 방식이 향후 버전에서 제거될 것이라고 발표했으므로, 저는 버전을 고정하고 업그레이드는 의도적으로 진행합니다.
n8n 자체도 큰 패키지입니다. 설치 용량은 약 2.9 GB이며, 소스맵(source maps), 타입 파일 및 마크다운을 제외하면 약 1.8 GB가 됩니다. 이는 베타 버전인 Vercel의 Large Functions 기능이 필요합니다.
두 무료 플랜 모두 월별 제한(monthly caps)이 있으며, Vercel Hobby는 이를 초과할 경우 기능을 일시 중지합니다. 일주일 후에 사용량 페이지(Usage page)를 확인해 보세요. 작업이 끝나면 에디터 탭을 닫아주세요. 열려 있는 에디터가 n8n을 계속 활성화 상태로 유지하기 때문입니다.
라이선스에 관해서는, 레포지토리의 글루 코드(glue code)는 MIT 라이선스이지만, n8n은 그렇지 않습니다. n8n은 내부 비즈니스 및 개인 사용을 포괄하는 '공정 코드(fair-code)' 라이선스를 사용하며, 타인을 위해 호스팅할 목적으로는 사용할 수 없습니다. 그리고 Vercel Hobby는 비상업적 용도(non-commercial use)를 위한 것입니다. 따라서 이것은 재판매가 아닌 본인 프로젝트용입니다.
시도해 보기
README에 단계별로 설명되어 있습니다: 암호화 키 생성, 레포지토리를 Vercel에 가져오기(import), 스토리지 탭(Storage tab)에서 Neon 데이터베이스를 생성하고, 두 개의 환경 변수(environment variables) 설정하기, 도메인 추가하기, 그리고 스모크 테스트 스크립트(smoke test script) 실행하기. 배포해 보신다면, 사용량 수치(콜드 스타트 시간, Vercel 사용량, 문제가 발생한 부분 등)를 공유해 주시면 감사하겠습니다. 이슈(issue)나 PR을 열어주세요.
제가 아직 Vercel에서 검증하지 못해서 도움이 필요한 부분은 다음과 같습니다: 동결되었다가 재개된 인스턴스가 어떻게 작동하는지, 그리고 '즉시 응답(respond immediately)' 웹훅이 응답한 후에 작업을 완료하는지 여부입니다.
레포: [https://github.com/muhammad-zulqarnain-awan/n8n-on-vercel]
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기