n8n 셀프 호스팅하기(with caddy)
2026. 04. 02.
n8n이란 무엇일까?
n8n에서 하나 하나의 블록을 노드(node) 라고 한다.
그래서 그 노드들을 연결 시켜서 프로세스들을 실행할 수 있는게 n8n이 하는 역할이다.
즉 노드 기반 워크플로우 자동화 플랫폼이라고 할 수 있다.
자바스크립트를 사용해 노드를 확장할 수도 있고, 다양한 애플리케이션 및 서비스와 연동할 수 있는 노드를 이용해 자동화를 구축할 수도 있다.
특히 중요한건 여타 자동화 서비스들은 대부분이 유료이지만 n8n의 경우 클라우드 서비스를 이용할 때만 유료이고 셀프 호스팅을 사용하면 무료로 사용할 수 있다.
n8n 셀프 호스팅 하기
proxy server는 caddy를 활용해서 n8n을 호스팅해보자.
{
email {$ACME_EMAIL}
}
n8n.example.com {
reverse_proxy n8n:5678 {
flush_interval -1
}
}
caddy의 config 파일은 위와 같이 작성할 수 있다. 이메일의 경우 caddy를 올릴 때 환경변수로 주입하는 값이다. flush_interval -1 값의 경우 버퍼링을 비활성화하고 응답을 즉시 클라이언트로 전달하라는 설정이다.
버퍼링이 켜져있으면 caddy가 응답 데이터를 일정량 모을 때까지 기다렸다가 보내기 때문에, UI에서 실행 상태가 실시간으로 반영되지 않거나 연결이 끊어진 것처럼 보일 수 있다.
services:
caddy:
image: caddy:2.11-alpine
networks:
- proxy-net
ports:
- "80:80"
- "443:443"
volumes:
- caddy_data:/data
- caddy_config:/config
configs:
- source: caddyFile
target: /etc/caddy/Caddyfile
environment:
ACME_EMAIL: "youremail@example.com"
n8n:
image: n8nio/n8n:2.13.4
networks:
- proxy-net
volumes:
- n8n_data:/home/node/.n8n
environment:
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
N8N_HOST: "n8n.example.com"
N8N_PORT: "5678"
N8N_PROTOCOL: "https"
N8N_RUNNERS_ENABLED: "true"
NODE_ENV: "production"
WEBHOOK_URL: "https://n8n.example.com/"
GENERIC_TIMEZONE: "Asia/Seoul"
TZ: "Asia/Seoul"
volumes:
caddy_data:
name: "caddy_data"
caddy_config:
name: "caddy_config"
n8n_data:
name: "n8n_data"
configs:
caddyFile:
file: ./Caddyfile
networks:
proxy-net:
external: true
같은 네트워크로 묶기 때문에 n8n의 port를 따로 호스트와 연결할 필요는 없고, caddy config에서 n8n:5678로 연결한 것으로 충분하다. 연결된 도메인으로 접속하면 회원가입창이 뜨는데, 처음 회원가입한 계정이 admin 계정이 된다.