셀프호스팅 AI 도구를 고객에게 팔 때 — n8n의 내부 업무 목적과 Open WebUI의 50명이 갈리는 자리
셀프호스팅 AI 도구 다섯 개의 라이선스 원문을 직접 받아 읽었어요. n8n은 용도로, Dify는 구성으로, Open WebUI는 브랜딩 제거에 인원 임계로 선을 그어요. 선의 종류가 서로 달라요.
AI 기술을 누구나 쉽게 활용할 수 있도록 실전 가이드를 작성합니다. ChatGPT, Claude, AI 자동화, SEO 분야를 전문으로 다룹니다.
n8n 워크플로 하나로 매출 리포트·이메일 발송·DB 업데이트를 자동화하는 한국 노코드 운영자가 빠르게 늘고 있어요. 문제는 워크플로 한 노드만 실패해도 전체가 멈추는 ‘단일 실패 지점’ 구조. 아래 안정성 패턴 7가지를 갖추면 오래 멈추지 않고 굴리는 게 현실적이 됩니다. 이 글에선 Continue on Fail·Error Trigger·Sub-workflow 격리·모니터링·백업까지 7가지 실전 패턴을 다룹니다.
![]()
Continue on Fail은 n8n 모든 노드에 켤 수 있는 옵션이에요. 켜면 ‘이 노드가 실패해도 워크플로 멈추지 말고 다음 노드로 진행’이 돼요. 100명 이메일 발송 워크플로에서 3번째 주소가 잘못됐을 때 나머지 97명은 정상 발송하는 식.
가장 흔한 사고는 ‘이 옵션을 안 켜놨다가 한 명 때문에 전체 멈춤’ 패턴이에요. 기본값이 OFF라 명시적으로 켜야 하고, 운영용 워크플로라면 외부 API 호출 노드에는 대체로 켜두는 쪽이 안전해요. 단 ‘이 노드가 실패하면 다음을 진행하면 안 되는’ 핵심 노드(예: 결제 확정)에는 OFF 유지가 맞아요.
주의할 점은 Continue on Fail이 켜진 노드 에러는 워크플로 자체가 ‘성공’으로 종료된다는 거예요. Error Trigger 노드가 트리거 안 되니까 에러를 인지하지 못하는 사고가 흔해요. 이 경우 별도 IF 노드로 ‘에러 여부 체크 후 Slack 알림’ 분기를 만들어두는 게 보완책이에요.
Retry on Error는 ‘이 노드가 실패하면 N초 기다린 후 M번 재시도’ 옵션이에요. 흔히 쓰는 설정은 ‘5회 재시도, 간격 60초’ 정도로, 일시 네트워크 장애·API 레이트 한도 같은 transient error에 효과적입니다.
Continue on Fail과 조합하면 강력해요. ‘먼저 3번 재시도 → 그래도 실패하면 Continue로 다음 노드 진행’이 외부 API 의존 워크플로에서 잘 통하는 조합이에요. 잠깐 지나가는 장애는 이렇게만 걸어둬도 사람이 개입하기 전에 스스로 풀리는 경우가 많고, 새벽에 알림 받고 깨는 일 자체가 줄어요.
다만 모든 에러가 재시도로 해결되진 않아요. 401 Unauthorized·403 Forbidden 같은 인증 에러는 재시도해도 같은 결과예요. 그래서 4xx 클라이언트 에러는 재시도 대상에서 빼두는 게 좋아요. 재시도 조건을 코드별로 세밀하게 거는 방법은 버전마다 다르니, 지금 쓰는 n8n 버전의 공식 문서에서 사용할 수 있는 옵션을 확인하세요.
재시도를 켜기 전에 노드 성격도 한 번 갈라 봐야 해요. 메일 발송이나 시트 행 추가처럼 바깥에 흔적을 남기는 노드는 요청이 실제로는 처리됐는데 응답만 늦게 끊긴 경우 재시도가 그대로 중복이 돼요. 이런 노드에는 이미 처리한 건을 기록해 두는 장치가 먼저 필요한데, Remove Duplicates 노드의 History Size 같은 도구별 장치가 어디까지 막아 주는지는 같은 데이터를 두 번 처리하지 않게 막는 다섯 가지에 정리해 뒀어요.
Error Trigger는 별도 워크플로의 시작 노드예요. ‘메인 워크플로’ 설정에서 ‘에러 워크플로’로 지정하면, 메인이 실패할 때 Error Trigger 워크플로가 자동 실행돼요.
권장 구조는 단순해요. 메인 워크플로 여러 개에 Error Trigger 워크플로 하나를 물려두는 식이에요. Error Trigger 안에는 ‘Slack·텔레그램·이메일 알림 + 실패 데이터 DB 저장 + 운영자에게 SMS’ 3박자 노드가 들어가요. 알림 본문에는 워크플로 이름·실패 노드·에러 메시지·실행 ID·타임스탬프 5가지를 자동으로 채워 넣으면 원인 추적이 훨씬 빨라져요.
주의할 점은 Continue on Fail이 켜진 노드 에러는 Error Trigger를 트리거 안 한다는 거예요. ‘일부 실패가 있어도 워크플로는 성공’으로 처리되니까 Error Trigger 입장에선 ‘아무 일도 없는’ 셈. 이 경우 메인 워크플로 안에 별도 ‘에러 카운트 + 임계값 초과 시 알림’ 로직을 IF 노드로 짜는 게 보완책이에요.

