안녕하세요! 여러분의 업무를 효율적으로 자동화하고 싶은데, 기존 서비스의 높은 비용이나 데이터 프라이버시가 걱정되셨나요? 그렇다면 이 글이 바로 여러분을 위한 것입니다. 오늘 우리는 오픈소스 자동화 툴인 n8n
을 내 서버에 직접 설치하고 배포하는 방법을 자세히 알아보겠습니다. 💡
n8n은 Zapier, Make(구 Integromat)와 같은 상용 서비스의 강력한 대안으로 떠오르고 있습니다. 특히 셀프 호스팅을 통해 비용 절감은 물론, 데이터 주권 확보와 무한한 커스터마이징 가능성까지 얻을 수 있다는 점이 큰 매력입니다. 이 가이드를 통해 여러분만의 강력한 자동화 서버를 구축하고, 디지털 워크플로우를 자유롭게 설계해 보세요! ✨
1. n8n 셀프 호스팅, 왜 필요할까요? 🤔
n8n 셀프 호스팅은 단순한 기술적 도전이 아니라, 여러 가지 실질적인 이점을 제공합니다.
- 비용 절감 💰: Zapier나 Make와 같은 유료 서비스는 사용하는 태스크(작업) 수에 따라 비용이 증가합니다. n8n을 셀프 호스팅하면, 서버 유지 비용 외에는 추가적인 사용료가 들지 않아 장기적으로 훨씬 경제적입니다. 특히 많은 자동화가 필요한 경우 그 효과는 더욱 커집니다.
- 데이터 주권 확보 🛡️: 비즈니스 민감 데이터나 개인 정보를 다루는 자동화라면, 제3의 서비스에 데이터를 맡기는 것이 불안할 수 있습니다. n8n을 내 서버에 호스팅하면 모든 데이터와 워크플로우가 직접 제어하는 환경에 저장되므로, 데이터 유출이나 오용의 위험을 최소화하고 규제 준수에도 유리합니다.
- 무한한 확장성 및 커스터마이징 ⚙️: n8n은 오픈소스이기 때문에 필요에 따라 코드를 수정하거나 새로운 노드를 직접 개발하여 기능을 확장할 수 있습니다. 또한, 서버 자원이 허락하는 한 무제한으로 워크플로우를 실행할 수 있어 상용 서비스의 제한에서 벗어날 수 있습니다.
- 학습 및 성장 기회 🌱: 직접 서버를 설정하고, Docker를 다루며, 네트워크 및 보안 개념을 익히는 과정은 개발자 또는 IT 관리자로서의 역량을 크게 향상시키는 좋은 기회가 됩니다. 문제가 발생했을 때 스스로 해결하는 능력도 기를 수 있습니다.
2. 셀프 호스팅을 위한 준비물 📦
본격적인 n8n 셀프 호스팅을 시작하기 전에 몇 가지 준비물이 필요합니다.
- 서버 (VPS 추천) 🖥️:
- 추천 사양: 최소 2GB RAM, 2vCPU (4GB RAM, 4vCPU 이상 권장, 특히 PostgreSQL 데이터베이스를 함께 운영할 경우).
- 서비스: AWS EC2, DigitalOcean Droplet, Vultr, Linode 등 클라우드 기반의 가상 사설 서버(VPS)를 추천합니다. 사용하기 쉽고, 확장성이 뛰어나며, 시간당 과금되어 유연합니다. Ubuntu 20.04 LTS 또는 22.04 LTS 운영체제를 선택하는 것이 일반적입니다.
- 도메인 (선택 사항이지만 권장) 🌐:
your.domain.com
과 같은 자신만의 도메인을 연결하면 웹훅 URL을 깔끔하게 유지하고, 무료 SSL 인증서(Let’s Encrypt) 발급을 용이하게 합니다. 필수는 아니지만, 프로덕션 환경에서는 거의 필수적입니다.
- Docker 및 Docker Compose 🐳:
- n8n을 가장 쉽고 안정적으로 배포하는 방법입니다. 컨테이너 기반으로 격리된 환경에서 n8n을 실행하고, 의존성 관리를 편리하게 해줍니다.
- 기본적인 Linux 명령어 지식 🐧:
ssh
,apt
,cd
,ls
,mkdir
,nano
또는vi
등 기본적인 터미널 사용법을 알고 있다면 좋습니다.
- (선택) 역방향 프록시 (Nginx 또는 Caddy) 및 SSL (Let’s Encrypt) 🔐:
- 도메인을 연결하고 HTTPS를 사용하려면 필요합니다. 보안 강화 및 여러 웹 서비스를 한 서버에서 운영할 때 유용합니다.
3. n8n 셀프 호스팅: 단계별 가이드 🛠️
이제 본격적으로 n8n을 서버에 설치하고 배포하는 과정을 시작해봅시다!
3.1 서버 설정 및 접속 💻
가장 먼저 할 일은 구매한 VPS에 접속하고 기본적인 설정을 하는 것입니다. 여기서는 Ubuntu 22.04 LTS를 기준으로 설명합니다.
-
SSH 접속: 터미널(맥/리눅스) 또는 PuTTY(윈도우)를 사용하여 서버에 접속합니다.
ssh 사용자이름@서버_IP주소 # 예시: ssh root@192.0.2.1
처음 접속하는 경우 비밀번호를 입력하라는 메시지가 나타날 수 있습니다.
-
패키지 업데이트: 서버의 모든 패키지를 최신 상태로 업데이트하여 잠재적인 보안 취약점을 해결하고, 필요한 라이브러리를 준비합니다.
sudo apt update sudo apt upgrade -y
3.2 Docker 및 Docker Compose 설치 🐳
n8n을 가장 쉽고 안정적으로 실행하는 방법은 Docker와 Docker Compose를 이용하는 것입니다.
-
Docker 설치: Docker 공식 문서에서 제공하는 스크립트를 사용하여 설치하는 것이 가장 권장되는 방법입니다.
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
- 💡 팁: 위 명령어는 Docker 엔진을 설치합니다. 최신 설치 방법은 Docker 공식 문서를 참고하는 것이 가장 정확합니다.
-
Docker Compose 설치: Docker Compose도 설치합니다.
sudo apt install docker-compose-plugin -y # 최신 Docker 버전은 docker-compose-plugin을 권장 # 또는 # sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # sudo chmod +x /usr/local/bin/docker-compose
- 💡 팁:
v2.24.5
는 예시 버전입니다. Docker Compose GitHub Releases에서 최신 버전을 확인하여 적용하세요.
- 💡 팁:
-
Docker 권한 설정 (선택 사항이지만 권장):
sudo
없이 Docker 명령어를 사용하려면 현재 사용자를docker
그룹에 추가합니다.sudo usermod -aG docker $USER newgrp docker # 그룹 변경 적용 (새로운 쉘 필요) # 또는 서버에서 로그아웃 후 다시 접속합니다.
이제
docker ps
명령어를sudo
없이 실행하여 정상 작동하는지 확인합니다.
3.3 n8n Docker Compose 파일 작성 📝
이제 n8n 서비스를 정의하는 docker-compose.yml
파일을 작성할 차례입니다. 이 파일은 n8n 컨테이너, 데이터베이스 컨테이너, 그리고 이들 간의 연결을 설정합니다.
-
n8n 디렉토리 생성:
mkdir n8n cd n8n
-
docker-compose.yml
파일 작성:nano
또는vi
에디터를 사용하여 파일을 생성하고 내용을 붙여넣습니다.nano docker-compose.yml
권장
docker-compose.yml
(PostgreSQL DB 포함): n8n은 기본적으로 SQLite를 사용하지만, 프로덕션 환경에서는 PostgreSQL과 같은 외부 데이터베이스를 사용하는 것이 안정성과 확장성 면에서 훨씬 유리합니다.version: '3.8' services: n8n: image: n8n.io/n8n # n8n 공식 Docker 이미지 restart: always ports: - "5678:5678" # n8n 웹 인터페이스 포트 environment: # n8n 서비스가 외부에 노출될 주소. 도메인 연결 시 필수! - N8N_HOST=${N8N_HOST} - WEBHOOK_URL=${WEBHOOK_URL} # 웹훅 URL의 기본 주소 (N8N_HOST와 동일하게 설정하는 것이 일반적) - N8N_PROTOCOL=${N8N_PROTOCOL:-http} # HTTP 또는 HTTPS (도메인 + SSL 사용 시 https) # 데이터베이스 설정 (PostgreSQL 사용) - DB_TYPE=postgresdb - DB_POSTGRESDB_HOST=n8n_db - DB_POSTGRESDB_PORT=5432 - DB_POSTGRESDB_DATABASE=n8n - DB_POSTGRESDB_USER=n8n - DB_POSTGRESDB_PASSWORD=${DB_PASSWORD} # 강력한 비밀번호 설정! # 사용자 계정 보안 (Basic Auth 활성화) - N8N_BASIC_AUTH_ACTIVE=true - N8N_BASIC_AUTH_USER=${N8N_USER} # n8n 접속 사용자 이름 - N8N_BASIC_AUTH_PASSWORD=${N8N_PASSWORD} # n8n 접속 비밀번호 (강력한 비밀번호 설정!) # 암호화 키 (매우 중요! 절대 외부에 노출 X, 안전한 곳에 백업) # n8n에서 사용하는 자격 증명(credentials) 등을 암호화하는 데 사용됩니다. # 컨테이너를 재생성하더라도 이 키는 유지되어야 기존 자격 증명을 사용할 수 있습니다. - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY} # 타임존 설정 (한국 시간으로 설정) - TZ=Asia/Seoul # n8n 워크플로우 실행 동시성 조절 (서버 리소스에 따라 조절) - N8N_EXECUTION_PROCESSES=2 - N8N_CONCURRENT_MAX_EXCHANGES=50 volumes: # n8n 데이터 영속성 유지 (워크플로우, 자격 증명, 설정 등 저장) - ./n8n_data:/home/node/.n8n n8n_db: # PostgreSQL 데이터베이스 서비스 image: postgres:15 # PostgreSQL 최신 버전 사용 restart: always environment: - POSTGRES_DB=n8n - POSTGRES_USER=n8n - POSTGRES_PASSWORD=${DB_PASSWORD} # n8n 서비스와 동일한 비밀번호 설정 # 타임존 설정 - TZ=Asia/Seoul volumes: # PostgreSQL 데이터 영속성 유지 - ./n8n_db_data:/var/lib/postgresql/data networks: - default # n8n 서비스와 같은 네트워크 사용 networks: default: # Docker 기본 네트워크 사용
환경 변수 (
.env
파일) 설정: 위docker-compose.yml
파일에서${변수명}
으로 표시된 부분은 환경 변수입니다. 보안을 위해 이 변수들을 별도의.env
파일에 저장하여docker-compose.yml
파일에 직접 노출시키지 않는 것이 좋습니다.n8n
디렉토리 안에.env
파일을 생성합니다.nano .env
# n8n 서비스가 외부에 노출될 주소 (도메인 연결 시 도메인 주소로, 아니라면 서버 IP 주소로) N8N_HOST=your.domain.com # N8N_HOST=서버_IP주소 # 도메인이 없을 경우 (예: 192.0.2.1) # 웹훅 URL의 기본 주소 (N8N_HOST와 동일하게 설정하는 것이 일반적) WEBHOOK_URL=your.domain.com # WEBHOOK_URL=http://서버_IP주소:5678 # 도메인이 없을 경우 (예: http://192.0.2.1:5678) # N8N_PROTOCOL=http # 도메인 + SSL 미사용 시 N8N_PROTOCOL=https # 도메인 + SSL 사용 시 # 데이터베이스 비밀번호 (강력하고 복잡한 비밀번호로 변경!) DB_PASSWORD=your_strong_db_password_123! # n8n 접속 사용자 이름 및 비밀번호 (강력하고 복잡한 비밀번호로 변경!) N8N_USER=admin N8N_PASSWORD=your_super_strong_n8n_password_456! # n8n 암호화 키 (매우 중요! 32자 이상의 무작위 문자열. 안전한 곳에 백업 필.) # 예시: openssl rand -hex 32 로 생성 가능 (터미널에 openssl rand -hex 32 입력 후 나온 결과 복사) N8N_ENCRYPTION_KEY=a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2
- 매우 중요 🚨:
DB_PASSWORD
,N8N_PASSWORD
,N8N_ENCRYPTION_KEY
는 반드시 강력하고 복잡한 값으로 변경하고,N8N_ENCRYPTION_KEY
는 나중에 서버를 이전하거나 복구할 때 필요하므로 반드시 안전한 곳에 백업해 두세요. 이 키가 없으면 n8n에 저장된 모든 자격 증명(API 키, 비밀번호 등)을 복호화할 수 없게 됩니다.
- 매우 중요 🚨:
3.4 n8n 실행 및 초기 설정 🚀
이제 docker-compose
파일을 사용하여 n8n을 실행할 시간입니다.
-
n8n 컨테이너 실행:
n8n
디렉토리 내에서 다음 명령어를 실행합니다.docker compose up -d # 또는 docker-compose up -d (이전 버전의 Docker Compose 사용 시)
이 명령어는 백그라운드에서
n8n
및n8n_db
서비스를 실행합니다. 처음 실행할 때는 Docker 이미지를 다운로드하므로 시간이 다소 걸릴 수 있습니다. -
컨테이너 상태 확인:
docker compose ps
n8n
과n8n_db
서비스의 상태가Up
으로 표시되는지 확인합니다. -
브라우저 접속: 웹 브라우저를 열고
http://서버_IP주소:5678
(도메인 연결 전) 또는http://your.domain.com:5678
(도메인 연결 후)로 접속합니다.처음 접속하면
.env
파일에 설정한N8N_USER
와N8N_PASSWORD
를 입력하여 로그인하라는 Basic Auth 창이 뜰 것입니다. 로그인 후 n8n의 초기 설정 화면이 나타나면 화면 지시에 따라 초기 계정(워크플로우 관리자 계정)을 생성합니다.- 💡 주의: n8n 내부의 계정은 Basic Auth와 별개입니다. 보안을 위해 두 계정 모두 강력하게 설정하세요.
3.5 (고급) 도메인 연결 및 HTTPS (SSL) 설정 🔐
프로덕션 환경에서는 반드시 도메인 연결과 HTTPS(SSL)를 설정해야 합니다. 이는 보안 강화는 물론, 웹훅 URL을 깔끔하게 유지하고 브라우저 경고를 피하는 데 필수적입니다.
역방향 프록시의 필요성
n8n은 기본적으로 5678
포트를 사용합니다. 하지만 웹 서비스는 일반적으로 80
(HTTP) 또는 443
(HTTPS) 포트를 사용합니다. 역방향 프록시(Reverse Proxy)는 외부에서 들어오는 요청을 받아 n8n 컨테이너의 5678
포트로 전달해주는 역할을 합니다.
- 장점:
- 보안: n8n 포트를 직접 외부에 노출하지 않고, 프록시 서버를 통해 트래픽을 필터링합니다.
- SSL/TLS: 프록시 서버에서 SSL 인증서를 관리하고 HTTPS 연결을 처리하여 n8n 컨테이너는 HTTPS 설정을 신경 쓸 필요가 없어집니다.
- 다중 서비스: 하나의 서버에서 여러 웹 서비스를 운영할 때 각 서비스별로 도메인 또는 서브도메인을 할당하여 관리할 수 있습니다.
가장 널리 사용되는 역방향 프록시 서버는 Nginx와 Caddy입니다. 여기서는 Nginx를 예시로 들겠습니다.
3.5.1 Nginx 설치 및 설정 (Let’s Encrypt와 함께)
-
Nginx 설치:
sudo apt install nginx -y sudo ufw allow 'Nginx Full' # 방화벽이 활성화되어 있다면 Nginx 포트 허용
-
Nginx 설정 파일 생성: 새로운 Nginx 서버 블록 파일을 생성합니다.
sudo nano /etc/nginx/sites-available/n8n
다음 내용을 붙여넣고
your.domain.com
을 실제 도메인으로 변경합니다.server { listen 80; listen [::]:80; server_name your.domain.com; # 여기에 실제 도메인 입력 # Let's Encrypt 인증서 발급을 위해 .well-known 디렉토리 허용 location /.well-known/acme-challenge/ { root /var/www/html; try_files $uri =404; } # HTTP 요청을 HTTPS로 리다이렉트 location / { return 301 https://$host$request_uri; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name your.domain.com; # 여기에 실제 도메인 입력 # SSL 인증서 경로는 Certbot이 생성할 때 자동 설정됩니다. ssl_certificate /etc/letsencrypt/live/your.domain.com/fullchain.pem; # 발급 후 경로 확인 ssl_certificate_key /etc/letsencrypt/live/your.domain.com/privkey.pem; # 발급 후 경로 확인 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"; ssl_prefer_server_ciphers on; # n8n으로 요청을 전달하는 프록시 설정 location / { proxy_pass http://localhost:5678; # n8n 컨테이너 포트 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; # 웹소켓 연결을 위한 설정 (n8n UI 업데이트 등) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
-
설정 파일 활성화 및 확인:
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/ sudo nginx -t # 설정 파일 문법 검사 (Ok가 나와야 합니다) sudo systemctl restart nginx # Nginx 재시작
3.5.2 Let’s Encrypt (Certbot)를 이용한 SSL 인증서 발급 🛡️
Certbot은 Let’s Encrypt 인증서 발급을 자동화해주는 도구입니다.
-
Certbot 설치:
sudo snap install core sudo snap refresh core sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot
-
SSL 인증서 발급: Nginx 플러그인을 사용하여 인증서를 발급받고 Nginx 설정을 자동으로 업데이트합니다.
sudo certbot --nginx -d your.domain.com # 여기에 실제 도메인 입력
명령어를 실행하면 이메일 주소 입력 및 약관 동의 절차를 거칩니다. 성공적으로 완료되면 Nginx 설정 파일에 SSL 관련 줄이 자동으로 추가됩니다.
-
Nginx 재시작:
sudo systemctl restart nginx
이제 브라우저에서 https://your.domain.com
으로 접속하면 n8n 웹 인터페이스에 안전하게 접속할 수 있습니다! 또한, .env
파일의 N8N_PROTOCOL
을 https
로, N8N_HOST
와 WEBHOOK_URL
을 도메인으로 변경했는지 다시 한번 확인하고, 필요하면 docker compose down && docker compose up -d
로 n8n 컨테이너를 재시작해주세요.
- 💡 Caddy 사용 시: Caddy는 Nginx보다 훨씬 간편하게 SSL 설정을 해줍니다.
Caddyfile
하나로 역방향 프록시와 Let’s Encrypt를 동시에 설정할 수 있습니다. Caddy를 고려해 보는 것도 좋습니다.
4. n8n 배포 후 관리 🔧
n8n 서버를 구축한 후에도 안정적인 운영을 위해 몇 가지 관리 작업이 필요합니다.
- 업데이트 ⬆️:
n8n은 지속적으로 업데이트됩니다. 새로운 기능과 버그 수정을 위해 주기적으로 업데이트하는 것이 좋습니다.
cd ~/n8n # n8n 디렉토리로 이동 docker compose pull # 최신 n8n 및 PostgreSQL 이미지 다운로드 docker compose down # 기존 컨테이너 중지 docker compose up -d # 새 이미지로 컨테이너 재실행
- 백업 💾:
가장 중요한 부분입니다.
n8n_data
및n8n_db_data
볼륨에 모든 워크플로우, 자격 증명, 설정 및 데이터베이스 데이터가 저장됩니다. 이 디렉토리들을 주기적으로 압축하여 외부 스토리지(S3, Dropbox 등)에 백업하는 스크립트를 만들어 자동화하는 것을 강력히 권장합니다.# 예시: 백업 스크립트 (크론탭에 등록하여 자동화 가능) # cd ~/n8n # tar -czvf n8n_backup_$(date +%Y%m%d%H%M%S).tar.gz n8n_data n8n_db_data # 백업 파일을 다른 서버나 클라우드 스토리지로 전송
- 모니터링 👀:
서버의 CPU, 메모리, 디스크 사용량 등을 주기적으로 모니터링하여 n8n이 안정적으로 작동하는지 확인합니다. Docker의
docker stats
명령어나htop
같은 툴을 활용할 수 있습니다. - 보안 강화 🔒:
- 방화벽 (UFW): SSH, HTTP, HTTPS 포트만 허용하고 다른 모든 포트는 차단합니다.
- SSH 키 사용: 비밀번호 대신 SSH 키를 사용하여 서버에 접속합니다.
- 강력한 비밀번호: n8n 로그인 비밀번호, 데이터베이스 비밀번호, SSH 비밀번호 등 모든 비밀번호는 복잡하고 유추하기 어렵게 설정합니다.
- n8n_encryption_key 관리: 이 키는 반드시 안전한 곳에 별도로 백업하고 외부에 노출되지 않도록 주의합니다.
결론 🎉
축하합니다! 이제 여러분은 자신만의 n8n 자동화 서버를 성공적으로 셀프 호스팅하고 배포하는 방법을 알게 되었습니다. 이 과정을 통해 비용 절감, 데이터 주권 확보, 그리고 무한한 커스터마이징 가능성이라는 큰 이점을 누릴 수 있게 되었습니다.
물론, 셀프 호스팅은 서버 관리와 보안에 대한 지속적인 관심이 필요하지만, 그만큼 여러분의 디지털 워크플로우를 완벽하게 통제하고 최적화할 수 있는 자유를 선사합니다. 이제 n8n의 강력한 기능들을 활용하여 상상하는 모든 자동화를 구현해 보세요! 🚀
이 가이드가 여러분의 자동화 여정에 큰 도움이 되었기를 바랍니다. 궁금한 점이 있다면 언제든지 질문해주세요! 행복한 자동화 생활 되세요! 😊 D