n8n 셀프호스팅 가이드 - 설정 과정과 해결책

n8n 셀프호스팅 가이드 - 설정 과정과 해결책

GPTERS 스터디장님 서버에서 잘 사용하던 n8n을 개인 서버로 이전하면서 겪은 시행착오와 최종 해결 과정을 공유합니다.

n8n 개인 서버 이전을 결심한 이유

지속적인 활용을 위한 개인 환경 필요성

  • n8n 스터디 참여: 스터디장님 서버에서 워크플로우 구축 경험
  • 활용도 증가: 업무 자동화에 점점 더 의존하게 됨
  • 지속성 고려: 장기적으로 안정적인 개인 환경이 필요하다고 판단
  • 확장성: 나만의 워크플로우를 자유롭게 실험하고 싶었음

기본 지식: Docker가 뭔가요?

Docker 쉽게 이해하기

n8n 셀프호스팅을 하려면 Docker라는 도구를 사용해야 합니다.

Docker를 자세히 설명하면:
- 프로그램 + 실행환경 + 설정을 하나의 "컨테이너"로 패키징
- 마치 "완전히 꾸려진 방"을 통째로 옮기는 것
- 어떤 컴퓨터에서든 동일하게 작동
- 여러 프로그램을 서로 간섭 없이 독립적으로 실행 가능

예시:
- n8n 컨테이너: n8n + Node.js + 필요한 라이브러리들
- 나중에 블로그도 추가한다면: Ghost 컨테이너를 별도로 실행
docker containers
docker containers

Docker 설치는 간단해요

Windows/Mac에서는 Docker Desktop만 설치하면 끝입니다.

첫 번째 난관: CLI와의 만남

CLI가 뭔가요?

CLI는 Command Line Interface의 줄임말로, 마우스 클릭 대신 텍스트로 명령어를 입력하는 방식입니다.

일상 비유:
- GUI (그래픽 인터페이스): 리모컨 버튼 누르기
- CLI (명령어 인터페이스): "채널 11번으로 바꿔줘" 라고 말하기

명령어 입력의 부담감

Docker를 사용하려면 PowerShell이나 CMD에서 명령어를 직접 입력해야 합니다.

GUI에 익숙한 상태에서 갑자기 명령어를 입력해야 하니 낯설고 부담스럽습니다.

# 이런 명령어를 정확히 입력해야 함
docker run -d --name n8n -p 5678:5678 n8nio/n8n

# 한 글자라도 틀리면
docker run -d --name n8n -p 5678:5678 n8nio/n8m  # ← 마지막 글자 틀림

결과: 에러 메시지와 함께 실패...

구세주: Claude와의 디버깅 과정

Claude가 진짜 도움이 됐어요

혼자서는 막막할 때, Claude에게 하나씩 물어봤습니다.

내가 물어본 것들:

  • "Docker 명령어에서 -d가 뭐야?"
  • "포트 5678이 이미 사용 중이라는데 어떻게 확인해?"
  • "에러 메시지가 이런데 무슨 의미?"

Claude의 답변 스타일:

Claude: "`-d` 옵션은 백그라운드에서 실행한다는 뜻입니다. 
쉽게 말하면 프로그램을 실행하고 나서도 터미널을 계속 사용할 수 있게 해줘요."

나: "아하! 그럼 -d 없으면?"

Claude: "터미널이 그 프로그램에 묶여서 다른 작업을 못해요."

이런 식으로 하나씩 차근차근 설명해줘서 이해할 수 있었습니다.

초기 접근: Docker로 기본 설치

첫 번째 시도

Claude의 도움으로 용기를 내서 명령어를 입력해봤습니다.

# 기본 n8n 컨테이너 실행
docker run -d --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n n8nio/n8n

성공! 하지만...

  • 로컬 환경: localhost:5678로 정상 접근 가능 ✅
  • 외부 접근: 도메인을 통한 접속 실패 ❌

쉽게 말하면: 집 안에서는 TV가 잘 나오는데, 밖에서 리모컨으로 채널을 바꾸려니 안 되는 상황이었죠.

두 번째 난관: 에러 메시지의 홍수

"Port already in use" 에러와의 사투

$ docker run -p 5678:5678 n8nio/n8n
Error: bind: address already in use

당황한 나: "뭐가 이미 쓰고 있다는 거지?"

Claude와 함께 해결하기

: "포트가 이미 사용 중이라는데 어떻게 확인해요?"

Claude: "이 명령어로 확인해보세요."

# Windows에서 포트 사용 현황 확인
netstat -ano | findstr :5678

: "뭔가 나오긴 하는데 이게 뭔지 모르겠어요"

Claude: "PID 번호를 보고 해당 프로세스를 종료하면 됩니다."

# 프로세스 강제 종료
taskkill /PID [번호] /F

이런 식으로 문제 → 질문 → 해결책 → 또 다른 문제 루프를 반복했습니다.

보안 설정의 늪: Traefik과의 첫 만남

Traefik이란?

외부에서 안전하게 접속하려면 HTTPS가 필요하다고 해서 Traefik을 시도해봤습니다.

Traefik을 쉽게 설명하면:
집 앞에 있는 경비아저씨 같은 역할
- 외부 방문자를 확인하고 안전하게 집 안으로 안내
- 신분증(SSL 인증서)도 자동으로 발급해줌

