본문 바로가기

n8n self-hosting 방식으로 구축하기

_Big 2024. 12. 17.

n8n을 self-hosting 방식으로 Docker에 구축하는 방법에 대해 간단히 정리했습니다. 내용은 Ubuntu 22.04 기준으로 설치하는 방법으로 작성했습니다. 아래 순서대로 작업하시면 됩니다.

 

n8n self-hosting 방식으로 구축하기

 

1. Docker 설치 하기

sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker && sudo systemctl start docker

sudo usermod -aG docker ${USER}
su - ${USER}



2. Docker-Compose 설치하기

sudo apt-get install docker-compose-plugin



3. DNS 설정

n8n을 사용하기 위한 도메인 설정이 필요합니다.

Record: A
Hostname: n8n
IP: n8n 접속 시 사용하는 IP



4. Docker Compose 파일 작성

mkdir n8n && cd n8n
mkdir n8n-local-files
vi docker-compose.yml

아래 <USERNAME> 부분 수정해서 사용하세요. n8n-local-files 디렉토리는 n8n으로 로컬 파일을 읽거나 쓰기 위한 구성입니다.

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"
      - "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
      - "--certificatesresolvers.mytlschallenge.acme.email=${SSL_EMAIL}"
      - "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - traefik_data:/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock:ro

  n8n:
    image: docker.n8n.io/n8nio/n8n
    restart: always
    ports:
      - "127.0.0.1:5678:5678"
    labels:
      - traefik.enable=true
      - traefik.http.routers.n8n.rule=Host(`${SUBDOMAIN}.${DOMAIN_NAME}`)
      - traefik.http.routers.n8n.tls=true
      - traefik.http.routers.n8n.entrypoints=web,websecure
      - traefik.http.routers.n8n.tls.certresolver=mytlschallenge
      - traefik.http.middlewares.n8n.headers.SSLRedirect=true
      - traefik.http.middlewares.n8n.headers.STSSeconds=315360000
      - traefik.http.middlewares.n8n.headers.browserXSSFilter=true
      - traefik.http.middlewares.n8n.headers.contentTypeNosniff=true
      - traefik.http.middlewares.n8n.headers.forceSTSHeader=true
      - traefik.http.middlewares.n8n.headers.SSLHost=${DOMAIN_NAME}
      - traefik.http.middlewares.n8n.headers.STSIncludeSubdomains=true
      - traefik.http.middlewares.n8n.headers.STSPreload=true
      - traefik.http.routers.n8n.middlewares=n8n@docker
    environment:
      - N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - NODE_ENV=production
      - WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
    volumes:
      - n8n_data:/home/node/.n8n
      - /home/<USERNAME>/n8n/n8n-local-files:/files

volumes:
  traefik_data:
    external: true
  n8n_data:
    external: true



5. .env 파일 작성

docker-compose.yml 파일이 있는 위치에 .env 파일을 작성합니다.

vi .env
# The top level domain to serve from
DOMAIN_NAME=yourdomain.com

# The subdomain to serve from
SUBDOMAIN=n8n

# Optional timezone to set which gets used by Cron-Node by default
# If not set New York time will be used
GENERIC_TIMEZONE=Asia/Seoul

# The email address to use for the SSL certificate creation
SSL_EMAIL=user@yourdomain.com



6. Docker Volume 생성하기

n8n_data, traefik_data 이름의 Docker 볼륨을 생성합니다. n8n은 SQLite의 데이터베이스 파일과 암호화 키를 n8n_data 볼륨에 저장합니다.

docker volume create n8n_data
docker volume create traefik_data



7. IPv6 비활성화 하기

n8n 노드들 중 일부는 IPv6가 활성화 되어 있는 경우 에러가 발생합니다. 그래서 비활성화 합니다.

sudo vi /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
sudo sysctl -p



8. Docker Compose 시작하기

docker compose up -d



9. n8n 업데이트 하기

# pull latest n8n version
docker compose pull

# stop and remove older version
docker compose down

# start the container
docker compose up -d

댓글