본문 바로가기
Automation Tool/n8n Project

Sense Stock, D+25

by 그때 그때 끄적 2025. 8. 24.

📅 Sense Stock 개발 일지 (2025-08-24)

n8n, 사용자 질의 기반 경제/시장/주식 분석 자동화 파이프라인 구축 중 진행한 작업들을 정리합니다.

오늘은 의존성 지옥부터 파일 권한 문제까지 해결한 작업 내용을 정리했습니다.

 

지난번에는 기존 자동화 워크플로우를 최적화하고, 오늘은 Parsing 결과 확인과 프롬프트 고도화를 할 예정이었으나..

 

n8n 버전 업데이트라는 간단해 보이는 작업이 어떻게 의존성 문제와 예상치 못한 권한 문제로 이어졌는지, 그리고 그 모든 과정을 어떻게 해결했는지에 대한 전체 여정을 공유하려 한다.

모든 것의 시작은 "Update가 오랫동안 안됐다는 알림"에서 부터이다. ㅋㅋㅋㅋ

 

기존 docker-compose.yml이 build 명령어로 이미지를 만들고 있었기에, 이걸 n8n 공식 이미지를 사용하는 image: n8nio/n8n:latest로 바꾸면 아주 깔끔하고 편해질 것이라 기대했다. 하지만 그건 거대한 착각의 시작이었다.

 

docker-compose up -d를 실행하자마자, 잘 돌아가던 모든 워크플로우가 멈춰 섰다. 원인을 파고들자 부끄러운 진실과 마주했다. 내 시스템은 그냥 n8n이 아니었다. 웹 자동화를 위한 Playwright 이미지를 기반으로, Python, gspread, fastapi, beautifulsoup4 등 수많은 커스텀 패키지를 설치한, 나만의 맞춤형 시스템이었던 것이다. 당연히 아무것도 없는 공식 이미지에서는 내 '특별한 부품들'을 찾을 수 없으니 에러가 나는 게 당연했다.

 

🧱 3단계에 걸친 문제 해결 과정

STEP 1. 처참하게 실패한 '공식 이미지' 사용법

# Before: 내가 직접 만든 커스텀 이미지
services:
  n8n:
    build:
      context: .

# After: 모든 것을 망가뜨렸던 시도
services:
  n8n:
    image: n8nio/n8n:latest # 이 한 줄이 문제였다!

 

STEP 2. 성공적인 'Dockerfile' 직접 수정

# 기존 RUN npm install -g n8n
# 변경
RUN npm install -g n8n@1.45.1 # 버전을 콕 집어 설치

이후 docker-compose build로 이미지를 재빌딩하여 1차 문제를 해결했다.

 

STEP 3. '환경 변수'로 권한 문제 해결

업데이트 후 발생한 파일 쓰기 권한 오류는 환경 변수 추가로 해결했다.

# docker-compose.yml
services:
  n8n:
    # ... (기존 설정들)
    environment:
      # n8n 폴더에 대한 파일 접근 차단을 해제(true, Default)
      - N8N_BLOCK_FILE_ACCESS_TO_N8N_FILES=false

 

🗂 전체 작업 흐름 정리

  1. (실패) 단순 업데이트 시도: docker-compose.yml의 build를 image 태그로 변경.
  2. 1차 문제 직면: 커스텀 의존성(Playwright, Python 패키지 등)이 모두 사라져 워크플로우 중단.
  3. 1차 원인 분석: 내 시스템이 고도로 커스텀된 환경이라는 사실을 깨달음.
  4. (성공) 올바른 업데이트: Dockerfile에서 npm install -g n8n@<Version>으로 버전을 명시하고 docker-compose build로 이미지 재빌드.
  5. 2차 문제 직면: 업데이트 성공 후, 파일 저장 노드에서 "is not writable" 권한 에러 발생.
  6. 2차 원인 분석: n8n 버전업에 따른 내부 보안 정책 변경으로 추정.
  7. 최종 해결: docker-compose.yml에 N8N_BLOCK_FILE_ACCESS_TO_N8N_FILES=false 환경 변수를 추가하여 컨테이너 재시작. 모든 기능이 정상화됨.

 

