
홈랩을 운영하다 보면 반복 작업이 쌓인다. Obsidian 노트 백업 알림, RSS 피드 정리, 서버 상태 체크 같은 잡다한 자동화가 필요한데 매번 스크립트를 짜기엔 번거롭다. Zapier나 IFTTT를 쓸 수도 있지만 월 구독료가 아깝고 데이터를 외부에 맡기는 것도 꺼림칙하다.
그래서 n8n을 직접 올리기로 했다. n8n은 오픈소스 워크플로우 자동화 도구인데 노드 기반 비주얼 에디터가 있어서 복잡한 자동화도 드래그 앤 드롭으로 만들 수 있다. K8s 클러스터에 올려두면 GitOps로 설정 관리가 되니까 여러모로 편하다.
전체 구조는 단순하다. n8n Pod 하나에 두 개의 볼륨을 붙이는 게 핵심이다.
외부 접근은 Traefik IngressRoute로 n8n.xssh.org에 매핑했고 ArgoCD App of Apps에 등록해서 GitOps로 관리한다.
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를 붙인 이유는 간단하다. 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기존 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로 설정을 코드로 관리할 수 있다는 점이 좋다.