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.{당신이 설정한 도메인}으로 들어가면 화면이 뜰 겁니다. 뜰거라 믿고 오늘은 여기까지!