복잡한 워크플로 하나에 모든 로직을 넣으면 한 노드 에러가 전체를 멈춰요. 그래서 노드 수 상한을 스스로 정해두는 게 좋아요. 화면에 한눈에 안 들어올 만큼 커졌다면 그게 분리 신호고, 그 이상은 Execute Workflow 노드로 sub-workflow를 호출해 나누는 게 안정성·디버깅 양쪽에서 유리해요.
분리 예시 — ‘주간 매출 리포트’ 메인 워크플로 안에:
각 sub-workflow가 독립적으로 실패 가능하고, 메인은 ‘어느 sub에서 실패했는지’ 명확하게 알 수 있어요. 어디부터 봐야 할지가 좁혀지니 디버깅에 쓰는 시간도 눈에 띄게 줄어요.
운영 안정성의 핵심은 ‘에러 발생 후 빠르게 인지하기’예요. 운영 규모가 조금 커졌을 때 갖춰두면 좋은 5박자 모니터링:
| 모니터링 항목 | 도구 | 알림 임계값 | 비용 |
|---|---|---|---|
| Slack·텔레그램 즉시 알림 | n8n Webhook | 에러 1건 | 무료 |
| 일일 실행 통계 | Sheets·Notion | 일 100건 미만 | 무료 |
| 외부 APM | Sentry·DataDog | 5분 5건+ | $0~$50/월 |
| 서버 리소스 | Docker stats | CPU 80%+ | 무료 |
| 백업 큐 | Redis·SQLite | 큐 50건+ | 무료~$5/월 |
대부분 무료이거나 저비용 도구로 구성할 수 있어요. 업무나 매출이 자동화에 크게 기대고 있을수록 우선순위가 올라가고요. 요금제는 서비스마다 자주 바뀌니 정확한 비용은 각 서비스의 공식 요금 페이지에서 확인하세요.
외부 API 의존 워크플로에서 가장 흔한 실패는 레이트 한도 초과예요. 메일 발송 API는 분당 요청 수, OpenAI는 토큰 기준, 메신저 봇은 초·분 단위 메시지 수처럼 한도를 거는 기준 자체가 서비스마다 달라요. 그래서 대응하기 전에 쓰는 API의 공식 문서에서 현재 한도가 어떤 단위로 걸려 있는지부터 확인해야 해요.
대응 패턴 두 가지 — 첫째, Wait 노드로 의도적 대기. 발송 사이에 몇 초 대기를 끼우면 호출 속도가 한도 아래로 내려가요. 대기 시간은 확인한 한도에 맞춰 정하면 돼요. 둘째, 동시 실행 수 제한. 워크플로당 동시 실행을 낮게 잡으면 순간적으로 몰리는 호출 자체가 줄어요. 설정 방법과 환경변수 이름은 버전에 따라 다르니 공식 문서를 참고하세요.
Retry on Error도 보조 효과가 있어요. ‘429 Too Many Requests’ 응답을 받으면 잠시 기다린 후 재시도하도록 걸어두는 거예요. 세 패턴 조합이 외부 API 의존 워크플로의 ‘안정성 3박자’예요.
n8n은 워크플로 정의·credentials·실행 이력을 PostgreSQL에 저장해요. self-hosted로 돌릴수록 백업은 온전히 운영자 몫인데, 가장 흔한 함정은 ‘백업은 돌고 있는데 복구를 해본 적이 없는’ 상태예요. 사고가 나야 백업 파일이 쓸 만한지 알게 되죠.
표준 3박자:
3박자 모두 자동화할 수 있고, 스토리지 비용도 크지 않아요. 한 번이라도 복구를 해봤다면 진짜 사고가 났을 때 당황하지 않아요. 리허설의 목적은 백업 파일의 존재 확인이 아니라 ‘복구 절차가 실제로 작동하는지’ 확인이에요.
n8n 워크플로 안정성은 ‘하나의 거대한 워크플로 + 손가락 빌고 운영’ 방식에서 ‘작은 sub-workflow + 7박자 안전망’ 방식으로 옮겨가고 있어요. Continue on Fail·Retry·Error Trigger·Sub-workflow·모니터링·Wait·백업 7가지는 운영을 오래 끌고 가다 보면 결국 다 필요해지는 것들이에요.
지금 당장 할 액션은 단순해요. 운영 중인 워크플로 중 ‘외부 API 호출’ 노드 몇 개에 Continue on Fail과 Retry on Error를 켜두는 거예요. 오래 걸리는 작업이 아닌데, 며칠만 지나도 알림 창이 눈에 띄게 조용해지는 걸 체감하게 돼요.
아래는 특정 사건 기록이 아니라, 원인과 결과의 구조가 반복돼서 자주 마주치게 되는 전형적인 실패 패턴이에요. 내 워크플로에 같은 구멍이 있는지 대조해보는 용도로 읽으면 좋아요.
다섯 가지 모두 위 7가지 패턴으로 예방하거나 피해를 줄일 수 있는 유형이에요. 패턴을 한 번에 다 적용하기 부담스럽다면, 지금 운영 중인 워크플로에서 가장 먼저 터질 것 같은 지점부터 하나씩 막아가면 돼요.
n8n 신규 운영자가 ‘안정 운영 단계’까지 도달하는 6개월 로드맵:
이 정도 운영 경험이 쌓이면 외주로 자동화 구축·운영을 맡는 것도 가능해져요. 단가는 지역·업무 범위·계약 형태에 따라 편차가 크니, 실제 공고나 프리랜서 플랫폼의 최근 사례를 직접 확인하는 게 정확해요. 이 일은 ‘기술’이라기보단 ‘운영 노하우와 패턴 적용 경험’에 가까워서, 무중단으로 돌린 기간 자체가 설득력 있는 포트폴리오가 돼요.
매주 한 번 운영 워크플로 전체를 훑는 10가지 점검 체크리스트:
10가지가 모두 OK라면 웬만한 사고는 이미 예방 범위 안에 들어와 있는 상태예요. ‘정기 점검 → 안정 운영 기간 확보 → 외주 시장 진입’이 무리 없는 경로입니다.
마지막으로 신규 운영자가 자주 빠지는 실수 5가지를 정리하면:
첫 번째 실수는 ‘Continue on Fail을 모든 노드에 켜기’예요. 핵심 노드(결제 확정·DB 쓰기)는 OFF가 맞아요. 무차별 ON은 ‘실패해도 워크플로가 성공으로 보고됨’ 사고를 만들어요. 노드 성격별 분리 적용이 표준이에요.
두 번째 실수는 ‘Error Trigger 한 개로 모든 워크플로 커버’예요. 운영 워크플로 20개를 하나의 Error Trigger로 받으면 어디서 실패했는지 추적이 어려워요. 카테고리별로 2~3개 분리 운영이 디버깅 효율 우세예요.
세 번째 실수는 ‘백업을 운영 서버 같은 디스크에 저장’이에요. 디스크가 망가지면 백업도 함께 손실돼요. S3·Backblaze 같은 외부 스토리지에 따로 두는 게 기본이고, 이 정도 용량이면 비용도 크지 않아요.
네 번째 실수는 ‘credentials 평문 저장’이에요. n8n은 환경변수로 credentials 분리가 가능하니 .env 파일을 활용하세요. 공개 저장소에 워크플로 JSON을 push했는데 토큰이 평문으로 박혀 있으면 순식간에 스캔 봇에 노출돼요.
다섯 번째 실수는 ‘버전 관리 없이 워크플로 수정’이에요. n8n 자체 ‘과거 버전 복원’ 기능이 제한적이라 Git export와 정기 push가 필요해요. 새 변경사항이 사고를 만들었을 때 곧바로 되돌릴 수 있는 게 운영 안정성의 마지막 보루예요.
Continue on Fail은 ‘이 노드가 실패해도 워크플로 멈추지 말고 다음 노드로 진행’이에요. 예를 들어 ‘100명 이메일 발송’ 워크플로에서 3번째 사람만 주소 오류로 실패해도 나머지 97명 발송을 계속 진행해요. Retry on Error는 ‘이 노드가 실패하면 N초 기다린 후 M번 재시도’예요. 일시적인 네트워크 장애·API 레이트 한도 같은 transient error에 효과적. 두 옵션은 같은 노드에 동시 적용 가능하고, ‘먼저 3번 재시도 → 그래도 실패하면 Continue’ 조합이 외부 API에 의존하는 워크플로에서 무난하게 잘 통해요.
Error Trigger는 워크플로 ‘전체 실패’ 시 알림을 받는 별도 워크플로의 시작점이에요. 예를 들어 ‘주간 매출 리포트 생성’ 워크플로가 실패하면 Error Trigger가 트리거된 별도 워크플로에서 Slack·이메일로 알림 발송. 여기서 가장 흔한 착각은 ‘Continue on Fail을 켰는데 Error Trigger도 실행될 줄 알았던 케이스’예요. Continue on Fail이 켜진 노드 에러는 워크플로 자체가 ‘성공’으로 종료되니까 Error Trigger가 트리거 안 돼요. 두 메커니즘은 다른 시나리오용입니다.
복잡한 워크플로 하나에 모든 로직을 넣으면 한 노드 에러가 전체를 멈춰요. Sub-workflow로 분리하면 ‘이메일 발송 sub’와 ‘DB 업데이트 sub’가 독립적으로 실패할 수 있어 격리 효과가 커요. 워크플로 하나가 화면에 한눈에 안 들어올 만큼 커졌다면 그게 분리 신호예요. 노드 수 상한을 스스로 정해두고 그 이상은 Sub-workflow로 나누면 안정성·디버깅 양쪽 모두에서 유리해요. n8n은 Execute Workflow 노드로 sub-workflow 호출 가능하고, 에러도 호출자에게 명확하게 전달돼요.
5가지가 필수예요. (1) Slack·텔레그램 즉시 알림 — ‘에러 발생 + 5분 안에 인지’가 표준. (2) 일일 실행 통계 — 매일 아침 ‘어제 N건 실행, M건 실패’ 요약 받기. (3) Sentry·DataDog 같은 외부 APM 연동 — n8n 자체 로그 외 통합 가시화. (4) Self-hosted 시 CPU·메모리 모니터링 — Docker 컨테이너 죽으면 알림. (5) 백업 큐 — 외부 API 장기 장애 시 작업을 로컬 큐에 적재해 복구 후 재실행. 운영 규모가 조금 커졌다면 이 다섯 가지는 갖춰두는 게 좋아요.
세 가지 패턴이에요. 첫째, 모든 워크플로에 ‘디버그 모드’ 변수를 만들어두고 실행 단계별 입력·출력을 콘솔에 찍기. n8n Set 노드로 간단 구현 가능. 둘째, 실패한 실행 데이터를 Postgres·Sheets에 따로 저장해 분석 — n8n Executions UI는 14일 후 자동 삭제라 장기 분석에 부족. 셋째, 같은 워크플로를 ‘프로덕션 + 스테이지’ 2개 운영해서 스테이지에서 새 변경사항을 며칠 검증한 뒤 프로덕션 반영. 혼자 운영하더라도 이 3박자는 갖춰둘 만해요.
두 가지 패턴을 조합하면 무난해요. 첫째, Retry on Error를 5회·간격 60초로 설정 — 잠깐 걸린 레이트 한도는 기다렸다 다시 부르는 것만으로 풀리는 경우가 많아요. 둘째, Wait 노드로 의도적 대기 — 예를 들어 ‘100명 이메일 발송’ 워크플로에 ‘발송 후 몇 초 Wait’ 노드를 끼우면 호출 속도가 느려져 한도에 덜 걸려요. 다만 한도 수치는 서비스와 요금제마다 제각각이라, 쓰는 API의 공식 문서에서 현재 레이트 한도를 확인한 뒤 대기 시간을 정해야 해요. 재시도와 대기를 함께 걸어두는 게 가장 무난한 조합이에요.
n8n은 워크플로 정의·credentials를 PostgreSQL에 저장해요. 핵심은 세 가지. (1) DB 일일 백업 — pg_dump으로 매일 새벽 3시 백업 후 S3·Backblaze에 업로드. (2) Git 워크플로 export — n8n CLI로 워크플로 JSON을 export해 GitHub repo에 매주 push. (3) 재해 복구 리허설 — 분기에 한 번 ‘새 서버에 백업으로 복구하기’ 연습. 백업은 미뤄두다가 사고가 난 뒤에야 후회하는 대표적인 항목이고, 특히 ‘백업은 있는데 복구를 해본 적이 없는’ 상태가 위험해요. 위 3박자를 자동화해두는 걸 권해요.