🧠 진행 중 고민한 점들

  • 업데이트는 끝이 아니었다
    버전 숫자만 올리면 끝날 줄 알았는데, 버전업에 따른 정책 변경(Breaking Changes), 추가 기능 등
    릴리즈 내용을 주기적으로 확인해야겠다. 좋은 기능들이 그 사이 많이 생겻더라.
    • 실시간(Chat Streaming)을 답변을 해준다. 나중에 적용해봐야겠다.
      • 장점으로는 사용자가 요청했을때 작업의 진해여부를 알 수 있다.
    • Debug 상태에서 Workflow 수정 가능(Edit in Debug)
      • 매우 유용한 기능이다. 내가 매번 실행하고 Debug 상태에서 수정하고 싶었는데, 좋은 기능이다.
  • 문서화, 그리고 또 문서화
    Dockerfile에 어떤 패키지를 왜 설치했는지, 내 시스템이 어떤 특별한 환경 변수 설정을 필요로 하는지 기록해뒀더라면 이 모든 삽질의 절반은 줄일 수 있었을 것이다.
  • 미궁에 빠진 N8N_RESTRICT_FILE_ACCESS_TO
    예전에 특정 경로 접근 제어에 잘 사용했던 이 변수가 이번엔 왜 제대로 작동하지 않았는지 아직도 의문이다. 찜찜...

그리고 지난번 Google OAuth2 인증 관련 Error에 대한 해결 내용을 작성했었는데, 또 다시 Error가 발생했다.

관련 내용은 아래 블로그 글에 추가적으로 작성했다.

https://cord-ai.tistory.com/251

 

n8n, Google OAuth2 인증 오류

https://cord-ai.tistory.com/213 n8n, Google Calendar OAuth2 인증 오류n8n을 Docker에 설치해서 잘 사용하다가, 서버를 재시작하거나 Docker 컨테이너를 다시 실행했더니 Google Calendar 인증이 풀리는 경험, 해보셨나

cord-ai.tistory.com

 

❓ 다음 단계에서 고민 중인 것들

  • Data Search 노드의 결과값 분리
    현재는 기업과 매칭되는 데이터를 'context'라는 하나의 키에 전부 담아서 추출(Output)하고 있다. 앞으로 프롬프트에서 '기업 개요', '최신 뉴스'처럼 필요한 정보만 개별로 참조할 수 있도록, 결과값을 명확히 구분해서 추출하는 구조로 변경해야 한다.
  • Best Keyword Extract 프롬프트 수정
    이전에 질문의 '유효성 검사' 기능을 별도의 Agent로 분리했기 때문에, 기존 Agent의 역할을 재정의해야 한다. 이제 이 Agent는 유효성 검사 없이, 이미 검증된 질문에서 순수하게 핵심 키워드를 추출하는데만 집중하도록 프롬프트를 수정할 필요가 있다.
  • Keyword Parsing Node 에러 해결
    Best Keyword Extract Agent에서 결과값이 정상적으로 나왔음에도, 바로 다음 노드인 Keyword Parsing Node에서 에러가 발생하고 있다. 두 노드 사이에 오고 가는 데이터의 형식이 맞지 않는 것으로 추정됨.

원래 이전과 같은 이슈가 없었으면 아래 내용들을 그대로 진행할려고 했었던건데... 😕

 

 

'Automation Tool > n8n Project' 카테고리의 다른 글

Sense Stock, D+24  (5) 2025.08.14
💣 프로젝트 트러블슈팅 및 삽질 기록  (4) 2025.08.12
Sense Stock 개발 회고, 세 번째  (3) 2025.08.12
Sense Stock, D+23  (2) 2025.08.11
Sense Stock, D+22  (4) 2025.08.06

댓글