1. 개요
n8n은 오픈소스 워크플로우 자동화 도구입니다. 다양한 앱과 서비스(API, DB, 파일 등)를 연결해서 작업을 자동화할 수 있는 플랫폼입니다. Zapier, Make(Integromat) 같은 SaaS 자동화 서비스의 셀프호스팅 대안으로 많이 쓰입니다. 우분투에 설치하는 과정을 정리해 보았습니다.
2. 리눅스에 PostgreSQL 설치
n8n은 PostgreSQL 사용을 권장한다. PostgreSQL은 객체-관계형 데이터베이스 관리 시스템이다.
> sudo apt update
> sudo apt install postgresql postgresql-contrib
설정 파일 (version 14인 경우)
> sudo vi /etc/postgresql/14/main/postgresql.conf
아래 부분을 찾아서 listen_addresses = 'localhost'를 아래와 같이 수정하고 컴맨트를 해제하여 활성화 한다.
listen_addresses = '*'
> sudo vi /etc/postgresql/15/main/pg_hba.conf
맨 아래 줄에 다음을 추가한다.
# TYPE DATABASE USER ADDRESS METHOD
host n8n n8n 0.0.0.0/0 md5
> sudo systemctl enable postgresql
> sudo systemctl start postgresql
현재 상태를 알려면 > sudo systemctl status postgresql
다시 시작하려면 > sudo systemctl restart postgresql
n8n 전용 계정을 만들고 DB를 생성한다.
> sudo -u postgres psql
postgres=# CREATE USER n8n WITH PASSWORD 'n8npass';
postgres=# CREATE DATABASE n8n OWNER n8n;
postgres=# GRANT ALL PRIVILEGES ON DATABASE n8n TO n8n;
postgres=# \q
> sudo systemctl restart postgresql
> sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Fri 2025-09-12 20:33:25 KST; 44min ago
Process: 2117459 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 2117459 (code=exited, status=0/SUCCESS)
CPU: 550us
3. n8n Docker 컨테이너 설치하기
시스템에 Docker가 구축 되어 있다고 가정한다.
> sudo mkdir -p /home/node
> cd /home/node
> mkdir -p ./n8n_data
소유권을 컨테이너의 node(UID 1000, GID 1000)로 변경. 또한 권한 설정을 한다.
> sudo chown -R 1000:1000 ./n8n_data
> sudo chmod 600 ./n8n_data/config 2>/dev/null || true
docker-compose.yml 파일을 생성한다.
> sudo vi /home/node/docker-compose.yml
애래와 같이 입력한다.
services:
n8n:
image: n8nio/n8n:latest
restart: always
ports:
- "127.0.0.1:5678:5678"
environment:
# --- DB: PostgreSQL ---
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: host.docker.internal # 같은 서버의 Postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: n8npass
# --- 운영 권장 ---
N8N_RUNNERS_ENABLED: "true"
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
# 필요 시 보안 강화
# N8N_BLOCK_ENV_ACCESS_IN_NODE: "true"
# 32자 이상 랜덤 문자열 (백업 필수)
# N8N_ENCRYPTION_KEY: "REPLACE_WITH_LONG_RANDOM_SECRET"
# --- 프록시 뒤 (서브패스 예시) ---
N8N_PATH: "/n8n"
N8N_EDITOR_BASE_URL: "https://<Host DNS>/n8n/"
WEBHOOK_URL: "https://<Host DNS>/n8n/"
N8N_HOST: "<Host DNS>"
N8N_PROTOCOL: "https"
N8N_PROXY_HOPS: "1"
volumes:
- ./n8n_data:/home/node/.n8n
extra_hosts:
- "host.docker.internal:host-gateway"
다음 명령어로 docker 컨테이너를 시작한다.
> docker compose down
> docker compose up -d
> docker compose logs -f n8n
n8n-1 | Initializing n8n process
n8n-1 | n8n ready on ::, port 5678
n8n-1 | n8n Task Broker ready on 127.0.0.1, port 5679
n8n-1 | [license SDK] Skipping renewal on init: license cert is not initialized
n8n-1 | Version: 1.110.1
n8n-1 |
n8n-1 | Editor is now accessible via:
n8n-1 | Registered runner "JS Task Runner" (nZaR8EbPgs5iAkEva_Np_)
4. nginx를 사용한다면 다음과 같이 설정한다.
> cd /etc/nginx/sites-available
> sudo vi default
location /n8n/ {
proxy_pass http://127.0.0.1:5678/;
proxy_http_version 1.1;
# WebSocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Forwarded headers
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 100m;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
> sudo nginx -t && sudo systemctl reload nginx
웹브라우저에서 https://<Host DNS>/n8n 접속을 한다.
