n8n + PostgreSQL, Docker Compose로 안정적인 셀프 호스팅 구축하기

n8n과 PostgreSQL을 함께 도커 컴포즈로 운영하는 것은 단순한 자동화 도구 구축을 넘어, 데이터의 안정성과 워크플로우의 확장성을 함께 고려하는 대표적인 셀프 호스팅 구성입니다. 다만 막상 구성하려고 하면 볼륨 마운트, 환경 변수, 로그 관리, DB 연결 설정 등에서 예상보다 많은 시행착오를 겪을 수 있습니다. 특히 기본 설정값으로 운영하다가 데이터가 휘발된 경험이 있다면, 이번에 소개하는 n8n + PostgreSQL 도커 컴포즈 구축 가이드를 천천히 따라 하며 사전에 발생할 수 있는 문제를 줄여 보시기 바랍니다.

📌 핵심 요약
왜 n8n + PostgreSQL인가? SQLite 대비 뛰어난 동시성 처리와 데이터 무결성 보장.
도커 컴포즈 필수 구성: 볼륨 마운트, 환경 변수, 헬스체크, 네트워크 설정.
운영 팁: 자동 백업, 메모리 상한, 업데이트 전 스냅샷.
주의사항: postgres:15-alpine 사용, DB 패스워드는 .env로 분리 관리.

n8n과 PostgreSQL을 선택해야 하는 핵심 이유

n8n은 기본적으로 SQLite를 내장해 간단한 테스트나 개인용 자동화에는 빠르게 사용할 수 있습니다. 다만 프로덕션 환경이나 여러 워크플로우가 동시에 실행되는 환경에서는 동시 쓰기와 조회 성능이 저하될 가능성이 있습니다. SQLite는 단일 파일 기반이라 프로세스 간 동시 쓰기 처리에 제약이 있고, 데이터가 쌓일수록 백업과 복구 과정이 번거로워집니다. 반면 PostgreSQL은 동시성 처리에 강점이 있고, JSONB 데이터 타입을 지원해 n8n의 복잡한 워크플로우 데이터를 보다 체계적으로 저장할 수 있습니다. 또한 도커 컴포즈를 활용하면 n8n과 PostgreSQL을 하나의 네트워크로 묶어 동일한 설정을 재현하기 쉬워집니다.

도커 컴포즈로 n8n + PostgreSQL 구축하기

가장 안정적인 운영 환경을 만들려면 docker run 명령어를 반복해서 입력하는 대신, 구성 변경 이력과 복구 절차를 관리할 수 있는 도커 컴포즈 파일을 사용하는 것이 좋습니다. 아래는 헬스체크와 볼륨 분리를 적용해 프로덕션에서 활용할 수 있는 기본 구조입니다.

version: '3.8'

services:
  postgres:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      - POSTGRES_USER=${POSTGRES_USER:-n8n}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=${POSTGRES_DB:-n8n}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-n8n}']
      interval: 10s
      timeout: 5s
      retries: 5

  n8n:
    image: n8nio/n8n:latest
    restart: unless-stopped
    ports:
      - '5678:5678'
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_USER=${POSTGRES_USER:-n8n}
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
      - DB_POSTGRESDB_DATABASE=${POSTGRES_DB:-n8n}
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy

volumes:
  postgres_data:
  n8n_data:

설정에서 주의할 포인트는 다음과 같습니다. 첫째, healthcheck를 넣지 않으면 n8n 컨테이너가 PostgreSQL 준비 전에 먼저 실행되어 연결 오류가 발생할 수 있습니다. 위 예시처럼 depends_oncondition: service_healthy를 함께 지정하세요. 둘째, N8N_ENCRYPTION_KEY는 자격 증명을 암호화하는 핵심 값입니다. 최초 실행 후 변경하면 기존 자격 증명을 복호화할 수 없으므로 별도 저장소에 안전하게 보관하세요. 셋째, 볼륨을 각각 분리하면 DB 데이터와 워크플로우 설정 파일을 독립적으로 백업할 수 있습니다. 예시의 ${POSTGRES_PASSWORD}, ${N8N_ENCRYPTION_KEY}는 같은 폴더의 .env 파일에서 값을 가져옵니다.

보안 및 성능 최적화 설정

기본 compose 파일로도 동작하지만, 실제 운영 환경에서는 아래 추가 설정을 함께 검토하는 것이 좋습니다.

  • 메모리 상한: n8n은 대량의 데이터를 처리할 때 컨테이너 메모리가 갑자기 늘어날 수 있습니다. mem_limit: 1g처럼 제한을 두어 호스트 전체에 영향을 주는 사고를 막으세요.
  • 시간대 설정: TZ=Asia/Seoul를 추가하면 로그와 스케줄 실행 시간을 한국 시간에 맞출 수 있습니다.
  • PostgreSQL 파라미터 튜닝: 기본값으로도 충분히 동작하지만, 워크플로우가 많아진다면 command: ['postgres', '-c', 'shared_buffers=256MB', '-c', 'max_connections=200']처럼 시작 옵션을 추가해 성능을 조정할 수 있습니다.
  • 동시 실행 제한: N8N_CONCURRENCY_PRODUCTION_LIMIT을 설정하면 한 번에 실행되는 워크플로우 수를 제한해 메모리 폭증을 완화할 수 있습니다.

