무색
기술블로그
에세이
연구
소개

무색

소프트웨어로 비즈니스의 가능성을 만듭니다. 웹·앱 개발, 음성 AI, 자동화 콘텐츠 제작까지 — 기술이 필요한 곳에 무색이 있습니다.

연락처

contact@museck.com

사업자 정보

상호: 무색

대표: 배성재

사업자등록번호: 577-58-00836

인천광역시 연수구 인천타워대로 323, 에이동 8층 801-802호 AB-132 (송도동, 송도 센트로드)

© 2026 무색. All rights reserved.
개인정보처리방침·이용약관·연락처
INCHEON, KR
n8n 워크플로우 자동화 — K8s 셀프호스팅
홈랩 삽질기
2026. 1. 3.

n8n 워크플로우 자동화, K8s 홈랩에 셀프 호스팅하기

n8nkuberneteshomelabargocdnfs

홈랩을 운영하다 보면 반복 작업이 쌓인다. Obsidian 노트 백업 알림, RSS 피드 정리, 서버 상태 체크 같은 잡다한 자동화가 필요한데 매번 스크립트를 짜기엔 번거롭다. Zapier나 IFTTT를 쓸 수도 있지만 월 구독료가 아깝고 데이터를 외부에 맡기는 것도 꺼림칙하다.

그래서 n8n을 직접 올리기로 했다. n8n은 오픈소스 워크플로우 자동화 도구인데 노드 기반 비주얼 에디터가 있어서 복잡한 자동화도 드래그 앤 드롭으로 만들 수 있다. K8s 클러스터에 올려두면 GitOps로 설정 관리가 되니까 여러모로 편하다.

배포 아키텍처

전체 구조는 단순하다. n8n Pod 하나에 두 개의 볼륨을 붙이는 게 핵심이다.

  • SQLite DB용 로컬 PVC — n8n의 워크플로우와 실행 이력을 저장
  • NFS 공유 스토리지 — Syncthing이 동기화하는 Obsidian vault 등 외부 파일에 접근

외부 접근은 Traefik IngressRoute로 n8n.xssh.org에 매핑했고 ArgoCD App of Apps에 등록해서 GitOps로 관리한다.

K8s 매니페스트 작성

n8n 배포 자체는 생각보다 간단했다. 공식 Docker 이미지가 잘 만들어져 있어서 환경변수 몇 개만 넣어주면 바로 돌아간다.

# n8n Deployment - 핵심 부분
containers:
  - name: n8n
    image: n8nio/n8n:latest
    envFrom:
      - configMapRef:
          name: n8n-config
    volumeMounts:
      - name: n8n-data
        mountPath: /home/node/.n8n    # SQLite DB
      - name: shared-nfs
        mountPath: /shared            # NFS 공유 스토리지

ConfigMap에는 외부 접근에 필요한 환경변수를 넣었다.

# n8n ConfigMap
N8N_HOST: n8n.xssh.org
N8N_PORT: "5678"
N8N_PROTOCOL: https
WEBHOOK_URL: https://n8n.xssh.org/

여기서 WEBHOOK_URL이 중요하다. 외부에서 webhook을 호출하려면 n8n이 자기 외부 주소를 알아야 하는데 이걸 빠뜨리면 webhook 노드가 localhost URL을 뱉어서 외부 연동이 안 된다.

NFS 공유 스토리지 연결

NFS를 붙인 이유는 간단하다. Syncthing이 동기화해주는 Obsidian vault에 n8n이 직접 접근할 수 있으면 노트 기반 자동화를 만들 수 있기 때문이다. 예를 들어 특정 폴더에 새 파일이 생기면 자동으로 요약을 만든다든지 하는 워크플로우를 구상하고 있었다.

# NFS PV/PVC (n8n namespace)
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-shared-n8n
spec:
  capacity:
    storage: 50Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.0.10
    path: /mnt/data/shared

ArgoCD 등록

기존 App of Apps 패턴에 n8n Application을 추가했다. company-internal 프로젝트에 n8n 네임스페이스를 허용 목록에 넣어주는 것도 잊으면 안 된다.

# ArgoCD Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: n8n
  namespace: argocd
spec:
  project: company-internal
  source:
    repoURL: https://gitea.xssh.org/admin/homelab
    path: apps/n8n
  destination:
    server: https://kubernetes.default.svc
    namespace: n8n
  syncPolicy:
    automated:
      selfHeal: true

삽질 기록

배포까지는 순조로웠는데 NFS 마운트한 경로에서 파일 쓰기가 안 되는 문제가 생겼다. n8n에는 보안을 위해 N8N_RESTRICT_FILE_ACCESS_TO라는 환경변수가 있는데 기본값이 꽤 제한적이다. NFS 경로인 /shared를 허용 목록에 추가해야 파일 읽기/쓰기가 가능했다.

이 문제는 처음에 권한 이슈인 줄 알고 NFS export 옵션을 이리저리 바꿔봤는데 전혀 소용이 없었다. n8n 로그를 자세히 보니까 파일 접근 제한 관련 에러가 나오고 있었고 그제야 환경변수 문서를 찾아봤다. 삽질 시간만 줄이려면 공식 문서를 먼저 읽는 습관을 들여야겠다.

정리

n8n을 K8s에 올리는 작업은 반나절이면 충분하다. 도커 이미지가 잘 되어있어서 Deployment와 ConfigMap만 잡아주면 금방 돌아간다. NFS 연동까지 해두면 다른 서비스와 파일을 주고받을 수 있어서 자동화의 폭이 넓어진다.

SaaS 워크플로우 도구 대비 셀프 호스팅의 장점은 확실하다. 데이터가 내 서버에 있으니 개인정보 걱정이 없고 워크플로우 실행 횟수에 제한도 없다. Zapier Pro가 월 $20 이상인 걸 생각하면 홈랩에 올리는 게 훨씬 경제적이다. 무엇보다 GitOps로 설정을 코드로 관리할 수 있다는 점이 좋다.

자주 묻는 질문

n8n을 K8s에 셀프 호스팅할 때 필수 환경변수는?
WEBHOOK_URL을 외부 접근 주소(예: https://n8n.xssh.org/)로 설정해야 합니다. 이걸 빠뜨리면 webhook 노드가 localhost URL을 반환해서 외부 연동이 안 됩니다. N8N_HOST, N8N_PROTOCOL도 함께 설정하세요.
n8n에서 NFS 마운트 경로의 파일을 읽지 못할 때 해결법은?
n8n의 N8N_RESTRICT_FILE_ACCESS_TO 환경변수에 NFS 마운트 경로(예: /shared)를 추가해야 합니다. 기본값이 제한적이라 허용 목록에 없는 경로는 파일 접근이 차단됩니다.
n8n 셀프 호스팅과 SaaS(Zapier)의 차이는?
셀프 호스팅은 데이터가 내 서버에 있어 개인정보 걱정이 없고 실행 횟수 제한도 없습니다. Zapier Pro 월 $20+ 대비 경제적이며, GitOps로 설정을 코드로 관리할 수 있다는 장점도 있습니다.
홈랩 삽질기(8/19)
Prev

SSD 패스스루 + NFS 공유 스토리지 구축기

Next

WSL GPU 서비스를 K8s에 연결하는 수동 Endpoints 패턴