매일 아침 하는 일, 새 데이터가 오면 복사해서 보내는 일, 폼이 들어오면 알려주는 일. 이런 반복 업무를 코드 없이(혹은 조금만 써서) 워크플로로 묶어주는 도구가 n8n이다. Zapier·Make 같은 클라우드 자동화의 셀프호스팅 버전인데, 달라지는 것은 요금이 아니라 모든 데이터와 실행 기록이 내 서버에 있다는 것이다.
필요한 것은 서버와 컨테이너 하나, 그리고 조금의 논리적 사고다.
n8n은 노드를 연결해 워크플로를 만드는 오픈소스(정확히는 fair-code) 자동화 플랫폼이다. 화면에서 박스(노드)를 연결하면 그 순서대로 작업이 실행되는 방식이라, 프로그래밍 경험이 없어도 흐름을 만들 수 있다. 복잡한 로직이 필요하면 중간에 코드 노드(JavaScript·Python)를 넣을 수도 있다.
| 기능 | 내용 |
|---|---|
| 트리거 | 스케줄(크론), 웹훅, 앱 이벤트 등 실행 시작점 |
| 통합 노드 | 수백 가지 서비스·도구용 기본 노드 (구글, DB, 메신저 등) |
| HTTP Request 노드 | 기본 노드가 없는 서비스도 REST API면 연결 가능 |
| 코드 노드 | JavaScript·Python으로 커스텀 로직 |
| 실행 이력 | 매 실행의 입력·출력을 기록 — 디버깅이 쉽다 |
| 크레덴셜 관리 | API 키·비밀번호를 안전하게 저장해 노드에서 재사용 |
| 에러 워크플로 | 실패 시 다른 워크플로로 알림을 보내는 구조 |
라이선스는 fair-code 방식이라 소스가 공개되어 있고 내부 업무용 사용은 자유롭다. 이 서비스를 파 selling하는 SaaS를 만드는 것만 제한된다 — 자기 서버에서 쓰는 데에는 영향이 없다.
flowchart LR
T1["스케줄 - 정해진 시간"]
T2["웹훅 - 외부 이벤트"]
subgraph SRV["Docker 서버"]
N["n8n 컨테이너"]
DB[("n8n-data - 워크플로·실행이력")]
end
X["외부 API · 서비스"]
AL["알림 - 메신저 · 메일"]
T1 --> N
T2 --> N
N -->|HTTP 요청| X
N --> AL
N --> DB
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
environment:
GENERIC_TIMEZONE: "Asia/Seoul" # 스케줄 트리거의 기준 시간
WEBHOOK_URL: "https://n8n.example.com/" # 외부에서 호출할 주소
volumes:
- /opt/docker/n8n/data:/home/node/.n8n
ports:
- "5678:5678"
GENERIC_TIMEZONE을 설정하지 않으면 스케줄이 UTC로 돌아 "9시에 걸었는데 왜 새벽에 실행되지?"가 된다. WEBHOOK_URL은 웹훅 기능을 외부에 공개할 때 필요한 주소다.
웹UI용 도메인을 프록시 뒤에 붙이고 HTTPS로 서비스하자. 웹훅을 외부 서비스가 호출하려면 외부 접속 경로가 필수이고, 로그인 계정 생성도 여기서 한다.
가장 만족감이 큰 첫 예제: 스케줄 트리거 → HTTP Request → 조건 분기 → 알림. 예를 들어 "매일 아침 9시에 외부 API에서 데이터를 가져와, 값이 비정상이면 메신저로 알림"이다.
화면에서 박스 네 개를 이어 붙이는 것으로 끝나고, 실행 이력 탭에서 매 실행의 입력·출력을 그대로 볼 수 있어 문제 추적이 쉽다.
실행 이력이 n8n의 진짜 가치다. 크론으로 돌리던 스크립트는 실패해도 무엇이 잘못됐는지 알려면 로그를 뒤져야 한다. n8n은 실행 목록에서 실패 건을 클릭하면 어느 노드에서, 어떤 입력으로, 어떤 응답을 받았는지 그대로 보인다. 실패한 노드부터 재실행하는 기능도 있다.
노드가 없다고 좌절하지 말자. 수백 개의 통합 노드가 있지만 결국 빠지는 서비스가 있다. 그럴 때 HTTP Request 노드면 대부분 해결된다 — REST API를 주는 서비스라면 전부 연결 대상이다.
백업은 data 폴더 하나다. 워크플로·실행 이력·크레덴셜이 전부 n8n-data 폴더(SQLite)에 들어있으므로, 이 폴더를 주기 복사하면 백업이 끝난다.
핵심 서비스와의 연결은 웹훅으로. 홈어시스터트 같은 자동화 허브의 이벤트를 n8n 웹훅으로 받아 복잡한 로직을 처리하는 식으로, 이 시리즈의 다른 서비스들과 조합이 자유롭다.
| 증상 | 원인 | 해결 |
|---|---|---|
| 외부에서 웹훅이 안 온다 | WEBHOOK_URL 미설정·도메인 미연결 | 설정과 프록시 확인 |
| 스케줄이 이상한 시간에 돈다 | GENERIC_TIMEZONE 미설정 | Asia/Seoul 설정 후 재시작 |
| 크레덴셜 에러 | 키 만료·권한 | 대상 서비스에서 키 재발급 |
| 워크플로 실패 원인을 모르겠다 | 실행 이력 미확인 | 실행 목록에서 해당 실행 클릭 |
| 필요한 서비스 노드가 없다 | 미지원 서비스 | HTTP Request 노드로 대체 |
실행 횟수가 늘어나면 클라우드 자동화의 요금이 눈에 띄게 커진다. n8n은 실행 무제한에 데이터가 내 서버에 있으니, 트래픽이 있는 업무 자동화라면 셀프호스팅 쪽이 경제적이다. 대신 서버 유지와 업데이트는 내 몫이다.
노드 연결만으로 대부분의 워크플로가 만들어진다. 고급 로직(데이터 가공, 조건 계산)만 코드 노드를 쓰면 되고, 그마저도 예제를 복사하는 수준에서 시작할 수 있다.
기기 제어·집안 자동화는 HA, 웹 API를 오가는 업무 자동화는 n8n이 담당하는 분업이 깔끔하다. 둘 다 웹훅이 있으니 서로 호출하는 연결도 쉽다.
서버 한 대로 충분하다 연재 목차 — 시리즈 소개 · 1화. Home Assistant · 2화. Frigate + go2rtc · 3화. Seafile 13 · 4화. Immich · 5화. Vaultwarden · 6화. Mailcow · 7화. MinIO · 8화. Umami · 9화. GitLab · 10화. Portainer · 11화. Komodo
웹훅·스케줄 워크플로를 실제 업무로 운영 중인 구성입니다.
| 이전 | 11화. Komodo — 30개 컨테이너 업데이트를 버튼 한 번에 (배포 자동화) | 2026-10-01 | |
|---|---|---|---|
| 다음 | 13화. Mosquitto — IoT 기기들의 대화방, MQTT 입문 (연재 완결) | 2026-10-01 |