소개
워크플로우 자동화 도구 n8n을 클라우드 서비스로 저렴하게 직접 호스팅해보고 싶었습니다. n8n의 공식 클라우드 서비스는 월 €24(약 38,500원)부터 시작하는데, 개인 사용자로서는 부담스러운 가격이었습니다. DigitalOcean의 가장 저렴한 Droplet($7/월)(약 13,000원)을 이용해 자체 호스팅하면 비용을 크게 절감하면서도 자동화 워크플로우의 모든 기능을 활용할 수 있을 것으로 판단했습니다. Docker와 Caddy를 이용한 설정으로 보안까지 갖춘 환경을 구축하고자 했습니다.
진행 방법
사용 도구
클라우드 서비스: DigitalOcean Droplet (1vCPU, 1GB RAM, Ubuntu 22.04)
컨테이너 기술: Docker 및 Docker Compose
웹 서버: Caddy (자동 HTTPS 설정용)
워크플로우 도구: n8n 최신 LTS 버전
구축 과정
1. DigitalOcean Droplet 생성
DigitalOcean에 가입하고 가장 기본적인 Droplet을 생성했습니다. 지역은 한국에서 사용할 것이기 때문에 싱가포르 데이터센터를 선택하고, Basic 플랜의 $7/월 요금제(1GB RAM, 1 CPU)를 선택했습니다.
2. 서버 초기 설정
서버에 SSH로 접속한 후 기본 패키지를 업데이트했습니다.
apt update && apt upgrade -y3. Docker 및 Docker Compose 설치
# Docker 설치
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
# Docker Compose 설치
apt install -y docker-compose4. n8n 배포를 위한 디렉토리 및 설정 파일 생성
# n8n 디렉토리 생성
mkdir -p /opt/n8n
cd /opt/n8n
# 데이터 저장용 디렉토리 생성
mkdir -p data caddy_data caddy_config5. Docker Compose 설정 파일 작성
version: '3'
services:
n8n:
image: n8nio/n8n:latest
restart: always
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=[유저네임생략]
- N8N_BASIC_AUTH_PASSWORD=[패스워드생략]
- NODE_ENV=production
- N8N_SECURE_COOKIE=false
- N8N_PROTOCOL=http
- N8N_HOST=[ip주소생략]
- N8N_PORT=5678
- N8N_WEBHOOK_URL=http://[ip주소생략]:5678/
volumes:
- ./data:/home/node/.n8n
user: "1000:1000"
caddy:
image: caddy:2
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./caddy_data:/data
- ./caddy_config:/config6. Caddy 설정 파일 생성
# Caddyfile 작성
echo ":80 {
reverse_proxy n8n:5678
}" > Caddyfile7. 서비스 시작 및 문제 해결
처음에는 권한 문제로 서비스가 시작되지 않았습니다:
docker-compose up -d
docker-compose ps # 상태 확인로그를 확인해보니 데이터 디렉토리에 접근 권한 문제가 있었습니다:
docker-compose logs n8n권한 문제를 해결하기 위해 데이터 디렉토리의 권한을 수정했습니다:
chmod -R 777 /opt/n8n/data
docker-compose down
docker-compose up -d결과와 배운 점
성공적인 배포
n8n이 성공적으로 배포되어 http://[ip주소생략]:5678에서 접속할 수 있게 되었습니다. 관리자 계정으로 로그인하여 워크플로우를 생성하고 자동화 작업을 설정할 수 있게 되었습니다.
배운 점과 꿀팁
Docker 권한 관리의 중요성: Docker 컨테이너의 권한 문제가 발생했을 때, 로그를 확인하고 적절한 권한 설정(
user: "1000:1000"및 볼륨 권한 조정)으로 해결할 수 있었습니다.환경 변수의 중요성: n8n은 다양한 환경 변수로 설정할 수 있으며, 특히
N8N_SECURE_COOKIE,N8N_PROTOCOL,N8N_HOST등의 설정이 중요합니다.비용 절감: 공식 클라우드 서비스(€24/월) 대비 자체 호스팅 비용이 약 65% 정도 절감되었습니다($7/월).
시행착오
이미지 이름 문제: 처음에
n8n/n8n:latest라는 잘못된 이미지 이름을 사용하여manifest unknown오류가 발생했습니다. 정확한 이미지 이름인n8nio/n8n:latest를 사용하니 해결되었습니다.보안 쿠키 문제: HTTP로 접속할 때 "secure cookie" 관련 경고가 나타났습니다.
N8N_SECURE_COOKIE=false설정으로 해결했습니다만, 프로덕션 환경에서는 HTTPS를 설정하는 것이 더 안전합니다.권한 설정 문제: 데이터 디렉토리에 대한 권한 문제로 n8n이 설정 파일에 접근하지 못하는 상황이 발생했습니다.
chmod -R 777 /opt/n8n/data명령으로 임시 해결했지만, 실제 프로덕션 환경에서는 더 세밀한 권한 설정이 필요합니다.
앞으로의 계획
도메인 연결 및 HTTPS 설정: 현재는 IP 주소로 접속 중이지만, 도메인을 구매하여 연결하고 Caddy를 통해 자동으로 HTTPS를 설정할 계획입니다.
백업 자동화: 중요 워크플로우와 데이터를 자동으로 백업하는 시스템을 구축할 예정입니다.
모니터링 강화: 서버와 n8n 상태를 모니터링하고 알림을 받을 수 있는 시스템을 추가할 계획입니다.
도움 받은 글
DigitalOcean 공식 문서: https://docs.digitalocean.com/products/droplets/how-to/create/
n8n 자체 호스팅 가이드: https://docs.n8n.io/hosting/
Docker Compose 공식 문서: https://docs.docker.com/compose/
이 글이 n8n을 자체 호스팅하려는 다른 분들께 도움이 되길 바랍니다. 추가 질문이나 도움이 필요하시면 댓글로 남겨주세요!