사내 자동화 시스템 구축을 맡으면서 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
는
애플리케이션과 실행환경을 Container 단위로 패키징해주는 플랫폼이다.
여기서 실행환경이란 OS 레이어(가상환경), 라이브러리 등에 대해 지칭하는 말이다.
도커 엔진은 말 그대로 돌아가는 도커의 런타임을 의미한다.
systemctl status docker
로 engine deamon 상태를 확인할 수 있다.
컨테이너의 template 역할을 한다.
read only의 레이어 집합으로, Dockerfile
을 빌드하면 생성된다.
다수의 Container를 하나의 스택으로 정의/실행하는 오케스트레이터
docker-compose.yml
파일을 통해 설정한다.
n8n
은 오픈소스 워크플로우 자동화 도구로,
UI를 통해 노드들을 연결해 데이터 페칭 -> 가공 -> 외부 서비스 연결
등의 업무를
자동/수동(웹훅)으로 수행하는 역할을 한다.
쉽고 간단하게 워크플로우를 구축할 수 있고,
Slack
, Git
, Gmail
등 다양한 노드를 제공한다.
워크플로우 구축이 정말 간단하기 때문에
초기 설정(Credentials
, Output JSON 타입
등)만 잘 해놓는다면
개발자가 아니여도 무난하게 사용할 수 있다.
나는 Docker에 FastAPI
환경을 8001 포트로 ports: - "8001:8000"
(호스트는 8001
, 컨테이너는 8000
)
n8n 환경을 5678
포트로 설정해 작성했다.
유의해야 할 점은
Docker 환경에서 n8n
이 localhost:8000/api
에 접근할 때는
HTTP Request
노드에서 http://[호스트명(서비스명)]:8000/api
로 접근해야한다.
왜냐하면, 컨테이너끼리 통신할 때는 호스트 내 통신이 아니기때문에
도커 네트워크 안의 호스트명에 대한 포트번호로 호출해야하기 때문이다.
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) 기반 예측 시스템에서
정확성 향상을 위해 시도한 다양한 과정을 작성해보겠다.