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