Docker와 n8n, FastAPI를 통한 자동화 시스템 구축

조민수·2025년 9월 12일
0

개발

목록 보기
12/12

사내 자동화 시스템 구축을 맡으면서 n8n에 대해 공부하게 되었고,
약 2주간의 개발 과정끝에 Ubuntu Linux환경에서 Docker위에 n8n을 올린 자동화 시스템을 구축했다.

시스템 요약

간단하게 시스템 구조를 요약하자면
FastAPI를 통해 GET API 라우터 3개를 구성했고,
n8n으로 3개의 Workflow를 구축했다.

각 workflow는 지정된 시간에 지정된 api를 호출하고, 결과 JSON에 대해
IF 노드로 판단한 이후에 지정된 Slack 채널에 결과를 보낸다.

내부 api 과정은 대략적으로
: Oracle DB에서 데이터 확인 -> 외부 API와 결합해 핵심 데이터 도출 -> ChatGPT API를 통한 예측 기능 수행 -> 결과 Oracle DB에 저장
의 흐름으로 이어진다.

거두절미하고 왜 많은 자동화 방법 중 Docker + n8n을 택했으며
과정과 결과를 간략하게 설명하고자 한다.


Docker란?

많은 분들이 사용하고 있고, 이제는 소프트웨어 빌드의 표준이 되었다고 해도 무방한 Docker
애플리케이션과 실행환경을 Container 단위로 패키징해주는 플랫폼이다.

여기서 실행환경이란 OS 레이어(가상환경), 라이브러리 등에 대해 지칭하는 말이다.

1. Docker Engine

도커 엔진은 말 그대로 돌아가는 도커의 런타임을 의미한다.

  • 컨테이너, 이미지, 네트워크, 볼륨 등을 관리한다.

systemctl status docker로 engine deamon 상태를 확인할 수 있다.

2. Docker Image 파일

컨테이너의 template 역할을 한다.
read only의 레이어 집합으로, Dockerfile을 빌드하면 생성된다.

  • Image -> (RUN) -> Container

3. Docker Compose

다수의 Container를 하나의 스택으로 정의/실행하는 오케스트레이터
docker-compose.yml파일을 통해 설정한다.


n8n이란?

n8n은 오픈소스 워크플로우 자동화 도구로,
UI를 통해 노드들을 연결해 데이터 페칭 -> 가공 -> 외부 서비스 연결 등의 업무를
자동/수동(웹훅)으로 수행하는 역할을 한다.

쉽고 간단하게 워크플로우를 구축할 수 있고,
Slack, Git, Gmail 등 다양한 노드를 제공한다.

워크플로우 구축이 정말 간단하기 때문에
초기 설정(Credentials, Output JSON 타입 등)만 잘 해놓는다면
개발자가 아니여도 무난하게 사용할 수 있다.


구축하며

나는 Docker에 FastAPI 환경을 8001 포트로 ports: - "8001:8000"
(호스트는 8001, 컨테이너는 8000)
n8n 환경을 5678 포트로 설정해 작성했다.
유의해야 할 점은
Docker 환경에서 n8nlocalhost:8000/api에 접근할 때는
HTTP Request 노드에서 http://[호스트명(서비스명)]:8000/api로 접근해야한다.

왜냐하면, 컨테이너끼리 통신할 때는 호스트 내 통신이 아니기때문에
도커 네트워크 안의 호스트명에 대한 포트번호로 호출해야하기 때문이다.


docker-compose.yml에서 n8n 설정

FastAPI, n8n을 올린 docker-compose.yml은 다음과 같다.

services:
  # FastAPI 애플리케이션
  Application-Name:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: HostName
    ports:
      - "8001:8000"
    environment:
      # Oracle Client 경로 (호스트와 동일한 경로)
      ...
      # Thick Mode 연결을 위한 Instant client 환경
    env_file:
      - .env.local
    volumes:
      # 개발용 코드 마운트 (코드 변경 시 자동 리로드)
      - ./app:/app/app:rw
      # SQLite 데이터 영속성
      - ./data:/app/data
      # 로그 디렉토리
      - ./logs:/app/logs
      # 호스트의 Oracle Client를 동일한 경로로 마운트 (호스트에서 작동했던 경로)
      ...
      
    # 서버 재실행해도 자동화 시스템 복구
    restart: always
    ...

  # n8n 워크플로우 (자동화용)
  n8n:
    image: n8nio/n8n:latest
    container_name: HostName
    user: "1000:1000"
    ports:
      - "5678:5678"
    environment:
      - N8N_BASIC_AUTH_ACTIVE=true
      ...
      - GENERIC_TIMEZONE=Asia/Seoul
      - WEBHOOK_URL=http://HostName:8000
    volumes:
      - ./n8n_data:/home/node/.n8n
    ...
    restart: unless-stopped
    profiles:
      - automation

networks:
  milk-predict-network:
    driver: bridge

volumes:
  n8n_data:
    driver: local

마치며...

되게 복잡한 빌드를 한 것은 아니지만
이전에는 꽤나 막막하고 어려워보였던 빌드가 Claude Code와 함께 1시간도 안걸렸다.
심지어 오래 걸린 이유가 Oracle DB 연결이 반드시 Thick Mode여야 했기 때문에
Instant Client 환경 설정에서 애를 먹었기 때문이었다.

n8n cloud로 안하고 꾸역꾸역 로컬에 한 이유는
1. 일단 비용문제를 고려한 점이 있었고
2. Docker위에 올렸기때문에 Dockerfile, docker-compose.yml만 있으면
서버가 바뀌거나 다른 환경에서도 똑같이 자동화 시스템을 수행할 수 있기 때문이다.

나름 또 오랜만에 Docker 찾아보고 n8n이라는 새로운 툴을 성공적으로 다뤄서 기분이 좋다.

다음엔 실제로 이 시스템(ChatGPT-5 API) 기반 예측 시스템에서
정확성 향상을 위해 시도한 다양한 과정을 작성해보겠다.

profile
Being a Modern Software Engineer

0개의 댓글