매월 10만 원 아끼는 n8n 셀프호스팅, 도커와 Nginx로 구축

1. 자동화 비용의 딜레마와 셀프호스팅

업무 자동화의 세계에 발을 들이면 처음에는 신세계가 열립니다. 이메일이 자동으로 분류되고 고객 문의가 슬랙으로 들어옵니다. 하지만 즐거움도 잠시, 곧 현실적인 문제에 부딪힙니다. 바로 비용입니다. 자피어(Zapier)나 메이크(Make) 같은 클라우드 기반 툴들은 워크플로우가 복잡해지고 실행 횟수가 늘어날수록 구독료가 기하급수적으로 올라갑니다.

처음엔 무료로 시작했지만 어느새 월 5만 원, 10만 원이 통장에서 빠져나가는 것을 보며 자동화를 주저하게 됩니다. 여기서 n8n 셀프호스팅이 강력한 대안으로 등장합니다. 오픈소스인 n8n을 내 개인 서버에 직접 설치하면, 월 5천 원에서 1만 원 수준의 저렴한 서버 비용만으로 횟수 제한 없는 무제한 자동화 환경을 구축할 수 있습니다.

물론 서버를 직접 다룬다는 것이 두렵게 느껴질 수 있습니다. 리눅스 명령어, 도커, 데이터베이스 같은 용어들이 낯설기 때문입니다. 하지만 걱정하지 마세요. 이 가이드는 개발자가 아닌 분들도 따라 할 수 있도록 복사해서 붙여넣기만 하면 되는 수준으로 준비했습니다. 딱 30분만 투자하면 여러분은 평생 무료로 쓸 수 있는 나만의 자동화 비서를 얻게 됩니다.

2. 전체 구조 이해하기

무작정 명령어를 입력하기 전에 우리가 만들 서버의 구조를 이해하는 것이 중요합니다. 집을 지을 때 설계도를 먼저 보는 것과 같습니다.

우리의 목표는 튼튼하고 안전한 집을 짓는 것입니다. 가장 밑바닥에는 튼튼한 땅인 리눅스 서버(Ubuntu)가 있습니다. 그 위에 컨테이너라는 조립식 주택 기술인 도커(Docker)를 올립니다. 집 안에는 살림살이를 저장할 창고인 포스트그레SQL(PostgreSQL) 데이터베이스를 둡니다. 그리고 외부에서 도둑이 들지 못하게 문지기 역할을 하는 엔진엑스(Nginx)를 기반으로 HTTPS라는 보안을 설정합니다.

이 구조는 전 세계 수많은 개발자가 사용하는 가장 표준적이고 안정적인 방식입니다.

3. 서버와 도메인

가장 먼저 클라우드 서버(VPS)가 필요합니다. 아마존 웹서비스(AWS)의 라이트세일, 벌쳐(Vultr), 디지털오션 등 어디든 상관없습니다. 사양은 CPU 2코어, 램 4GB 정도를 추천합니다. 너무 낮은 사양은 자동화가 복잡해질 때 서버가 멈출 수 있으므로 약간의 여유를 두는 것이 좋습니다. 운영체제는 우분투(Ubuntu) 22.04 LTS 버전을 선택합니다.

그리고 도메인이 하나 필요합니다. 가비아나 호스팅케이알 같은 곳에서 저렴한 도메인을 하나 구매합니다. 그리고 DNS 설정에서 A 레코드를 추가하여 구매한 도메인이 방금 만든 서버의 IP 주소를 가리키도록 설정해야 합니다. 서브 도메인을 연결해 두는 것이 일반적입니다.

4. 도커와 도커 컴포즈

서버에 접속했다면 가장 먼저 도커를 설치해야 합니다. 도커는 프로그램 설치를 스마트폰 앱 설치처럼 간편하게 만들어주는 도구입니다. 복잡한 의존성 문제를 해결해주기 때문에 초보자에게는 선택이 아닌 필수입니다.

터미널 창을 열고 도커와 도커 컴포즈를 설치합니다. 설치가 완료되면 이제 docker-compose.yml 파일을 만들 차례입니다. 이 파일 하나만 있으면 데이터베이스와 n8n을 동시에 실행하고 서로 연결까지 자동으로 해줍니다.

적당한 폴더를 만들고 파일을 생성한 뒤, 데이터베이스를 설정합니다. n8n은 기본적으로 SQLite를 지원하지만, 본격적인 운영을 위해서는 반드시 PostgreSQL을 써야 합니다. SQLite는 파일 하나에 데이터를 쓰기 때문에 동시에 여러 작업이 몰리면 에러가 날 수 있습니다. 반면 PostgreSQL은 수천 개의 작업도 동시에 처리할 수 있는 성능을 자랑합니다.

5. 환경변수 관리와 암호화 키

초보자들이 가장 많이 하는 실수가 비밀번호나 API 키를 설정 파일에 그대로 적어두는 것입니다. 이는 집 열쇠를 현관문 앞에 두고 다니는 것과 같습니다. .env라는 별도의 파일을 만들어 중요한 정보는 변수로 관리해야 합니다.

