Introduction

주말엔 본 목적을 위한 작업을 하는것은 너무 머리 아픈 일이다. 가뜩이나 DevOps 는 하나 하나 하다보면서 알게되는게 너무 많았다. 그래서 평상시에도 꼭 배우리라 생각했던 n8n 기반의 자동화, 비로소 작업해보았다…!

0단계 - connection lost … 응? (1)

n8n 을 다른 서버에서 사용하는 것도 가능은 하다. 하지만 이왕 하는거 셀프 호스팅을 도전해보았다.

Node 를 Create 했는데 우상단에 Connection lost 가 보임

Blocked GET /assets/npsSurvey.store-B7_iNEDS.js for "Mozilla/5.0 (compatible; archive.org_bot; Wayback Machine Live Record; +http://archive.org/details/archive.org_bot)"

Pruning old insights data

Pruning old insights data

Pruning old insights data

ValidationError: The 'X-Forwarded-For' header is set but the Express 'trust proxy' setting is false (default). This could indicate a misconfiguration which would prevent express-rate-limit from accurately identifying users. See https://express-rate-limit.github.io/ERR_ERL_UNEXPECTED_X_FORWARDED_FOR/ for more information.

    at Object.xForwardedForHeader (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/express-rate-limit@7.5.0_express@5.1.0/node_modules/express-rate-limit/dist/index.cjs:187:13)

    at Object.wrappedValidations.<computed> [as xForwardedForHeader] (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/express-rate-limit@7.5.0_express@5.1.0/node_modules/express-rate-limit/dist/index.cjs:398:22)

    at Object.keyGenerator (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/express-rate-limit@7.5.0_express@5.1.0/node_modules/express-rate-limit/dist/index.cjs:671:20)

    at /usr/local/lib/node_modules/n8n/node_modules/.pnpm/express-rate-limit@7.5.0_express@5.1.0/node_modules/express-rate-limit/dist/index.cjs:724:32

    at /usr/local/lib/node_modules/n8n/node_modules/.pnpm/express-rate-limit@7.5.0_express@5.1.0/node_modules/express-rate-limit/dist/index.cjs:704:5 {

  code: 'ERR_ERL_UNEXPECTED_X_FORWARDED_FOR',

  help: 'https://express-rate-limit.github.io/ERR_ERL_UNEXPECTED_X_FORWARDED_FOR/'

}

[license SDK] license renewal failed: Connection Error: Unexpected token 'B', "Bad Gateway" is not valid JSON

Failed to renew license: Connection Error: Unexpected token 'B', "Bad Gateway" is not valid JSON

[license SDK] license successfully renewed

AI 의 친절한 조언에 따라 docker logs 를 확인하니, 문제가 뭔지 바로 파악 가능했다.

핵심은 n8n 이 리버스 프록시 뒤에서 실행 중인데, 보안의 문제로 이에 대한 신뢰 설정이 필요하단 점이었다.

해결 방법은 가능하다. 환경 변수에 N8N_TRUST_PROXY=1를 추가하면 된다. 컨테이너 화든 셀프 호스팅이든 자신의 환경에 맞춰 추가하면 된다. 본인은 Docker container 기반으로 해두었기에 yml 파일에 env 변수를 추가해주었다.

      # - N8N_SECURE_COOKIE=false # 1. HTTPS가 아니어도 쿠키 사용 허용 # 프록시 있으니 해제
      - WEBHOOK_URL=https://n8n.paulryu93.ddns.net # 2. n8n의 공개 주소 설정
      - N8N_TRUST_PROXY=1 # 리버스 프록시 신뢰 설정 
      - TZ=Asia/Seoul # 시간 설정 
      - NODE_FUNCTION_ALLOW_EXTERNAL=cheerio,axios # 외부 모듈 설치 요청
      - EXECUTIONS_DATA_PRUNE=true # 로깅 데이터 저장 및 자동 삭제 활성화
      - EXECUTIONS_DATA_MAX_AGE=168 # 로깅 데이터 저장 기간 7일로 지정

이제 재시작하면 된다.

docker compose up -d --force-recreate

0단계 - 또 다른 connection lost (2)

분명히 가이드 문서를 찾아봐도 이걸로 해결 되는 거였다. 근데 안됨. 뭐지? 하고 찾아보니 ‘n8n 에디터’는 웹소켓으로 실시간 통신을 한다고 되어 있고, 해당 기능이 설정되어야 한다고 했다.

Websockets Support 옵션을 켜면

짠, 해결 완료 되었다.

결국 n8n의 환경 변수 설정 + Socket 통신 허용을 해줘야만 n8n 에디터를 제대로 셀프 호스팅이 가능하다.

새로운 문제…

