n8n 셀프호스팅 가이드 - 설정 과정과 해결책
GPTERS 스터디장님 서버에서 잘 사용하던 n8n을 개인 서버로 이전하면서 겪은 시행착오와 최종 해결 과정을 공유합니다.
n8n 개인 서버 이전을 결심한 이유
지속적인 활용을 위한 개인 환경 필요성
- n8n 스터디 참여: 스터디장님 서버에서 워크플로우 구축 경험
- 활용도 증가: 업무 자동화에 점점 더 의존하게 됨
- 지속성 고려: 장기적으로 안정적인 개인 환경이 필요하다고 판단
- 확장성: 나만의 워크플로우를 자유롭게 실험하고 싶었음
기본 지식: Docker가 뭔가요?
Docker 쉽게 이해하기
n8n 셀프호스팅을 하려면 Docker라는 도구를 사용해야 합니다.
Docker를 자세히 설명하면:
- 프로그램 + 실행환경 + 설정을 하나의 "컨테이너"로 패키징
- 마치 "완전히 꾸려진 방"을 통째로 옮기는 것
- 어떤 컴퓨터에서든 동일하게 작동
- 여러 프로그램을 서로 간섭 없이 독립적으로 실행 가능
예시:
- n8n 컨테이너: n8n + Node.js + 필요한 라이브러리들
- 나중에 블로그도 추가한다면: Ghost 컨테이너를 별도로 실행

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 어시스턴트를 적극 활용하세요
- 에러 메시지 그대로 복사해서 질문
- "이 명령어가 무슨 뜻인지 쉽게 설명해주세요"
- "단계별로 천천히 알려주세요"
💡 한 번에 완벽하려 하지 말기
"일단 되게 만들기"부터 시작하세요. 최적화는 나중에!
💡 백업은 필수
뭔가 잘못되면 처음부터 다시 할 준비를 하세요. 데이터는 미리 백업!

마무리
"CLI가 낯설어서 망설였는데, Claude의 도움으로 한 단계씩 해보니 생각보다 할 만했다"
이것이 이번 n8n 개인 서버 구축에서 얻은 가장 큰 교훈이었습니다.
여러분도 명령어 입력이 낯설다고 포기하지 마시고, AI의 도움을 받아서 차근차근 해보세요! 🚀