docker-compose.yml과의 첫 만남

# 이런 파일을 만들어야 한다고...
version: '3.8'
services:
  traefik:
    image: traefik:v2.9
    command:
      - --entrypoints.web.address=:80

나의 상태: "yaml 파일이 뭐고, 들여쓰기가 왜 이렇게 중요하다는 거지?"

Cloudflare 도메인 구매

스터디장 이모카님: "Cloudflare 좋더라, 거기서 도메인 사면 싸!"

그래서 바로 imiwork.com을 구매했는데...

Cloudflare의 몰랐던 기능들

당시 내 생각:
"Cloudflare = 도메인 파는 곳"

실제로는:
"Cloudflare = 인터넷의 방패막이 + 가속기 + 도메인 관리 + 터널링까지"

그 중에서도 Cloudflare Tunnel이라는 기능을 발견했습니다.
사실 이렇게 하면 쉽다고 전달받았음...

대참사: 이중 프록시의 정체

충돌 발견

문제는 두 개의 문지기가 동시에 일하고 있었다는 것이었습니다.

상황 설명:
집에 가는 방법이 두 개 생긴 상황

방법1 (Cloudflare Tunnel): 
방문자 → 지하터널 → 우리 집

방법2 (Traefik):
방문자 → 정문 → 우리 집

문제: 두 길이 동시에 열려있어서 방문자가 헷갈림! 💥

Claude와 함께 디버깅

: "로컬에서는 되는데 도메인으로는 안 되는 이유가 뭘까요?"

Claude: "DNS 설정부터 확인해보죠. 이 명령어로 확인해보세요."

nslookup n8n.imiwork.com

: "이상한 IP가 나오는데..."

Claude: "Cloudflare를 거치고 있네요. 혹시 터널 설정과 직접 접속이 충돌하는 것 같은데..."

이런 식으로 단계적으로 원인을 찾아갔습니다.

해결책: 간단한 길 선택하기

두 가지 방법 비교

Traefik 방식 (정문 관리):

  • 장점: 모든 걸 내가 직접 컨트롤
  • 단점: 경비아저씨(Traefik) 관리, 출입증(SSL) 발급, 보안 시설 운영까지 모든 걸 직접 해야 함
  • CLI 초보에게: 설정 파일만 몇 개, 명령어도 복잡

Cloudflare Tunnel 방식 (지하터널):

  • 장점: Cloudflare가 보안, SSL, 모니터링까지 다 알아서 해줌
  • 단점: Cloudflare에 의존
  • CLI 초보에게: 명령어 몇 개면 끝

결론: "완벽한 집보다 살기 편한 집이 낫다!"

n8n 셀프호스팅 최종 해결 방법

Step 1: n8n 간단하게 실행

docker run -d \
  --name n8n \
  --restart unless-stopped \
  -p 127.0.0.1:5678:5678 \
  -v n8n_data:/home/node/.n8n \
  n8nio/n8n

Claude의 설명:

  • -d: 백그라운드 실행
  • --restart unless-stopped: 컴퓨터 재시작해도 자동으로 다시 시작
  • -p 127.0.0.1:5678:5678: 로컬에서만 접근 가능하게 포트 오픈
  • -v n8n_data:/home/node/.n8n: 데이터 저장 공간 연결

Step 2: Cloudflare Tunnel 설정

# ~/.cloudflared/config.yml
tunnel: n8n-tunnel
ingress:
  - hostname: n8n.imiwork.com
    service: http://localhost:5678

의미: "n8n.imiwork.com으로 오는 손님을 내 컴퓨터 5678번 방으로 안내해줘"

Step 3: 터널 가동

cloudflared tunnel run n8n-tunnel

결과: 지하터널 개통! 🎉

성공! 최종 결과물

✅ 완성된 환경

  • 접속: https://n8n.imiwork.com
  • 보안: 자동 HTTPS + Cloudflare 보안
  • 속도: CDN으로 빠른 접속
  • 관리: 거의 손댈 게 없음

CLI 초보자를 위한 현실적 조언

💡 명령어가 낯설어도 괜찮아요

GUI에 익숙한 상태에서 CLI는 당연히 낯설 수 밖에 없습니다. 복사-붙여넣기만 잘해도 90% 해결됩니다.

💡 AI 어시스턴트를 적극 활용하세요

  • 에러 메시지 그대로 복사해서 질문
  • "이 명령어가 무슨 뜻인지 쉽게 설명해주세요"
  • "단계별로 천천히 알려주세요"

💡 한 번에 완벽하려 하지 말기

"일단 되게 만들기"부터 시작하세요. 최적화는 나중에!

💡 백업은 필수

뭔가 잘못되면 처음부터 다시 할 준비를 하세요. 데이터는 미리 백업!

n8n

마무리

"CLI가 낯설어서 망설였는데, Claude의 도움으로 한 단계씩 해보니 생각보다 할 만했다"

이것이 이번 n8n 개인 서버 구축에서 얻은 가장 큰 교훈이었습니다.

여러분도 명령어 입력이 낯설다고 포기하지 마시고, AI의 도움을 받아서 차근차근 해보세요! 🚀


Subscribe to SENSE & AI

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
[email protected]
Subscribe