n8n을 설치해보기로 했습니다. n8n을 무엇으로 읽는지는 저는 잘 모르겠지만 일반적으로는 '엔팔엔'으로 읽거나 n-eight-n이니 '네이튼'으로 읽는 게 보통이더라구요. 그나저나 K7은 '케이세븐'으로 읽는데 K8은 '케이팔'로 읽는 거 저만 그런걸까요
n8n에서 설명하는 n8n은 low-code automation tool 입니다. 코드를 아예 사용하지 않는 것은 아니지만 최소한으로 사용하는 자동화 도구죠. 동종의 서비스 중에 더 유명한 make가 있지만 자체 호스팅이 가능한 n8n도 많이 사용더라구요.
설치를 위한 준비물
우선 집에 놀고 있는 컴퓨터 한 대가 있다면 그걸 사용하십시오. 놀고 있는 컴퓨터가 없다구요? 저런, 그렇다면 AWS나 Digitalocean을 통해 가상 서버를 한 대 구축해야 합니다. 물론 달마다 지불해야하는 돈이 있지요. 뭔가 공짜로 하려고 하는건데 이걸 할거면 그냥 make 유료 구독을 하는 게 더 나을겁니다.
놀고 있는 컴퓨터가 한 대 있다면 cloudflare 에서 놀고 있는 도메인도 하나 필요합니다. 도메인이 없다구요? 하나 만드십시오. 이건 싸게 만들 수 있고 월마다 내는 돈이 아니니 최대한 싸게 만듭시다.
놀고 있는 컴퓨터에 우분투를 깔아주고 이 컴퓨터와 다른 컴퓨터의 연결을 위한 ssh 설정도 잘 해줍니다. 포트만 잘 열어주면 됩니다. 그리고 n8n 설치를 위해 docker와 docker compose도 설치해주세요.
= 사실 전 이미 어느정도 자원을 가진 상태에서 하는겁니다. 만약 n8n에 한번 도전해보고 싶다! 하는 사람들이나 우분투니 docker니 무슨 말인지 잘 모르겠다 하시는 분들은 n8n에서 튜토리얼을 사용하는 게 더 나을겁니다.
설치하기
n8n 공식에서는...
n8n 공식 사이트에서는 다음과 같이 docker-compose.yml을 작성하도록 되어있습니다.
version: "3.7"
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
volumes:
traefik_data:
external: true
n8n_data:
external: true
하지만 저에게는 다음 두 가지 문제점이 있었습니다. 한 가지는 여기에 cloudflare tunnel에 대한 설정을 추가해야한다는 점이고 다른 하나는 이걸 하다가 알았지만 여기에는 traefik dashboard에 대한 설정이 없었다는 겁니다.
수정본
수정한 내용은 다음과 같습니다.
version: "3.7"
services:
traefik:
image: "traefik:v2.10"
container_name: traefik
restart: always
command:
- "--api.dashboard=true" #대시보드 활성화
- "--entrypoints.dashboard.address=:8080"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.customport.address=:9091"
# - "--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"
- "8080:8080"
volumes:
- traefik_data:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- traefik_network
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.rule=Host(`traefik.${DOMAIN_NAME}`)"
- "traefik.http.routers.traefik.entrypoints=dashboard"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.routers.mixpost.entrypoints=customport"
# - "traefik.http.routers.traefik.tls.certresolver=mytlschallenge"
n8n:
image: "docker.n8n.io/n8nio/n8n"
container_name: n8n
restart: always
labels:
- "traefik.enable=true"
- "traefik.http.routers.n8n.rule=Host(`n8n.${DOMAIN_NAME}`)"
- "traefik.http.routers.n8n.entrypoints=web"
# - "traefik.http.routers.n8n.tls.certresolver=mytlschallenge"
environment:
- N8N_HOST=n8n.${DOMAIN_NAME}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.${DOMAIN_NAME}/
volumes:
- n8n_data:/home/node/.n8n
networks:
- traefik_network
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel run
environment:
- TUNNEL_TOKEN=${CLOUDFLARE_TUNNEL_TOKEN}
networks:
- traefik_network
volumes:
traefik_data:
external: true
n8n_data:
external: true
networks:
traefik_network:
external: true
여기에 당연히 .env는 하실거라 믿고 n8n.{당신이 설정한 도메인}으로 들어가면 화면이 뜰 겁니다. 뜰거라 믿고 오늘은 여기까지!
Discussion