특히 n8n을 설치할 때 N8N_ENCRYPTION_KEY라는 항목이 있습니다. 이것은 매우 중요합니다. 여러분이 n8n에 저장할 구글 로그인 정보, 슬랙 토큰 같은 민감한 정보를 암호화하는 데 쓰이는 마스터 키입니다. 이 키를 잃어버리면 나중에 백업을 복구해도 저장된 계정 정보를 하나도 쓸 수 없게 됩니다. 아무렇게나 적지 말고 랜덤한 긴 문자열을 생성해서 안전한 곳에 따로 기록해 두어야 합니다.

또한 타임존(GENERIC_TIMEZONE) 설정도 잊지 마세요. 이 설정을 Asia/Seoul로 해두지 않으면, 매일 아침 9시에 보내려던 알림이 새벽에 발송되는 참사가 일어납니다.

6. Nginx와 HTTPS 적용

도커로 n8n을 실행했다면 이제 내부적으로는 작동하고 있을 겁니다. 하지만 아직 외부에서 접속할 수는 없습니다. 보안을 위해 127.0.0.1이라는 내부 주소로만 열어뒀기 때문입니다. 이제 외부의 요청을 받아서 안전하게 내부로 전달해 줄 문지기, Nginx를 설정할 차례입니다.

Nginx를 리버스 프록시(Reverse Proxy)로 설정한다는 것은 마치 호텔의 프런트 데스크를 운영하는 것과 같습니다. 손님(사용자)이 오면 프런트(Nginx)에서 먼저 확인을 하고 객실(n8n)로 안내하는 방식입니다. 이렇게 하면 외부 공격을 1차적으로 막아낼 수 있습니다.

여기에 Let’s Encrypt를 사용하여 SSL 인증서를 발급받습니다. 웹브라우저 주소창에 자물쇠 모양이 뜨게 하는 그것입니다. 이것이 없으면 여러분이 로그인할 때 입력하는 비밀번호가 인터넷상에 그대로 노출될 수 있습니다. 서트봇(Certbot)이라는 도구를 사용하면 명령어 한 줄로 인증서 발급부터 갱신 설정까지 자동으로 처리할 수 있습니다.

7. 백업 전략

힘들게 구축한 자동화 시스템이 서버 고장으로 한순간에 날아간다면 정말 힘들 것입니다. 셀프호스팅의 유일한 단점은 백업을 내가 챙겨야 한다는 점입니다만 어렵지 않습니다.

도커 볼륨을 사용했다면 데이터는 컨테이너가 아닌 서버의 특정 공간에 저장되어 있습니다. 주기적으로 PostgreSQL의 데이터를 덤프(Dump) 떠서 파일로 저장하고, 이 파일을 구글 드라이브나 S3 같은 외부 저장소로 보내는 간단한 스크립트를 짜두면 됩니다. 크론(Cron) 탭을 이용해 매일 새벽 4시에 이 작업이 자동으로 수행되게 설정합니다.

8. 자주 겪는 문제와 해결 방법

설치 과정에서 문제가 생기는 것은 당연합니다. 가장 흔한 문제는 502 Bad Gateway 에러입니다. 이것은 문지기(Nginx)는 있는데 집주인(n8n)이 아직 잠에서 덜 깬 경우입니다. n8n이 부팅되는 데 시간이 조금 걸리니 1분 정도 기다렸다가 새로고침 해보세요.

웹훅이 작동하지 않는다면 도메인 설정을 확인해야 합니다. 환경변수에 입력한 웹훅 URL이 실제 접속하는 주소와 토씨 하나라도 다르면 보안 정책상 작동하지 않습니다. 특히 http와 https를 혼동하는 경우가 많으니 꼼꼼히 체크해야 합니다.

9. 결론

이제 여러분은 남의 집에 세 들어 사는 것이 아니라, 내 땅에 내 집을 지은 집주인이 되었습니다. 더 이상 이번 달 워크플로우 실행 횟수가 초과될까 봐 전전긍긍하지 않아도 됩니다.

셀프호스팅은 단순한 비용 절감을 넘어 기술에 대한 이해도를 높여줍니다. 리눅스와 도커를 다뤄본 경험은 앞으로 여러분이 어떤 IT 프로젝트를 하든 든든한 자산이 될 것입니다. 지금 당장 터미널을 열고 시작해 보기 바랍니다.

자주 묻는 질문 (FAQ)

Q. 리눅스를 전혀 몰라도 가능한가요?

A. 가능합니다. 인터넷에 있는 가이드의 명령어들을 복사해서 붙여넣는 것만으로도 충분히 설치할 수 있습니다. 다만 문제가 생겼을 때를 대비해 기본적인 명령어(폴더 이동, 파일 생성 등) 정도는 유튜브를 통해 익혀두시는 것을 추천합니다.

Q. 서버 비용은 얼마나 드나요?

A. 한국 리전이 있는 라이트세일이나 벌쳐 기준으로 월 5달러에서 10달러 사이면 충분합니다. 초반에는 가장 저렴한 플랜으로 시작했다가, 자동화 작업이 많아져서 서버가 느려지면 그때 상위 플랜으로 업그레이드하면 됩니다.

Q. n8n 업데이트는 어떻게 하나요?

A. 도커를 사용하면 업데이트도 매우 쉽습니다. 터미널에서 docker compose pull 명령어로 최신 이미지를 다운로드하고, docker compose up -d 명령어로 다시 실행하면 됩니다. 데이터는 보존된 채 프로그램만 최신 버전으로 교체됩니다.

이 글이 마음에 드세요?

RSS 피드를 구독하세요!

댓글 남기기