월. 8월 4th, 2025

안녕하세요! 여러분의 업무를 효율적으로 자동화하고 싶은데, 기존 서비스의 높은 비용이나 데이터 프라이버시가 걱정되셨나요? 그렇다면 이 글이 바로 여러분을 위한 것입니다. 오늘 우리는 오픈소스 자동화 툴인 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를 기준으로 설명합니다.

  1. SSH 접속: 터미널(맥/리눅스) 또는 PuTTY(윈도우)를 사용하여 서버에 접속합니다.

    ssh 사용자이름@서버_IP주소
    # 예시: ssh root@192.0.2.1

    처음 접속하는 경우 비밀번호를 입력하라는 메시지가 나타날 수 있습니다.

  2. 패키지 업데이트: 서버의 모든 패키지를 최신 상태로 업데이트하여 잠재적인 보안 취약점을 해결하고, 필요한 라이브러리를 준비합니다.

    sudo apt update
    sudo apt upgrade -y

3.2 Docker 및 Docker Compose 설치 🐳

n8n을 가장 쉽고 안정적으로 실행하는 방법은 Docker와 Docker Compose를 이용하는 것입니다.

  1. Docker 설치: Docker 공식 문서에서 제공하는 스크립트를 사용하여 설치하는 것이 가장 권장되는 방법입니다.

    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    • 💡 팁: 위 명령어는 Docker 엔진을 설치합니다. 최신 설치 방법은 Docker 공식 문서를 참고하는 것이 가장 정확합니다.
  2. 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
  3. Docker 권한 설정 (선택 사항이지만 권장): sudo 없이 Docker 명령어를 사용하려면 현재 사용자를 docker 그룹에 추가합니다.

    sudo usermod -aG docker $USER
    newgrp docker # 그룹 변경 적용 (새로운 쉘 필요)
    # 또는 서버에서 로그아웃 후 다시 접속합니다.

    이제 docker ps 명령어를 sudo 없이 실행하여 정상 작동하는지 확인합니다.

3.3 n8n Docker Compose 파일 작성 📝

이제 n8n 서비스를 정의하는 docker-compose.yml 파일을 작성할 차례입니다. 이 파일은 n8n 컨테이너, 데이터베이스 컨테이너, 그리고 이들 간의 연결을 설정합니다.

  1. n8n 디렉토리 생성:

    mkdir n8n
    cd n8n
  2. 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을 실행할 시간입니다.

  1. n8n 컨테이너 실행: n8n 디렉토리 내에서 다음 명령어를 실행합니다.

    docker compose up -d
    # 또는 docker-compose up -d (이전 버전의 Docker Compose 사용 시)

    이 명령어는 백그라운드에서 n8nn8n_db 서비스를 실행합니다. 처음 실행할 때는 Docker 이미지를 다운로드하므로 시간이 다소 걸릴 수 있습니다.

  2. 컨테이너 상태 확인:

    docker compose ps

    n8nn8n_db 서비스의 상태가 Up으로 표시되는지 확인합니다.

  3. 브라우저 접속: 웹 브라우저를 열고 http://서버_IP주소:5678 (도메인 연결 전) 또는 http://your.domain.com:5678 (도메인 연결 후)로 접속합니다.

    처음 접속하면 .env 파일에 설정한 N8N_USERN8N_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와 함께)

  1. Nginx 설치:

    sudo apt install nginx -y
    sudo ufw allow 'Nginx Full' # 방화벽이 활성화되어 있다면 Nginx 포트 허용
  2. 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";
        }
    }
  3. 설정 파일 활성화 및 확인:

    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 인증서 발급을 자동화해주는 도구입니다.

  1. Certbot 설치:

    sudo snap install core
    sudo snap refresh core
    sudo snap install --classic certbot
    sudo ln -s /snap/bin/certbot /usr/bin/certbot
  2. SSL 인증서 발급: Nginx 플러그인을 사용하여 인증서를 발급받고 Nginx 설정을 자동으로 업데이트합니다.

    sudo certbot --nginx -d your.domain.com # 여기에 실제 도메인 입력

    명령어를 실행하면 이메일 주소 입력 및 약관 동의 절차를 거칩니다. 성공적으로 완료되면 Nginx 설정 파일에 SSL 관련 줄이 자동으로 추가됩니다.

  3. Nginx 재시작:

    sudo systemctl restart nginx

이제 브라우저에서 https://your.domain.com으로 접속하면 n8n 웹 인터페이스에 안전하게 접속할 수 있습니다! 또한, .env 파일의 N8N_PROTOCOLhttps로, N8N_HOSTWEBHOOK_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_datan8n_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

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다