n8n in Docker

nona·2026년 3월 30일

n8n : Nodemation
https://n8n.io

OpenClaw, Claude Code 로 자동화 프로그램을 만들어 cron 등에 걸어 실행하고 있는데 이 프로그램들 관리가 쉽지 않았습니다. 나도 잊고 에이전트도 잊는(???)

이런 류의 작업들은 n8n 에 몰아두면 좋을 것 같아 Docker 에 설치했습니다.

SQLite 를 써도 충분할 것 같긴 하지만 PostgreSQL 을 붙여 보기로 합니다.

docker-compose.postgres.yml 파일을 생성합니다.

services:
  postgres:
    image: postgres:16-alpine
    container_name: n8n_postgres
    restart: unless-stopped
    environment:
      - POSTGRES_USER=${POSTGRES_USER:-n8n}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}
      - POSTGRES_DB=${POSTGRES_DB:-n8n}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-n8n} -d ${POSTGRES_DB:-n8n}"]
      interval: 10s
      timeout: 5s
      retries: 5

  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=${N8N_HOST:-localhost}
      - N8N_PORT=5678
      - N8N_PROTOCOL=${N8N_PROTOCOL:-http}
      - WEBHOOK_URL=${WEBHOOK_URL:-http://localhost:5678/}
      - GENERIC_TIMEZONE=${TIMEZONE:-Asia/Seoul}
      - TZ=${TIMEZONE:-Asia/Seoul}
      # DB 설정
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=${POSTGRES_DB:-n8n}
      - DB_POSTGRESDB_USER=${POSTGRES_USER:-n8n}
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}
      # 암호화 키 (최초 설정 후 변경 금지)
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY:?N8N_ENCRYPTION_KEY is required}
      # 기본 인증 (선택)
      - N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE:-false}
      - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER:-}
      - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD:-}
      # <추가> WIFI 존에서 IP로 접속하기 위한 설정 false
      - N8N_SECURE_COOKIE=${N8N_SECURE_COOKIE:-false}
    volumes:
      - n8n_data:/home/node/.n8n
    healthcheck:
      test: ["CMD", "wget", "--spider", "-q", "http://localhost:5678/healthz"]
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  postgres_data:
    driver: local
  n8n_data:
    driver: local

.env 파일을 만들고 POSTGRES_PASSWORD, N8N_ENCRYPTION_KEY 를 생성해서 넣습니다.

# n8n 접속 설정
N8N_HOST=localhost
N8N_PROTOCOL=http
WEBHOOK_URL=http://localhost:5678/
TIMEZONE=Asia/Seoul

# 기본 인증 (선택 — true로 설정 시 아래 값 입력)
N8N_BASIC_AUTH_ACTIVE=false
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=

# PostgreSQL 버전 사용 시 필수
POSTGRES_USER=n8n
POSTGRES_PASSWORD=xxx
POSTGRES_DB=n8n

# 암호화 키 — 최초 설정 후 절대 변경 금지 (자격증명 복호화 불가)
# 생성 방법: openssl rand -hex 32
N8N_ENCRYPTION_KEY=xxx

도커에 올려주면

docker compose -f docker-compose.postgres.yml --env-file .env up -d

컨테이너가 생성됩니다.

그럼 이제 http://localhost:5678 에 접속해서 계정을 생성 해주고 API 키를 만들어서 OpenClaw 에게 던져줘야 하는데, 생각해보니 OpenClaw 는 다른 서버에서 동작하고 있네요?

그래서 docker-compose 에 N8N_SECURE_COOKIE=${N8N_SECURE_COOKIE:-false} 이 설정을 추가해서 다시 올려줍니다.

이제 공유기 IP로 웹에 잘 붙고

OpenClaw 에게 ClawHub 에서 가장 신뢰할만한 스킬로 설치해달라고 했더니 이 스킬을 설치 했습니다.
https://github.com/openclaw/skills/blob/main/skills/thomasansems/n8n/references/api.md

n8n 접속 URL과 API key 를 생성해서 전달해주니 워크플로우를 잘 만들어냅니다.


참, 폴더 생성 등의 추가적인 기능을 사용하기 위해서는 이메일 인증이 필요합니다.

profile
개발 놀이 중

0개의 댓글