n8n을 npm + systemd로 셀프 호스팅하기 (Ubuntu)

Ubuntu 서버에 n8n을 npm으로 설치하고 systemd 데몬으로 상시 실행하는 설정 과정을 방화벽·SSL·PostgreSQL 연동까지 정리한다.

2026-08-12 · 최초 발행 2025-06-11

Ubuntu 서버에 n8n을 직접 설치하고 systemd로 관리하면, 별도 컨테이너 런타임 없이도 부팅 시 자동 실행과 비정상 종료 시 자동 재시작을 확보할 수 있다. Node.js·npm 위에 n8n을 얹고 systemd 유닛 하나로 묶는 구성이라 의존성 관리가 시스템 패키지 수준에서 이뤄진다는 점이 Docker 기반 배포와 가장 크게 갈리는 지점이다.

사전 준비

Ubuntu 20.04 LTS 또는 22.04 LTS, 루트 또는 sudo 권한이 있는 계정, SSH로 접근 가능한 네트워크 환경이 필요하다. Node.js(LTS, 18.x 또는 20.x)와 npm, systemd(Ubuntu 기본 포함)도 갖춰야 한다.

Node.js와 n8n 설치

시스템을 최신 상태로 유지한다.

sudo apt update && sudo apt upgrade -y

n8n은 Node.js 환경에서 실행되므로 NodeSource 저장소로 LTS 버전을 설치한다.

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
sudo apt-get install -y nodejs

setup_20.x는 Node.js 20.x를 설치하며, 필요하면 setup_18.x로 바꿀 수 있다. 설치 후 버전을 확인한다.

node -v
npm -v

v20.17.0(Node.js), 10.8.3(npm)처럼 출력되면 정상이다. 일부 npm 패키지 컴파일에 필요할 수 있는 빌드 도구도 선택적으로 설치해 둔다.

sudo apt install -y build-essential

npm으로 n8n을 전역 설치한다.

sudo npm install -g n8n

-g 플래그로 시스템 전역에 설치되며, 설치 후 버전을 확인한다.

n8n -v

2025년 5월 기준 최신 버전은 1.93.0이다. 정상 설치 여부는 수동 실행으로 확인한다.

n8n

기본적으로 포트 5678에서 실행되며, 브라우저에서 http://<서버_IP>:5678로 접속해 계정 설정 화면이 뜨면 성공이다. 확인 후 Ctrl+C로 종료한다. n8n은 설정과 워크플로우 데이터를 ~/.n8n에 저장하므로 디렉토리 권한을 확인해 둔다.

ls -ld ~/.n8n

필요하면 권한을 수정한다.

sudo chown -R $USER:$USER ~/.n8n
sudo chmod -R 755 ~/.n8n

환경 변수로 동작 제어하기

n8n의 포트·호스트·보안 설정은 환경 변수로 제어한다. 홈 디렉토리에 .env 파일을 만든다.

nano ~/.n8n/.env

기본적인 환경 변수 예시는 다음과 같다.

N8N_HOST=0.0.0.0
N8N_PORT=5678
N8N_PROTOCOL=http
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=your_username
N8N_BASIC_AUTH_PASSWORD=your_secure_password
WEBHOOK_URL=http://<your_server_ip_or_domain>:5678/
N8N_ENCRYPTION_KEY=your_secret_encryption_key
GENERIC_TIMEZONE=Asia/Seoul

N8N_HOST는 모든 IP에서 접근 가능하도록 0.0.0.0으로, N8N_PORT는 기본 5678로 두되 필요하면 바꾼다. N8N_BASIC_AUTH_*는 기본 인증 활성화와 계정 설정이고, WEBHOOK_URL은 웹훅 호출용 공용 URL, N8N_ENCRYPTION_KEY는 데이터 암호화용 고유 키(랜덤 문자열 권장), GENERIC_TIMEZONE은 서버 시간대(한국은 Asia/Seoul)다. 저장(Ctrl+O, Enter, Ctrl+X) 후 다시 실행하면 환경 변수가 자동으로 로드된다.

n8n

