n8n은 워크플로우를 설계하고 트리거를 관리하는 메인 서버 역할을 합니다. n8n Worker는 메인 서버에서 분리된 실행 전용 프로세스로, 실제 작업을 병렬로 처리해 성능을 높여줍니다. Redis는 메인과 Worker 사이에서 작업을 주고받는 큐 역할을 하며 실행 안정성을 보장합니다. 이 구조를 통해 UI와 실행 부하가 분리되어 안정적으로 서비스할 수 있고, Worker 수를 늘려 손쉽게 확장할 수 있습니다. 그래서 n8n + Worker + Redis 조합은 대규모 자동화를 효율적이고 안정적으로 운용하기 위한 구조입니다.
안녕하세요,
이전글 헤츠너(Hetzner) 서버에 유저 계정 생성과 Docker Compose 설치까지 완료했어요.
그래서 이번엔 Docker Compose로 N8N과 기타 연동될 도구까지 같이 배포해볼게요.
N8N은 기본적으로 HTTPS를 사용하고 있어요.
그래서 본인 소유의 도메인과 HTTPS 인증서가 필요해요.
여기서 도메인은 저희가 구매를 해야해요.
도메인 구매가 없으면 IP로 접속해야합니다.
N8N에서 IP로 접속하려면 HTTPS를 비활성화 해야아는데
이 경우 보안적으로 취약해서 HTTPS를 유지한채로 IP로 접속할 수 있도록
Self-Signed도 구성해서 배포할꺼에요.
사전 준비 파일
위에 말한 구성을 진행하기 위해 아래 3가지 파일이 필요합니다.
- docker-compose.yml
- .env
- Self-Signed Cert
제가 만든 파일을 공유드릴테니, 여러분은 공유된 파일을 수정하고 Self-Signed Cert을 만들어야 해요
저는 N8N 공식 문서에서 공유되는 Docker-Compose 템플릿을 기반으로 수정했어요.
https://github.com/n8n-io/n8n-hosting/tree/main/docker-compose/withPostgresAndWorker
https://github.com/n8n-io/n8n-hosting/tree/main/docker-compose/subfolderWithSSL
위 2개의 Github의 파일을 참고해서 만든 템플릿을 다운받아 주세요.
압축 파일을 해제하면 3가지 파일이 생성됩니다.
- docker-compose.yml
- .env
- init-data.sh
파일이 정상인지 메모장이나 텍스트 편집기로 모두 열어서 확인해주세요.
docker-compose.yml
docker-compose.yml 파일은 docker-compose에서 사용되는 파일로
여러 개의 Docker 컨테이너를 한 번에 정의하고 실행할 수 있는 설정 파일 입니다.
Docker-Compose는 여러 개의 컨테이너를 하나의 서비스처럼 정의하고 관리하는 도구이구요.
아래는 제가 업로드한 Docker-Compose 내용입니다.
version: '3.8'
volumes:
db_storage:
n8n_storage:
redis_storage:
x-shared: &shared
restart: always
image: docker.n8n.io/n8nio/n8n
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}
- EXECUTIONS_MODE=queue
- QUEUE_BULL_REDIS_HOST=redis
- NODE_ENV=production
- N8N_ENCRYPTION_KEY=${ENCRYPTION_KEY}
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- N8N_PROTOCOL=https
- N8N_HOST=0.0.0.0 # 서버 IP 또는 localhost
- WEBHOOK_URL=https://localhost
links:
- postgres
- redis
volumes:
- n8n_storage:/home/node/.n8n
depends_on:
redis:
condition: service_healthy
postgres:
condition: service_healthy
initContainer:
condition: service_completed_successfully
services:
traefik:
image: traefik
restart: always
command:
- '--api=true'
- '--api.insecure=true'
- '--providers.docker=true'
- '--providers.docker.exposedbydefault=false'
- '--entrypoints.web.address=:80'
- '--entrypoints.web.http.redirections.entryPoint.to=websecure'
- '--entrypoints.web.http.redirections.entryPoint.scheme=https'
- '--entrypoints.websecure.address=:443'
- '--providers.file.filename=/certs/traefik_dynamic.yml'
- '--log.level=INFO'
ports:
- '443:443'
- '80:80'
volumes:
- ./certs:/certs
- /var/run/docker.sock:/var/run/docker.sock:ro
postgres:
image: postgres:16
restart: always
environment:
- POSTGRES_USER
- POSTGRES_PASSWORD
- POSTGRES_DB
- POSTGRES_NON_ROOT_USER
- POSTGRES_NON_ROOT_PASSWORD
volumes:
- db_storage:/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
redis:
image: redis:6-alpine
restart: always
volumes:
- redis_storage:/data
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
interval: 5s
timeout: 5s
retries: 10
initContainer:
image: busybox
command: ['sh', '-c', 'chown -R 1000:1000 /home/node/.n8n']
volumes:
- n8n_storage:/home/node/.n8n
n8n:
<<: *shared
labels:
- traefik.enable=true
- traefik.http.routers.n8n.rule=HostRegexp({host:.+}) || PathPrefix(/)
- traefik.http.routers.n8n.tls=true
- traefik.http.routers.n8n.entrypoints=web,websecure
- traefik.http.routers.n8n.entrypoints=websecure
- traefik.http.services.n8n.loadbalancer.server.port=5678
n8n-worker:
<<: *shared
command: worker
YML에 기재된 내용을 간단히 정리하면 다음과 같아요.
- Traefik : 외부에서 들어오는 요청을 받아 HTTPS 인증서 관리와 리버스 프록시 역할 수행 → n8n 웹 서비스로 연결
- n8n : 메인 애플리케이션(UI와 API 제공)
- n8n-worker : n8n에서 발생한 실행(Job)을 큐에서 가져와 실제 처리
- Postgres : 워크플로우, 실행 로그, 사용자 정보 등 n8n의 주요 데이터를 저장하는 데이터베이스
- Redis : 작업 실행을 큐(queue) 방식으로 관리, 메인 앱과 워커 사이의 메시지 브로커 역할
- Volumes : Postgres, Redis, n8n의 데이터를 컨테이너 외부에 저장해 컨테이너 재시작이나 교체에도 데이터 유지
그래서 아래와 같이 동작해요.
N8N은 DB를 설정하지 않으면 SQLite를 사용하는데, Postgres를 사용하는게 좀더 관리하기 쉽고 활용하기 좋아요.
수정할 부분
여기서 한가지 수정해야하는 부분이 있어요.
docker-compose.yml의 25번째줄에 있는 값을 변경해야해요.
WEBHOOK_URL=https://localhost --> https://<Hetzner Public IP>
Hetzner에서 VPS 대여 시 할당받았던 Public IP로 변경해야해요.
.env
.env는 docker-compose.yml 파일에 정의되어있던 환경 변수의 값을 정의하는 파일이에요.
docker-compose를 실행하면서 환경 변수 값을 .env에서 불러와서 설정해요.
그래서 .env는 아래와 같은 형식으로 정의돼요.
POSTGRES_USER=n8nadmin
POSTGRES_PASSWORD=
POSTGRES_DB=n8n
POSTGRES_NON_ROOT_USER=n8nuser
POSTGRES_NON_ROOT_PASSWORD=
ENCRYPTION_KEY=
GENERIC_TIMEZONE=Asia/Seoul
수정할 부분
여기서는 비어져 있는 값을 채워주셔야 해요.
POSTGRES_PASSWORD=
POSTGRES_NON_ROOT_PASSWORD=
ENCRYPTION_KEY=
위 3가지 값을 채워 주셔야합니다.
참고로 패스워드는 openssl 명령어를 사용하면 쉽게 만들수 있습니다.
헤츠너 VPS 서버에 SSH로 접속해서 아래 명령어를 입력해보세요.
사용할 패스워드 16자리를 쉽게 만들 수 있어요.
openssl rand -base64 48 | sed 's/\//_/g ; s/^\(.\{16\}\).*/\1/'
그리고 패스워드는 .env 파일을 참조하면 확인할 수 있지만,
N8N 내에서 Postgres DB를 사용하려면 계정 정보는 꼭 기억해두셔야해요.
init-data.sh
Postgres DB를 초기화할 때 사용하는 스크립트에요. 별도로 저희가 건드릴건 없어요.
docker-compose가 실행되면서 해당 쉘 스크립트를 알아서 불러와서 사용해요.
주의 사항
위 3가지 파일은 같은 디렉토리(폴더) 내에 있어야해요.
Self-Signed Cert 생성
3가지 파일 준비를 마쳤다면, 이제 Self-Signed Cert를 생성할꺼에요.
헤츠너(Hetzner) VPS에 SSH로 접속 후 아래 명령어를 실행해주세요.
mkdir -p certs openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout certs/selfsigned.key -out certs/selfsigned.crt -subj "/CN=localhost"
참고로 3가지 준비 파일이 있는 디렉토리(폴더)에서 명령어를 실행해야해요
명령어를 실행하면, 현재 디렉토리 아래에 'certs' 라는 폴더가 생성돼요.
그리고 그 안에는 selfsigned.key / selfsigned.crt가 있어요.
ls -al
위 명령어를 실행해서 아래와 같이 'docker-compose.yml', '.env', 'init-data.sh' 그리고 'certs' 폴더가 같은 곳에 보여야해요.
Docker-Compose를 통한 N8N 설치 및 실행
다시 한번 확인
- docker-compose.yml 파일의 25줄 WEBHOOK_URL의 localhost 값을 헤츠너 Public IP로 변경
- .env 내 POSTGRES_PASSWORD / POSTGRES_NON_ROOT_PASSWORD / ENCRYPTION_KEY 값 설정
- Self-Signed Cert 생성
위 3가지는 다시 한번 확인해주세요.
하나라도 안한게 있다면 동작하지 않아요.
Docker-Compose로 N8N 실행
이제 N8N을 실행할때가 왔어요,
docker-compose.yml이 있는 위치에서 아래 명령어를 실행해주세요.
docker compose up -d
그럼 아래와 같은 화면이 나타납니다.
docker-compose.yml에 정의된 컨테이너 이미지를 받아오고, 설정하고 실행하는 과정이 진행중이에요.
이미지를 다운 받는 속도에 따라 달라져요. 저는 한 2분 정도 소요된 것 같아요.
과정이 완료되면 아래와 같은 메세지가 출력됩니다.
이제 docker-compose를 통한 N8N 구축이 완료됐어요.
docker를 이용하니 쉽고 빠르고 구축할 수 있어요.
헤츠너(Hetzner) 방화벽 수정
N8N 구축이 완료되었지만 아직 한가지 작업이 빠졌어요.
그건 헤츠너(Hetzner)에서 방화벽을 수정하는 작업이에요.
저희는 SSH 22번 포트로만 접속했기에 처음 헤츠너(Hetzner) VPS 방화벽 작업 시 22번만 허용했어요.
하지만 지금은 웹에 HTTPS로 접속해야하기 때문에 443 포트에 대한 허용이 필요해요.
헤츠너(Hetzner) 클라우드 대시보드로 접속한 다음, 좌측 메뉴에서 [ Firewalls ]로 접속해요.
그럼 저희가 생성한 방화벽 룰이 보일거에요.
선택해서 들어가주세요.
하단의 [ + Add rule ]을 선택해요.
그리고 첫번째 22번 포트에대한 방화벽 룰과 동일하게 집의 공인 IP로 설정하고 Port를 443으로 설정해요.
그럼 아래와 같아질꺼에요.
그리고 하단의 [ Save changes ]로 저장해주세요.
N8N 접속 및 계정생성과 라이선스 등록
방화벽 설정까지 완료되었으니 이제 N8N에 웹 브라우저로 접속해볼게요.
https://<헤츠너 Public IP>
위 주소로 접속합니다. IP는 헤츠너(Hetzner) 서버 정보에서 확인할 수 있어요.
여기서 N8N은 기본 5678 포트를 쓰는데 443으로 진입하는게 의아하신분들고 있을꺼에요.
저희는 N8N 앞단에 Traefik을 통해 리버스 프록시 형태로 동작해요.
Traefik에서 리스닝중인 443 포트로 진입하면 내부적으로 N8N의 5678 포트로 연결시켜줘요.
그래서 저희는 5678이 아닌 443으로 접근하면 되는거에요.
웹 브라우저로 접속하면 성공적으로 아래와 같은 화면을 볼 수 있습니다.
N8N 계정 생성
초기 접속하면 N8N 계정 생성 창이 나타나요.
저희는 현재 N8N에 계정을 만들지 않은 상태이기 때문에 계정을 만들어야해요.
여기서 중요한건 실제로 여러분들이 사용하는 메일 주소를 넣어야 합니다.
이유는 해당 메일 주소로 커뮤니티 라이선스를 받기 때문이에요.
N8N 초기 접속
계정을 생성하고 나면 다음과 같은 창이 나타납니다.
해당 질문에 맞게 여러분들이 선택하시면 됩니다.
저는 아래와 같이 대답했어요.
N8N 라이선스 키
이전 응답에 대답하고 나면 아래와 같이 라이선스 키를 받을 수 있어요.
[ Send me a free license key ]를 선택하면 지정된 메일로 라이선스 키가 발송된답니다.
그리고 나면 화면의 우측 하단의 다음과 같은 메세지가 나타나요.
[ usage and plan ]을 선택하시면 라이선스 키 입력 창으로 이동돼요
아래 메뉴로 이동돼요.
여기에 라이선스 키를 입력할 수 있어요.
이제 등록한 메일의 메일함으로 가보면 n8n 라이선스 키가 도착해있어요.
여기에 있는 라이선스 키를 위의 라이선스 등록 창에 등록하면 돼요
인증하고 나면 아래와 같이 창이 바뀝니다.
N8N 설정 마무리
HTTPS + Self Signed Cert + Postgres DB + Redis + Traefik 구성의 N8N 구성이 완료되었습니다.
이제 N8N을 통한 다양한 자동화 작업을 진행해보세요!
정리
이번 글에서 HTTPS + Self Signed Cert + Postgres DB + Redis + Traefik 구성을 진행했어요.
특히 Redis나 Postgres DB를 활용하면 N8N 자동화 작업 시 특정 상태 또는 데이터를 보존하면서 작업을 진행할 수 있어요.
그리고 중간에 헤츠너(Hetzner) 방화벽 수정 작업이 있었는데,
22번 포트나 443포트에 대한 접근제한 설정을 잊지말고 꼭 해두시는걸 권장드려요.
설정하지 않으면 외부에서 누군가가 진입할 수 있기 때문이에요.
이전 글 참고
2025.08.20 - [N8N] - N8N 셀프 호스팅 구축기 (1) - 헤츠너(Hetzner) 가입
2025.08.21 - [N8N] - N8N 셀프 호스팅 구축기 (2) - 헤츠너(Hetzner) VPS 생성
2025.08.22 - [N8N] - N8N 셀프 호스팅 구축기 (3) - 리눅스 계정 생성 및 도커 설치
'N8N' 카테고리의 다른 글
N8N 셀프 호스팅 구축기 (5) - CloudFlare Domain + Hetnzer VPS + Docker Compose + N8N (하) (5) | 2025.08.29 |
---|---|
N8N 셀프 호스팅 구축기 (5) - CloudFlare Domain + Hetnzer VPS + Docker Compose + N8N (상) (5) | 2025.08.27 |
N8N 셀프 호스팅 구축기 (3) - 리눅스 계정 생성 및 도커 설치 (5) | 2025.08.22 |
N8N 셀프 호스팅 구축기 (2) - 헤츠너(Hetzner) VPS 생성 (1) | 2025.08.21 |
N8N 셀프 호스팅 구축기 (1) - 헤츠너(Hetzner) 가입 (3) | 2025.08.20 |