셀프 호스팅 전략: 클라우드 VPS vs 온프레미스

도커 호스팅을 어디에 두느냐에 따라 운영 난이도가 달라집니다. 개인 NAS나 온프레미스 서버는 초기 비용이 낮을 수 있지만, 전원, 네트워크, 하드웨어 수명을 직접 관리해야 합니다. 반면 클라우드 VPS는 월 비용이 발생하지만 장애 대응과 복구가 상대적으로 수월합니다.

비교 항목 클라우드 VPS 온프레미스 서버
초기 비용 월 6~12달러 수준 하드웨어 구매 비용 발생
유지보수 스냅샷 자동화 용이, 업체 관리 직접 하드웨어 점검 필요
확장성 클릭 몇 번으로 CPU·메모리 증설 부품 추가 구매 및 재부팅 필요
네트워크 속도 업체마다 다르나 대체로 안정적 가정용 인터넷 의존, 업로드 속도 제약

개인 프로젝트나 소규모 팀이라면 디지털오션(DigitalOcean) 같은 클라우드 VPS를 우선 검토하는 것이 일반적입니다. VPS에는 도커 이미지를 올리고 스냅샷을 만들기 쉬워, n8n 업데이트 전 안전한 복원 지점을 확보하는 데 유용합니다.

디지털오션 공식 사이트에서 VPS 상품 살펴보기

이 링크는 제휴 링크로, 조건 충족 시 소정의 수수료가 발생할 수 있습니다.

사전 구축 시 반드시 알아야 할 3가지 함정

1. DB 볼륨 권한 문제

PostgreSQL 공식 이미지는 컨테이너 내부의 postgres 사용자(UID 999)로 데이터를 기록합니다. 호스트 볼륨을 바인드 마운트 할 때 디렉터리 소유자가 root이면 컨테이너가 Permission denied 오류를 내며 종료될 수 있습니다. 호스트 디렉터리를 사용한다면 chown -R 999:999 ./postgres_data로 소유권을 바꾸거나, named volume을 사용하는 것이 안전합니다. 기존 데이터가 있는 볼륨이라면 소유권 변경 전에 먼저 백업하세요.

2. 동시 실행이 많은 환경에서의 메모리 관리

n8n은 워크플로우를 노드 단위로 실행하며, HTTP 요청이나 파일 변환 작업이 많으면 메모리 사용량이 빠르게 증가합니다. 여러 워크플로우를 동시에 실행하도록 예약해 둔 경우에는 컨테이너가 예기치 않게 종료될 수 있습니다. 도커 컴포즈에 mem_limit을 설정하고, n8n의 N8N_CONCURRENCY_PRODUCTION_LIMIT을 워크플로우 규모에 맞게 조정하면 부하를 분산하는 데 도움이 됩니다. 또한 컨테이너가 종료되어도 자동으로 다시 시작되도록 restart: unless-stopped를 유지하세요.

3. 업데이트로 인한 데이터 마이그레이션

n8n 이미지를 latest 태그로 운영하면 업데이트 시점에 스키마가 변경되거나 예상치 못한 동작이 발생할 수 있습니다. 운영 환경에서는 테스트를 마친 특정 버전 태그를 사용하고, 업데이트 전 docker compose down으로 컨테이너를 정리한 뒤 볼륨 스냅샷이나 백업을 먼저 생성하세요. 이후 docker compose pulldocker compose up -d를 순차적으로 실행하면 데이터 변경 과정을 조금 더 안전하게 진행할 수 있습니다.

결론: 안정적인 운영을 위한 실행 체크리스트

n8n + PostgreSQL 조합을 도커 컴포즈로 구축하는 것은 단순한 설치를 넘어 데이터 소유권과 운영 자유도를 확보하는 과정입니다. 아래 3가지를 기본 체크리스트로 삼아 운영 안정성을 높여 보세요.

  1. DB 패스워드와 N8N_ENCRYPTION_KEY는 .env로 분리하고, .env 파일을 .gitignore에 추가해 외부에 노출되지 않게 관리하세요.
  2. 매일 새벽 3시에 도커 볼륨을 백업하는 크론 잡을 만들고, 백업 파일을 별도 클라우드 스토리지에 보관해 장애에 대비하세요.
  3. 워크플로우가 10개 이상이고 동시 실행이 잦다면 관리형 데이터베이스(Managed Database) 도입을 검토해 운영 리스크를 분산하세요.

셀프 호스팅의 진정한 가치는 단순 비용 절감이 아니라, 플랫폼에 종속되지 않고 내 데이터를 통제할 수 있는 자유입니다. 이 가이드를 바탕으로 여러분의 자동화 인프라가 더욱 탄탄해지길 바랍니다.

Similar Posts

답글 남기기

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