브라우저에서 접속했을 때 인증 창이 뜨면 환경 변수가 정상 적용된 것이다.

systemd 유닛으로 상시 실행 데몬 만들기

이 구성의 핵심은 systemd 유닛 파일이다. 유닛 파일을 만든다.

sudo nano /etc/systemd/system/n8n.service

아래 내용에서 <your_username>을 실제 계정으로 바꿔 넣는다.

[Unit]
Description=n8n Workflow Automation Tool
After=network.target

[Service]
Type=simple
User=<your_username>
EnvironmentFile=/home/<your_username>/.n8n/.env
ExecStart=/usr/bin/n8n
Restart=always
WorkingDirectory=/home/<your_username>/.n8n

[Install]
WantedBy=multi-user.target

User는 n8n을 실행할 계정으로, 루트가 아닌 일반 사용자를 권장한다. EnvironmentFile은 앞서 만든 .env 경로, ExecStart는 전역 설치 기준 /usr/bin/n8n, WorkingDirectory는 n8n 데이터 디렉토리다. 저장 후 systemd에 등록하고 시작한다.

sudo systemctl daemon-reload
sudo systemctl enable n8n
sudo systemctl start n8n

daemon-reload는 설정 변경 적용, enable은 부팅 시 자동 시작, start는 즉시 실행이다. 서비스 상태를 확인한다.

sudo systemctl status n8n

active (running)이면 성공이고, 오류가 있으면 로그를 본다.

journalctl -u n8n -b

브라우저에서 http://<서버_IP>:5678에 접속해 인증 정보를 입력했을 때 워크플로우 편집 화면이 뜨면 데몬이 정상 동작하는 것이다.

선택 설정: 방화벽·리버스 프록시·데이터베이스

UFW로 필요한 포트만 연다.

sudo apt install ufw -y
sudo ufw allow 22
sudo ufw allow 5678
sudo ufw enable

SSH(22)와 n8n(5678) 포트를 허용하며, HTTPS를 쓸 경우 443도 추가로 연다. HTTPS가 필요하면 Nginx와 Certbot으로 리버스 프록시를 구성한다.

sudo apt install nginx -y
sudo nano /etc/nginx/sites-available/n8n

도메인 이름을 your_domain.com으로 바꿔 아래 설정을 추가한다.

server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass http://localhost:5678;
        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;
    }
}

설정을 활성화한다.

sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

Certbot으로 SSL을 붙인다.

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d your_domain.com

Certbot이 Nginx 설정을 자동으로 HTTPS로 업데이트한다. 이어서 환경 변수도 맞춰 바꾼다.

nano ~/.n8n/.env

N8N_PROTOCOL=httpN8N_PROTOCOL=https로, WEBHOOK_URLhttps://your_domain.com/로 수정한다.

기본 SQLite 대신 프로덕션 환경에는 PostgreSQL을 권장한다.

sudo apt install postgresql postgresql-contrib -y

데이터베이스와 사용자를 만든다.

sudo -u postgres psql
CREATE DATABASE n8n;
CREATE USER n8n_user WITH PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE n8n TO n8n_user;
\q

.env에 다음을 추가한다.

DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=localhost
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_DATABASE=n8n
DB_POSTGRESDB_USER=n8n_user
DB_POSTGRESDB_PASSWORD=your_password

n8n 서비스를 재시작한다.

sudo systemctl restart n8n

업데이트와 백업

npm으로 설치한 n8n은 다음으로 업데이트한다.

sudo npm install -g n8n@latest
sudo systemctl restart n8n

문제가 생기면 systemd 로그를 확인한다.

journalctl -u n8n -b

~/.n8n 디렉토리는 정기적으로 백업한다.

tar -czf n8n_backup_$(date +%F).tar.gz ~/.n8n

최종 점검

http://<서버_IP>:5678 또는 https://your_domain.com으로 접속해 정상 작동하는지, 워크플로우 생성·테스트가 되는지, 방화벽과 인증 설정이 제대로 걸려 있는지 확인한다.

참고 자료

n8n셀프 호스팅systemdUbuntu워크플로우 자동화