Hostinger VPS에서 n8n 워크플로우 자동화 도구 설치 가이드
1. 개요
본 가이드는 Hostinger VPS에서 n8n 워크플로우 자동화 도구를 Docker를 사용하여 완전 자동으로 설치하는 방법을 설명합니다.
💡 n8n이란?
n8n 은 강력한 워크플로우 자동화 도구 입니다. 다양한 서비스와 앱을 연결하여 반복적인 작업을 자동화할 수 있습니다. 예를 들어:
Gmail에서 새 메일이 오면 Slack으로 알림 보내기
구글 시트 데이터를 자동으로 데이터베이스에 동기화
웹사이트 폼 제출 시 자동으로 CRM에 고객 정보 추가
소셜 미디어 게시물을 여러 플랫폼에 동시 업로드
🎯 Hostinger 원클릭 설치의 장점
초간단 설치: 클릭 몇 번으로 완료 (5-10분)
저렴한 비용: 월 $5 KVM 2 플랜으로 충분
완전한 스택: Docker + PostgreSQL + Redis + SSL 자동 구성
큐 모드 지원: 고성능 워크플로우 처리
관리 편의성: 업데이트와 백업이 간단
📝 단계별 설치 과정
1 Hostinger VPS 구매 페이지 접속
다음 링크로 이동합니다:
서버 로케이션을 선택 합니다. 한국 사용자라 아시아-태평양 지역 (싱가포르, 도쿄 등)을 찾았는데 말레이지아가 최선이네요 ㅠ
2 운영 체제 선택
"Choose an operating system" 섹션에서 "Application" 을 선택합니다.
일반적인 Ubuntu나 CentOS가 아닌, 사전 구성된 애플리케이션 템플릿을 사용할 것입니다.
3 n8n 애플리케이션 선택
"Developer Tools" 섹션을 찾아서 "n8n" 을 선택합니다.
두 가지 옵션이 있을 수 있습니다:
Ubuntu 24.04 with n8n: 기본 버전
Ubuntu 24.04 with n8n (queue mode): 큐 모드 (성능 향상) ← 추천!
4 VPS 플랜 선택
KVM 2 플랜 월 $6.99 을 추천합니다:
CPU: 2 vCore
RAM: 8 GB
스토리지: 100 GB NVMe
대역폭: 8TB
KVM 1도 개인 사용이나 소규모 팀에는 충분한 성능이지만...
5 결제 및 배포 대기
결제를 완료하면 VPS 배포가 자동으로 시작됩니다.
배포 시간: 약 5-10분 소요
Hostinger 대시보드에서 배포 진행 상황을 확인할 수 있습니다.
6 배포 완료 후 접속
배포가 완료되면 다음 정보를 받게 됩니다:
VPS IP 주소
루트 패스워드
n8n 접속 URL
웹 브라우저에서 다음과 같이 접속합니다:
https://n8n.[your-vps-hostname]
⚙️ 설치 후 초기 설정
🌐 n8n 웹 인터페이스 접속
처음 접속하면 관리자 계정 생성 화면이 나타납니다:
이메일: 관리자 이메일 주소 입력
이름: 표시될 이름 입력
패스워드: 강력한 패스워드 설정 (최소 8자, 대소문자+숫자+특수문자)
🔐 기본 보안 설정
2FA 활성화: 설정 메뉴에서 이중 인증 설정 권장
워크플로우 접근 권한: 필요시 팀원 초대 및 권한 설정
웹훅 보안: 외부에서 접근하는 웹훅에 인증 추가
🚄 큐 모드 (Queue Mode) 설명
큐 모드란?
큐 모드 는 워크플로우를 비동기적으로 처리하여 성능을 크게 향상시키는 기능입니다.
🎯 성능상 장점:
병렬 처리: 여러 워크플로우를 동시에 실행
부하 분산: 워커들이 작업을 나누어 처리
안정성 향상: 하나의 워크플로우 오류가 전체에 영향주지 않음
확장성: 필요시 워커 수를 늘려 처리 능력 증대
기본 구성
Hostinger n8n 템플릿은 기본으로 3개의 워커 가 설정됩니다:
메인 n8n 인스턴스: 웹 인터페이스 및 관리
워커 1, 2, 3: 실제 워크플로우 실행
Redis: 큐 메시지 브로커
PostgreSQL: 데이터베이스
🛠️ 주요 특징 및 관리
✅ 자동 구성된 기능들
Docker 환경: 컨테이너 기반으로 격리된 환경에서 안전하게 실행
SSL 인증서: Let's Encrypt 자동 발급 및 갱신
PostgreSQL 15: 안정적인 데이터 저장
Redis 6: 빠른 캐시 및 큐 처리
Traefik 리버스 프록시: 자동 라우팅 및 SSL 관리
🔄 업데이트 방법
SSH로 VPS에 접속한 후 다음 명령어를 실행:
# 최신 버전 다운로드 docker compose pull # 서비스 중지 및 재시작 docker compose down docker compose up -d
📈 워커 수 조정
트래픽이 많아지면 워커 수를 늘릴 수 있습니다:
docker compose up -d --scale n8n-worker=5
🎉 마무리
⏱️ 설치 완료!
총 소요 시간: 5-10분
이제 강력한 워크플로우 자동화 도구 n8n을 월 $5 로 사용할 수 있습니다!
📚 추가 리소스
💰 비용 절약 팁
Hostinger는 종종 할인 프로모션을 진행합니다. 연간 결제 시 추가 할인을 받을 수 있으니 확인해보세요!
🚀 이제 n8n으로 업무를 자동화하고 시간을 절약해보세요!
2. 시스템 요구사항
2.1 최소 사양 (5$/month VPS 기준)
항목최소 요구사항권장사항
CPU
1 vCPU
2 vCPU
메모리
1GB RAM
2GB RAM 이상
저장공간
20GB SSD
40GB SSD 이상
운영체제
Ubuntu 20.04 LTS
Ubuntu 22.04 LTS
2.2 네트워크 요구사항
고정 IP 주소 (Hostinger VPS 기본 제공)
80, 443 포트 개방 (웹 접속용)
5678 포트 개방 (n8n 기본 포트)
도메인 또는 서브도메인 (선택사항, SSL 인증서용)
3. 기타
3.1 Hostinger VPS 접속
Hostinger 관리 패널에서 VPS에 SSH로 접속하거나, 터미널을 통해 접속합니다.
ssh root@your-vps-ip
3.2 시스템 업데이트
apt update && apt upgrade -y apt install -y curl wget git nano htop
3.3 방화벽 설정
ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp ufw allow 5678/tcp ufw --force enable
4. Docker 및 Docker Compose 설치
4.1 Docker 설치
curl -fsSL
https://get.docker.com -o get-docker.sh sh get-docker.sh systemctl start docker systemctl enable docker
4.2 Docker Compose 설치
4.3 설치 확인
docker --version docker-compose --version
5. n8n 자동 설치 스크립트
5.1 작업 디렉토리 생성
mkdir -p /opt/n8n cd /opt/n8n
5.2 환경 설정 파일 생성
환경 변수 파일(.env)을 생성합니다:
cat > .env << 'EOF' # n8n 설정 N8N_BASIC_AUTH_ACTIVE=true N8N_BASIC_AUTH_USER=admin N8N_BASIC_AUTH_PASSWORD=change_this_password N8N_HOST=0.0.0.0 N8N_PORT=5678 N8N_PROTOCOL=http WEBHOOK_URL=http://your-domain-or-ip:5678 # 데이터베이스 설정 POSTGRES_USER=n8n POSTGRES_PASSWORD=n8n_db_password POSTGRES_DB=n8n POSTGRES_NON_ROOT_USER=n8n POSTGRES_NON_ROOT_PASSWORD=n8n_db_password # Redis 설정 REDIS_PASSWORD=redis_password # 큐 설정 EXECUTIONS_MODE=queue QUEUE_BULL_REDIS_HOST=redis QUEUE_BULL_REDIS_PASSWORD=redis_password QUEUE_HEALTH_CHECK_ACTIVE=true # 타임존 GENERIC_TIMEZONE=Asia/Seoul TZ=Asia/Seoul EOF
중요: .env 파일의 패스워드들을 반드시 강력한 패스워드로 변경하세요. 또한 WEBHOOK_URL을 실제 도메인 또는 IP로 수정하세요.
5.3 Docker Compose 파일 생성
완전한 n8n 환경을 구성하는 docker-compose.yml 파일을 생성합니다:
cat > docker-compose.yml << 'EOF' version: '3.8' services: traefik: image: traefik:v2.10 container_name: root-traefik-1 restart: unless-stopped ports: - "80:80" - "443:443" - "8080:8080" command: - --api.dashboard=true - --api.insecure=true - --providers.docker=true - --providers.docker.exposedbydefault=false - --entrypoints.web.address=:80 - --entrypoints.websecure.address=:443 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro networks: - n8n-network postgres: image: postgres:15 container_name: n8n-postgres restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_NON_ROOT_USER: ${POSTGRES_NON_ROOT_USER} POSTGRES_NON_ROOT_PASSWORD: ${POSTGRES_NON_ROOT_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh healthcheck: test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}'] interval: 5s timeout: 5s retries: 10 networks: - n8n-network redis: image: redis:6-alpine container_name: redis restart: unless-stopped command: redis-server --requirepass ${REDIS_PASSWORD} volumes: - redis_data:/data healthcheck: test: ['CMD', 'redis-cli', '--raw', 'incr', 'ping'] interval: 5s timeout: 5s retries: 10 networks: - n8n-network n8n: image: docker.n8n.io/n8nio/n8n container_name: root-n8n-1 restart: unless-stopped environment: - DB_TYPE=postgresdb - DB_POSTGRESDB_HOST=postgres - DB_POSTGRESDB_PORT=5432 - DB_POSTGRESDB_DATABASE=${POSTGRES_DB} - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER} - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD} - N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE} - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER} - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD} - N8N_HOST=${N8N_HOST} - N8N_PORT=${N8N_PORT} - N8N_PROTOCOL=${N8N_PROTOCOL} - WEBHOOK_URL=${WEBHOOK_URL} - GENERIC_TIMEZONE=${GENERIC_TIMEZONE} - TZ=${TZ} - EXECUTIONS_MODE=${EXECUTIONS_MODE} - QUEUE_BULL_REDIS_HOST=${QUEUE_BULL_REDIS_HOST} - QUEUE_BULL_REDIS_PASSWORD=${QUEUE_BULL_REDIS_PASSWORD} - QUEUE_HEALTH_CHECK_ACTIVE=${QUEUE_HEALTH_CHECK_ACTIVE} ports: - "5678:5678" volumes: - n8n_data:/home/node/.n8n depends_on: postgres: condition: service_healthy redis: condition: service_healthy labels: - traefik.enable=true - traefik.http.routers.n8n.rule=PathPrefix("/") - traefik.http.services.n8n.loadbalancer.server.port=5678 networks: - n8n-network n8n-worker-1: image: docker.n8n.io/n8nio/n8n container_name: root-n8n-worker-1 restart: unless-stopped command: worker environment: - DB_TYPE=postgresdb - DB_POSTGRESDB_HOST=postgres - DB_POSTGRESDB_PORT=5432 - DB_POSTGRESDB_DATABASE=${POSTGRES_DB} - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER} - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD} - GENERIC_TIMEZONE=${GENERIC_TIMEZONE} - TZ=${TZ} - EXECUTIONS_MODE=${EXECUTIONS_MODE} - QUEUE_BULL_REDIS_HOST=${QUEUE_BULL_REDIS_HOST} - QUEUE_BULL_REDIS_PASSWORD=${QUEUE_BULL_REDIS_PASSWORD} - QUEUE_HEALTH_CHECK_ACTIVE=${QUEUE_HEALTH_CHECK_ACTIVE} volumes: - n8n_data:/home/node/.n8n depends_on: postgres: condition: service_healthy redis: condition: service_healthy networks: - n8n-network n8n-worker-2: image: docker.n8n.io/n8nio/n8n container_name: root-n8n-worker-2 restart: unless-stopped command: worker environment: - DB_TYPE=postgresdb - DB_POSTGRESDB_HOST=postgres - DB_POSTGRESDB_PORT=5432 - DB_POSTGRESDB_DATABASE=${POSTGRES_DB} - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER} - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD} - GENERIC_TIMEZONE=${GENERIC_TIMEZONE} - TZ=${TZ} - EXECUTIONS_MODE=${EXECUTIONS_MODE} - QUEUE_BULL_REDIS_HOST=${QUEUE_BULL_REDIS_HOST} - QUEUE_BULL_REDIS_PASSWORD=${QUEUE_BULL_REDIS_PASSWORD} - QUEUE_HEALTH_CHECK_ACTIVE=${QUEUE_HEALTH_CHECK_ACTIVE} volumes: - n8n_data:/home/node/.n8n depends_on: postgres: condition: service_healthy redis: condition: service_healthy networks: - n8n-network n8n-worker-3: image: docker.n8n.io/n8nio/n8n container_name: root-n8n-worker-3 restart: unless-stopped command: worker environment: - DB_TYPE=postgresdb - DB_POSTGRESDB_HOST=postgres - DB_POSTGRESDB_PORT=5432 - DB_POSTGRESDB_DATABASE=${POSTGRES_DB} - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER} - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD} - GENERIC_TIMEZONE=${GENERIC_TIMEZONE} - TZ=${TZ} - EXECUTIONS_MODE=${EXECUTIONS_MODE} - QUEUE_BULL_REDIS_HOST=${QUEUE_BULL_REDIS_HOST} - QUEUE_BULL_REDIS_PASSWORD=${QUEUE_BULL_REDIS_PASSWORD} - QUEUE_HEALTH_CHECK_ACTIVE=${QUEUE_HEALTH_CHECK_ACTIVE} volumes: - n8n_data:/home/node/.n8n depends_on: postgres: condition: service_healthy redis: condition: service_healthy networks: - n8n-network volumes: postgres_data: redis_data: n8n_data: networks: n8n-network: driver: bridge EOF
5.4 데이터베이스 초기화 스크립트 생성
cat > init-data.sh << 'EOF' #!/bin/bash set -e psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL CREATE USER $POSTGRES_NON_ROOT_USER WITH PASSWORD '$POSTGRES_NON_ROOT_PASSWORD'; GRANT ALL PRIVILEGES ON DATABASE $POSTGRES_DB TO $POSTGRES_NON_ROOT_USER; GRANT ALL PRIVILEGES ON SCHEMA public TO $POSTGRES_NON_ROOT_USER; EOSQL EOF chmod +x init-data.sh
6. 서비스 구성 및 실행
6.1 n8n 서비스 실행
cd /opt/n8n docker-compose up -d
6.2 서비스 상태 확인
docker-compose ps docker-compose logs -f
정보: 모든 서비스가 정상적으로 시작되기까지 2-3분 정도 소요될 수 있습니다. 특히 PostgreSQL과 Redis가 완전히 시작된 후 n8n 서비스들이 시작됩니다.
7. 설치 확인 방법
7.1 Docker 컨테이너 상태 확인
docker ps
다음과 같은 컨테이너들이 실행되고 있어야 합니다:
root-n8n-1 (메인 n8n 서비스)
root-n8n-worker-1, root-n8n-worker-2, root-n8n-worker-3 (워커들)
root-traefik-1 (리버스 프록시)
redis (캐시/메시지 브로커)
n8n-postgres (데이터베이스)
7.2 네트워크 연결 테스트
curl -I http://localhost:5678 curl -I http://your-server-ip:5678
7.3 시스템 리소스 확인
htop docker stats
8. 접속 및 초기 설정
8.1 웹 인터페이스 접속
브라우저에서 다음 주소로 접속합니다:
http://your-server-ip:5678
8.2 기본 인증
.env 파일에서 설정한 기본 인증 정보로 로그인합니다:
사용자명: admin (또는 .env에서 설정한 값)
패스워드: change_this_password (반드시 변경하세요)
8.3 초기 설정
관리자 계정 생성 및 설정
이메일 설정 (선택사항)
웹훅 URL 확인 및 설정
첫 번째 워크플로우 생성 테스트
9. 문제 해결 가이드
9.1 일반적인 문제들
컨테이너가 시작되지 않는 경우:
docker-compose logs [service-name] docker-compose down docker-compose up -d
데이터베이스 연결 오류:
# PostgreSQL 컨테이너 상태 확인 docker exec -it n8n-postgres pg_isready -U n8n # 데이터베이스 접속 테스트 docker exec -it n8n-postgres psql -U n8n -d n8n
Redis 연결 오류:
# Redis 컨테이너 상태 확인 docker exec -it redis redis-cli ping
9.2 메모리 부족 문제
1GB RAM VPS에서는 메모리 부족이 발생할 수 있습니다. 이 경우 스왑 파일을 생성합니다:
fallocate -l 2G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile echo '/swapfile none swap sw 0 0' >> /etc/fstab
9.3 포트 충돌 문제
# 포트 사용 상태 확인 netstat -tulpn | grep :5678 netstat -tulpn | grep :80 # 방화벽 상태 확인 ufw status
10. 유지보수 및 업데이트 방법
10.1 정기 백업
데이터베이스와 n8n 데이터를 정기적으로 백업합니다:
# 백업 디렉토리 생성 mkdir -p /opt/n8n/backups # PostgreSQL 백업 docker exec n8n-postgres pg_dump -U n8n n8n > /opt/n8n/backups/n8n-backup-$(date +%Y%m%d).sql # n8n 데이터 볼륨 백업 docker run --rm -v /opt/n8n_n8n_data:/data -v /opt/n8n/backups:/backup alpine tar czf /backup/n8n-data-$(date +%Y%m%d).tar.gz -C /data .
10.2 시스템 업데이트
# 시스템 패키지 업데이트 apt update && apt upgrade -y # Docker 이미지 업데이트 cd /opt/n8n docker-compose pull docker-compose up -d
10.3 로그 관리
# 로그 확인 docker-compose logs -f --tail=100 # 로그 정리 (디스크 공간 절약) docker system prune -f docker volume prune -f
10.4 성능 모니터링
# 시스템 리소스 모니터링 htop df -h docker stats # n8n 워커 상태 확인 docker-compose ps
10.5 자동 시작 설정
시스템 재부팅 시 자동으로 n8n이 시작되도록 설정합니다:
# systemd 서비스 파일 생성 cat > /etc/systemd/system/n8n.service << 'EOF' [Unit] Description=n8n Workflow Automation After=docker.service Requires=docker.service [Service] Type=oneshot RemainAfterExit=true WorkingDirectory=/opt/n8n ExecStart=/usr/local/bin/docker-compose up -d ExecStop=/usr/local/bin/docker-compose down [Install] WantedBy=multi-user.target EOF # 서비스 활성화 systemctl enable n8n.service systemctl start n8n.service
완료: 이제 Hostinger VPS에서 n8n 워크플로우 자동화 도구가 성공적으로 설치되고 실행됩니다. 웹 브라우저에서 http://your-server-ip:5678로 접속하여 n8n을 사용할 수 있습니다.
추가 지원: 설치 과정에서 문제가 발생하거나 추가적인 설정이 필요한 경우, n8n 공식 문서(https://docs.n8n.io)를 참고하거나 커뮤니티 포럼을 활용하시기 바랍니다.