다들 알다시피 GitHub 메인에는 피드가 표시됩니다. 그리고 또 누군가 누른 스타에 의한 호기심에 이끌려 설치해본 좋은 앱 하나를 소개합니다.


n8nio/n8n

n8n은 일종의 자동화 도구입니다. 워크 플로우를 설정하면 설정한 트리거에 맞추어 미리 짜여진 규칙에 따라 기능을 실행합니다. 또한 트리거로 반복 작업(Interval task)이나 Cron을 사용할 수도 있습니다. 상당히 유용하다고 생각되어 꼭 소개하고 싶네요. 저와 같은 경우에는 GitHub의 비공개 Git 저장소에서 release 이벤트를 받아 자동으로 배포하는 작업을 만들 예정입니다.

사용 환경 및 앱 구성

직접 n8n을 docker가 아닌 OS 위에서도 바로 실행해보았습니다. 하지만 저는 개발이 목적이 아닌 이상 깔끔하게 Docker 위에서 실행하는 것을 권장합니다. 이 가이드에서는 Docker와 Nginx를 사용하며 아래와 같은 순서로 진행될 예정입니다.

  1. 호스트와 컨테이너 간 공유할 볼륨 설정
  2. Docker 컨테이너 만들기

Docker 컨테이너에 공유할 폴더 생성

먼저 Docker 컨테이너에서 호스트와 공유하여 사용할 폴더를 생성합니다. 저와 같은 경우는 Node.JS 앱들이 위치한 /var/nodes/n8n/data에 설정했습니다. 이 때 디렉터리 이름은 상관이 없으며, 개인의 용도나 목적에 맞게 다시 설정하시길 바랍니다.

cd /var/nodes
mkdir n8n
cd n8n
mkdir data
cd data
mkdir .n8n

n8n의 설정은 SQLite 파일 데이터베이스에 저장됩니다. 컨테이너 기준으로 /root/.n8n에서 액세스할 수 있는데, 미리 트리를 만들어두었습니다. 위 명령을 기준으로 호스트에서의 /var/nodes/n8n/data 폴더는 컨테이너의 /root 폴더로 연결됩니다.

Docker 컨테이너 실행

n8n 앱의 홈페이지에서 기본적으로 Docker 컨테이너를 생성하는 명령어가 적혀있습니다. 하지만 저희는 이를 웹 상에 공개할 예정이니 n8n에서 제공하는 Basic authentication 값을 설정할 예정입니다.

# Spin up a basic container
docker run -it --rm \
   --name n8n \
   -p 5678:5678 \
   -v ~/.n8n:/root/.n8n \
   n8nio/n8n  

n8n 문서에 따르면 아래와 같은 환경 변수(Docker)로 Basic authentication를 구성할 수 있습니다. Docker 컨테이너의 환경 변수는 Dockerfile이 아닌 CLI 환경에서도 e 플래그를 추가하면 설정할 수 있습니다.

export N8N_BASIC_AUTH_ACTIVE=true
export N8N_BASIC_AUTH_USER=<USER>
export N8N_BASIC_AUTH_PASSWORD=<PASSWORD>

모두 마무리하면 아래와 같은 명령어를 사용하게 될 것입니다.

docker run -itd --rm --name n8n -p 5678:5678 -v /var/nodes/n8n/data:/root -e N8N_BASIC_AUTH_ACTIVE=true -e N8N_BASIC_AUTH_USER=<USERNAME> -e N8N_BASIC_AUTH_PASSWORD=<PASSWORD> n8nio/n8n n8n start

여기까지 완료하셨다면 localhost의 5678번 포트에서 실행 중인 n8n을 확인할 수 있습니다.

Nginx 구성 및 설정 업데이트

Nginx 구성은 딱히 기존의 Express 앱과 다르지 않게 맞추어 주었습니다.

location / {
  proxy_pass http://localhost:5678;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection 'upgrade';
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $remote_addr;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_cache_bypass $http_upgrade;
  proxy_redirect off;
}

나머지는 크게 다르지는 않습니다. 이제 새 DNS를 배포하거나 하위 디렉터리에 배포하는 등의 작업만이 남아있을 뿐입니다.

감사합니다.