Docker로 직접 n8n을 설치했는데 워크플로우가 정상적으로 실행되지 않고 서버 로그만 출력되는 상황에서 n8n 셀프 호스팅 자동화 설정 방법을 찾고 계실 것입니다. 이러한 문제는 주로 컨테이너 내부 환경 변수 설정 오류, 데이터베이스 연결 불안정, 혹은 외부 접속을 위한 리버스 프록시 설정 누락 때문에 발생합니다. 특히 단순히 컨테이너를 실행하는 것만으로는 부족하며, 데이터의 영구 저장과 효율적인 작업 처리를 위한 인프라 설계가 필수적입니다. 이 글은 Docker Compose를 활용해 데이터베이스부터 큐 모드, SSL 인증서까지 포함한 가장 안정적인 n8n 셀프 호스팅 자동화 설정 방법을 단계별로 상세히 안내합니다.
함께 보면 좋은 글: 노션 캘린더 동기화 설정 — 구글 캘린더와 자동 연동
n8n은 기본적으로 SQLite를 사용하지만, 실제 운영 환경에서는 동시성 제어와 데이터 무결성을 보장하기 위해 PostgreSQL을 사용해야 합니다. SQLite는 파일 기반 데이터베이스이므로 쓰기 작업이 많을 경우 잠금(Lock) 현상이 발생하여 워크플로우가 중단될 수 있습니다. 또한 단일 컨테이너로 운영할 경우 발생하는 병목 현상을 해결하기 위해 Redis를 활용한 큐 모드 설정이 필수적입니다. 본 가이드를 따라 오면 워크플로우가 멈추는 현상을 근본적으로 해결하고, 트래픽이 몰려도 끄떡없는 자동화 서버를 구축할 수 있습니다.
- Docker Compose를 활용해 PostgreSQL과 Redis를 포함한 n8n 인프라 구축 방법
- 웹훅(Webhook) 및 외부 연동을 위한 Nginx 리버스 프록시 및 환경 변수 설정법
- 워크플로우 멈춤 현상을 방지하는 큐 모드(Queue Mode) 활성화 및 트러블슈팅
- 운영 환경에 최적화된 보안 설정 및 데이터 백업 전략
n8n을 Docker와 PostgreSQL 기반으로 직접 설치해 자동화 워크플로우를 7단계만에 완벽히 구성하고, 클라우드 비용을 0원으로 절감하며 운영 효율을 30% 높이는 방법을 상세히 안내합니다.
1. Docker Compose를 활용한 n8n 셀프 호스팅 자동화 설정 방법 및 구성
n8n을 셀프 호스팅할 때 가장 중요한 것은 격리된 환경에서 서비스를 관리하는 것입니다. 단순히 Docker run 명령어로 실행하는 것보다 Docker Compose를 사용하면 데이터베이스, 캐시, 그리고 n8n 애플리케이션을 하나의 그룹으로 관리할 수 있어 재시작 및 업데이트가 용이합니다. 또한 네트워크를 분리하여 외부의 직접적인 접근을 차단하고, 컨테이너 간의 통신을 내부 네트워크로만 제한함으로써 보안을 강화할 수 있습니다. n8n 공식 문서(docs.n8n.io)에서도 운영 환경 Production 레벨의 배포를 위해 Docker Compose 사용을 강력히 권장하고 있습니다.
첫 번째 단계는 프로젝트 폴더를 생성하고 필수적인 설정 파일을 준비하는 것입니다. 서버의 터미널에 접속하여 다음 명령어를 입력해 디렉터리를 생성합니다. 이 과정은 파일 시스템의 권한 충돌을 방지하기 위해 반드시 일반 사용자 권한이 아닌 적절한 작업 디렉터리에서 진행해야 합니다. 또한, 추후 데이터 백업을 용이하게 하기 위해 홈 디렉터리(~) 하위에 정리하는 것을 추천합니다.
mkdir -p ~/n8n-docker
cd ~/n8n-docker
touch docker-compose.yml
touch .env
docker-compose.yml 파일을 열어 아래와 같이 서비스를 정의합니다. 여기서는 n8n의 핵심 엔진인 n8n 서비스 외에도 데이터를 저장할 postgres, 그리고 작업 대기열을 관리할 redis 서비스를 포함시킵니다. 특히 restart: unless-stopped 옵션을 추가하여 서버 재부팅 시 컨테이너가 자동으로 시작되도록 설정하는 것이 중요합니다. 이는 서버의 예기치 못한 다운타임 이후에도 자동화 서비스가 즉시 복구되도록 보장합니다.
version: "3.8"
services:
postgres:
image: postgres:15-alpine
container_name: n8n-postgres
restart: unless-stopped
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: n8n-redis
restart: unless-stopped
volumes:
- redis_data:/data
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
environment:
- N8N_HOST=${N8N_HOST}
- N8N_PORT=5678
- N8N_PROTOCOL=${N8N_PROTOCOL}
- NODE_ENV=production
- WEBHOOK_URL=${WEBHOOK_URL}
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- QUEUE_BULL_REDIS_HOST=redis
- EXECUTIONS_MODE=queue
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
volumes:
- n8n_data:/home/node/.n8n
volumes:
postgres_data:
redis_data:
n8n_data:
위 설정은 n8n 셀프 호스팅 자동화 설정 방법의 핵심이라 할 수 있습니다. depends_on 섹션을 통해 n8n 컨테이너가 시작되기 전에 PostgreSQL 데이터베이스가 완전히 준비될 때까지 대기하도록 설정했습니다. 이는 데이터베이스 연결 실패로 인한 n8n의 반복적인 재시작 시도를 방지합니다. 또한 healthcheck를 사용하여 데이터베이스가 실제로 쿼리를 받아들일 수 있는 상태인지 확인한 후에 n8n이 구동되도록 만들었습니다. 이러한 의존성 설정은 초기 구축 시뿐만 아니라 서버 업데이트 시에도 매우 중요한 역할을 수행합니다.
각 서비스에 할당된 volumes은 컨테이너가 삭제되더라도 데이터가 유지되도록 보장하는 저장 공간입니다. postgres_data는 모든 워크플로우와 자격 증명 정보를 담고 있으며, n8n_data는 암호화 키 및 설정 파일 등을 저장합니다. 이 볼륨들은 호스트 서버의 Docker 관리 디렉토리에 안전하게 저장되므로, 컨테이너 이미지를 업데이트하더라도 기존 데이터는 손실되지 않습니다. 설정 파일 작성을 마쳤다면, 반드시 docker-compose config 명령어를 실행하여 문법 오류가 없는지 확인하는 습관을 들이는 것이 좋습니다.
Photo by Ludovic Delot on Pexels
2. PostgreSQL과 Redis 연동을 위한 환경 변수 세부 설정
Docker Compose 파일을 구성했다면, 이제 실제로 컨테이너에 주입될 민감한 정보와 설정 값들을 관리할 .env 파일을 설정해야 합니다. 이 파일은 보안상의 이유로 절대로 공개 저장소(Git 등)에 올리지 않도록 주의해야 하며, 파일 시스템의 권한을 600으로 설정하여 소유자만 읽고 쓸 수 있도록 하는 것이 좋습니다. 환경 변수를 별도 파일로 관리하면 설정 변경 시 YAML 파일을 수정할 필요 없이 텍스트 에디터로만 값을 바꿀 수 있어 운영 효율성이 크게 향상됩니다.
아래는 .env 파일에 들어갈 내용의 예시입니다. 각 값은 여러분의 서버 환경과 도메인에 맞춰 수정해야 합니다. 특히 데이터베이스 비밀번호는 충분히 복잡하게 생성하여 무차별 대입 공격을 방지해야 합니다.
동영상으로 보는 n8n 셀프 호스팅 자동화 설정 방법
글로 충분하지 않다면 관련 영상을 함께 보세요. 클릭하면 YouTube에서 검색 결과로 이동합니다.