알고 보니 Connection Lost 에러와

  code: 'ERR_ERL_UNEXPECTED_X_FORWARDED_FOR',

  help: 'https://express-rate-limit.github.io/ERR_ERL_UNEXPECTED_X_FORWARDED_FOR/'

이 에러는 실질 다른 문제가 있었다. 이는 현재 메인 서비스를 위한 HTTPS 할당과 별도로 TLS L4 레이어 기반으로 우회를 하여 공인 IP 를 지나, 서브 서버의 443 포트로 전송 되는 문제로 발생한 이슈였다.

이 에러가 문제시 되는 이유는, 현재 설정이 꼬여 IP 가 하나로 들어오는 것처럼 처리 된다는 점이다.

문제의 핵심은 정리해보니… stream 블록으로 우회하는 데, 이 우회 프로토콜을 NPM Plus 는 제대로 아직 인식이 안된다.

즉, Sub-Server 에 Nginx 를 추가하고 HTTPS 를 다시 인증 받아야한다는점이다(…)

1단계 - n8n 워크플로우 생성 및 RSS 데이터 가져오기

  • n8n 은 대단히 직관적이었다. 기본적으로 자동화 툴이다보니 기본적으로 create Workflow를 통해 사용이 가능했고, 만들어진 창의 모습도 직관적이었다.

2단계 - trigger 설정하기

  • 설명이랄 것도 없이, 바로 시작하면 각 단위는 ‘노드’ 라고 하는데 최초의 자동화 동작을 뭘로 할 지를 정할 수 있다.
  • 수동 혹은 app 이벤트, 스케쥴 등 생각할만한 다양한 방법은 존재하며, 심지어 file changes 까지 있는거 보면, 이건 필요한 자동화 마다 골라서 설정하면 된다.

3단계 - 노드 설정

  • 이 다음 부터는 사실상 러닝커브다. 각 노드들은 기능들이 있고, 기능들은 수십가지가 있으며, AI 관련해서도 대응이 되어 있다.필요한건 핵심 로직을 어떻게 짤지 해놓고 거기에 필요한 적절한 설정에 따라 데이터를 가공하고, 합치고, 어레이로 정리하거나 하면 된다.
  • 단 여기서 주의 해야 할 것은 통신 과정에서 json 기반으로 동작하고, Code 노드의 경우 js나 Python 으로 직접 변수 형태로 접근하여 사용이 가능하다. 여기 부분에 바이브 코딩을 같이 얹어주면 직접인 데이터 가공, 저장, 그리고 검색 등을 포함한 serverless 서버까지도 넘겨 볼 수 도있다. (물론 난이도가 올라가지만, 코드를 짜는거에 비하면 양반이긴 하니까…)

4단계 - AI 활용하기

  • n8n 을 써봐야 하고 써보면서 알아두려고 했던 영역이 바로 이것. 바로 AI 기능이 내부에 내장되어 있다는 것이다. 원래 API 등에 따라 웹훅, 혹은 다양한 트리깅으로 자동화 자체에만 집중했다면 n8n 은 AI 기능들을 추가함으로써 AI 빌더가 되었다고 보여진다.
  • 기본적으로 자체적으로 제공해주는 기능도 있기에 credentials만 설정하면 손쉽게 사용이 가능하다.
  • 특히 주의 깊게 본 것은 기본 노드 뿐만 아니라 ‘AI Agent’ 노드 였다. mcp, 메모리용 DB 등 연결이 가능하고, 직접적으로 조절이 되면서 모델을 마음데로 바꿀 수 있었다. 또한 그 외에도 AI 를 위한 파서나, Text classifier, chain 등 배워두면 도움이 아주 될 것이란 생각이 들었다. (그만한 시간을 들여야 겠지만)

결론

  • 현재는 나에게 도움이되는 기사들, DevOps, AI, Backend 관련된 영역에 대한 기사들의 스크래핑 자동화를 만들었고, 여러 조건을 고려한 결과, 일단 현재 가장 최선으로 md 파일 형식으로 정리해주는 것으로 끝을 내었다.

  • n8n 으로 만들어보다 보니 확실히 아이디어가 샘솟는다. 더욱이 Agent 노드는 생각이상으로 구성이 충실하다. 전에 대충 알아본 것에 비하면 확실히 왜 n8n 을 자동화 도구로 쓰는지, 그걸로 뭘 하고 싶어하는지, 실제 수입화의 주요 도구로 쓰는 사람들의 이유는 확실히 있어 보인다. 특히 Obsidian 이나 지식 저장, 블로그 자동화 등 AI 까지 합쳐진 상태에서 얻을 수 있는 건 확실히 많아 보여 앞으로 지속적으로 써보려고 한다.## 요약 내용