n8n을 24시간 돌리고 싶은데 유료 서버비는 부담스럽다.
로컬에서만 쓰기엔 아쉽고, n8n 공식 클라우드 호스팅은 월 최소 €20부터 시작한다.
완전 무료로 n8n을 클라우드에서 돌릴 방법은 없을까?
결론부터 말하면 가능하다. GCP Always Free, Docker, ngrok을 조합하면 서버비 0원으로 n8n을 운영할 수 있다.
왜 유료 클라우드가 비싼지 알게 되었다
3일 넘게 삽질했다.
처음에는 DuckDNS로 무료 도메인을 받아서 Let's Encrypt로 SSL 인증서를 발급하려 했다. 하지만 CAA 레코드 오류가 계속 발생했다.
Error: CAA record for duckdns.org prevents issuance
DuckDNS 측에서 설정한 CAA 정책이 Let's Encrypt 발급을 막고 있었다. 우회할 방법을 찾다가 결국 ngrok으로 방향을 바꿨다.
유료 클라우드가 비싼 이유는 이런 귀찮은 설정을 다 알아서 해주기 때문이다.
하지만 완전 무료 조합을 찾아냈으니 다행이다.
필요한 3가지 요소
GCP e2-micro (서버)
구글 클라우드의 Always Free 프로그램으로 제공되는 무료 VM이다. 1GB RAM, 1vCPU 사양으로 n8n을 돌리기에 충분하다.
제약: us-west1, us-central1, us-east1 리전 중 하나를 선택해야 한다. 표준 영구 디스크 30GB까지만 무료다.
Docker (컨테이너 엔진)
n8n을 격리된 환경에서 실행한다. docker-compose.yml 파일 하나로 설치, 실행, 업데이트를 관리할 수 있다.
ngrok (터널링 + HTTPS)
외부에서 VM에 접속할 수 있게 해주는 터널이다. 무료로 고정 도메인 1개를 제공하며, SSL 인증서도 자동으로 적용된다.
구축 과정
1. GCP VM 생성
프로젝트 생성
- Google Cloud Console 접속
- 구글 계정으로 로그인
- 상단 프로젝트 선택 → "새 프로젝트" 클릭
- 프로젝트 이름 입력 (예: n8n-server)
- 탐색 메뉴 → "결제" → 결제 계정 연결
카드 등록이 필요하지만, Always Free 조건을 지키면 자동 청구되지 않는다.

Compute Engine API 활성화
탐색 메뉴 → "Compute Engine" → "사용" 버튼 클릭
VM 인스턴스 생성
GCP Console → Compute Engine → VM 인스턴스 → "만들기"
필수 설정
이름: n8n-server
리전: us-west1 (Oregon)
영역: us-west1-b
머신 계열: E2
머신 유형: e2-micro
왼쪽메뉴 - OS 및 스토리지
운영체제: Ubuntu
버전: Ubuntu 22.04 LTS x86_64
부팅 디스크 유형: 표준 영구 디스크
크기: 30GB
"만들기" 클릭 → VM 생성 완료 (1~2분 소요)

우측에 "예상 월 비용 $7.11"이 표시되더라도 Always Free 조건을 지키면 실제 과금은 없다.
2. Docker 설치
VM에 SSH로 접속한다. GCP Console에서 "SSH" 버튼을 클릭하면 브라우저 터미널이 열린다.
# 패키지 업데이트
# 업데이트 안 하면 오래된 버전의 Docker 설치될 수 있음
sudo apt update && sudo apt upgrade -y
# Docker 설치
sudo apt install -y docker.io
# Docker Compose 설치 (여러 설정을 yml로 관리하여 docker실행 편리)
sudo apt install -y docker-compose
# 현재 유저를 docker 그룹에 추가 (sudo 없이 docker 사용 가능하게 해줌)
sudo usermod -aG docker $USER
# 그룹 반영을 위해 SSH 재접속
exit
SSH를 다시 열고 버전을 확인한다.
docker -v
docker-compose -v
3. ngrok 설정
ngrok.com에서 가입 후 무료 도메인을 발급받는다.
예: metrizbble-greta-undeadlocked.ngrok-free.dev
VM에 ngrok을 설치한다.
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
| sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
&& echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
| sudo tee /etc/apt/sources.list.d/ngrok.list \
&& sudo apt update \
&& sudo apt install ngrok
Authtoken을 등록한다.
ngrok config add-authtoken [여기에_토큰_붙여넣기]
4. 암호화 키 생성 - ✅추가
n8n 크레덴셜 암호화 키를 생성한다.
이렇게 하면 자격증명을 암호화해서 저장하기 때문에 안전하고, VM을 재시작해도 크레덴셜 유지가 된다
openssl rand -hex 32
출력 예시
6c907f98a687c1b6074fa6c78fad773ee8e10ff02eaa3447a3338db0e315675c
⚠️ 상황 결과
| 키 미설정 | 재시작마다 새 키 자동생성 → 크레덴셜 날아감 |
| 키 변경 | 기존 크레덴셜 전부 복호화 불가 |
| 키 분실 | 크레덴셜 복구 불가 |
| 키 고정 유지 | ✅ 재시작해도 항상 안전 |
5. n8n 설치
데이터 폴더를 생성한다.
# n8n 폴더 생성
mkdir -p ~/n8n/data
cd ~/n8n
# 데이터 폴더 권한 설정 (n8n 컨테이너 유저: 1000)
sudo chown -R 1000:1000 ~/n8n/data
- chown -R 1000: 1000의 의미는 n8n 컨테이너가 사용하는 유저 ID가 1000번이기 때문이다. 이 권한 설정을 하지 않으면 n8n이 데이터를 저장하지 못한다.
docker-compose.yml 파일을 작성한다.
sudo apt install -y nano # 터미널에서 파일 편집하는 텍스트 에디터 설치
nano docker-compose.yml # 파일 작성
아래 내용을 붙여넣는다.
- YOUR_NGROK_DOMAIN: 앞서 발급받은 ngrok 도메인으로 교체
- YOUR_OPENSSL_RAND_HEX_32: 앞서 생성한 암호화키로 교체
version: "3.8"
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "127.0.0.1:5678:5678" # ✅추가: 외부 IP로 직접 접근 차단
environment:
- N8N_HOST=YOUR_NGROK_DOMAIN
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://YOUR_NGROK_DOMAIN
- GENERIC_TIMEZONE=Asia/Seoul
- N8N_EDITOR_BASE_URL=https://YOUR_NGROK_DOMAIN
- N8N_SECURE_COOKIE=false # ✅추가: 세션/쿠키 문제 해결
- N8N_PROXY_HOPS=1 # ✅추가: ngrok 프록시 경유 시 rate-limit 오작동 방지
- N8N_ENCRYPTION_KEY=YOUR_OPENSSL_RAND_HEX_32 # ✅추가: 암호화키 고정
volumes:
- ./data:/home/node/.n8n
Ctrl+S로 저장하고 Ctrl+X로 종료한다.
n8n을 실행한다.
# 컨테이너 실행
docker-compose up -d
# 실행 확인
docker ps
STATUS가 "Up"이면 정상이다.
6. ngrok 터널 실행
백그라운드로 ngrok을 실행한다.
nohup ngrok http --domain=YOUR_NGROK_DOMAIN 5678 > /dev/null 2>&1 &
브라우저에서 https://YOUR_NGROK_DOMAIN으로 접속한다.
n8n 초기 계정 생성 화면이 나오면 성공이다🎉
데이터 영속성 보장
~/n8n/data 폴더를 서버의 '안전 금고'로 지정했다.
n8n 컨테이너를 삭제하거나 업데이트해도 이 폴더에 저장된 워크플로우와 자격 증명은 유지된다.
volumes:
- ./data:/home/node/.n8n
이 설정이 없으면 컨테이너를 재시작할 때마다 모든 데이터가 사라진다.
로컬 n8n과 서버 n8n을 함께 운영하는 법
일반적인 개발 플로우는 다음과 같다.
로컬 n8n (개발/테스트) → 완성 → 서버 n8n (운영)
로컬에서 워크플로우를 만들고 테스트한 뒤, 정상 작동하면 서버로 옮긴다.
왜 이렇게 해야 하는가?
서버 n8n에서 직접 테스트하다가 워크플로우가 꼬이면 운영 중인 자동화가 멈춘다. 로컬에서는 아무리 실수해도 서비스에 영향이 없다.
버전 일치가 중요하다
로컬 n8n과 서버 n8n의 버전이 다르면 같은 워크플로우가 다르게 동작할 수 있다.
예를 들어 바이너리 데이터를 다룰 때, 구버전은 data 키를 사용하지만 최신 버전은 내부적으로 키 이름을 다르게 처리한다.
// 구버전 (로컬)
const binaryData = $input.first().binary.data;
// 최신버전 (서버)
const binaryData = await this.helpers.getBinaryDataBuffer(0, Object.keys($input.first().binary)[0]);
이런 차이 때문에 로컬에서는 작동하던 워크플로우가 서버에서는 에러를 낸다.
버전을 맞추는 방법은 간단하다. 로컬 n8n도 Docker로 실행하고, docker-compose.yml에서 이미지 태그를 서버와 동일하게 지정한다.
image: n8nio/n8n:latest
실제 운영 경험
GitHub 자동화 워크플로우를 서버에 배포할 때 문제가 발생했다.
Discord 노드에서 서버 선택이 초기화되어 있었다. 로컬에서 설정한 자격 증명이 서버로 넘어오지 않았기 때문이다.
자격 증명은 각 n8n 인스턴스에 독립적으로 저장된다. 로컬에서 설정했다고 해서 서버에 자동으로 적용되지 않는다.
해결 방법은 서버 n8n에서 각 자격 증명을 다시 추가하고, 워크플로우의 Discord 노드에서 서버를 재선택하는 것이다.
주요 명령어 정리
# n8n 실행
cd ~/n8n && docker-compose up -d
# n8n 중지
cd ~/n8n && docker-compose down
# n8n 재시작
cd ~/n8n && docker-compose restart
# n8n 로그 확인
docker logs n8n -f
# n8n 업데이트
cd ~/n8n && docker-compose pull && docker-compose up -d
# Ngrok 백그라운드 실행
nohup ngrok http --domain=YOUR_NGROK_DOMAIN 5678 > /dev/null 2>&1 &
# Ngrok 종료
pkill ngrok
+++
ngrok이 몇 시간 후 꺼진다면
nohup 방식으로 ngrok을 실행하면 VM이 재시작되거나 SSH 세션이 끊길 때 ngrok도 종료된다.
이 문제가 반복된다면 systemd 서비스로 등록하면 된다. VM이 재시작되어도 ngrok이 자동으로 실행된다.
서비스 파일 생성
sudo nano /etc/systemd/system/ngrok.service
아래 내용을 붙여넣는다.
- YOUR_NGROK_DOMAIN: 앞서 발급받은 ngrok 도메인
- YOUR_USERNAME: 현재 사용자 이름 (터미널에서 `whoami` 명령어로 확인)
[Unit]
Description=ngrok tunnel
After=network.target
[Service]
ExecStart=/usr/local/bin/ngrok http --domain=YOUR_NGROK_DOMAIN 5678
Restart=always
RestartSec=5
User=YOUR_USERNAME
[Install]
WantedBy=multi-user.target
Ctrl+S로 저장하고 Ctrl+X로 종료한다.
서비스 등록 및 실행
# 부팅 시 자동 실행 등록
sudo systemctl enable ngrok
# 즉시 실행
sudo systemctl start ngrok
# 실행 확인
sudo systemctl status ngrok
active (running) 상태가 확인되면 완료다.
⚠️ 주의사항
기존에 nohup으로 실행 중인 ngrok이 있다면 먼저 종료한다.
pkill ngrok
한계
성능
e2-micro는 1GB RAM, 1vCPU다. 복잡한 워크플로우를 동시에 여러 개 실행하면 느려진다.
간단한 자동화 몇 개를 돌리는 용도로는 충분하지만, 대규모 데이터 처리에는 부적합하다.
ngrok 무료 플랜
무료 플랜은 도메인 1개만 제공한다. 여러 n8n 인스턴스를 운영하려면 유료 플랜이 필요하다.
또한 ngrok 배너가 첫 접속 시 표시된다. 프로덕션 용도로는 적합하지 않다.
Always Free 정책 변경 위험
GCP가 Always Free 정책을 변경하면 무료 운영이 불가능해진다. 2026년 현재는 안전하지만, 장기적으로는 불확실하다.
결론
유료 클라우드가 왜 비싼지 알게 되었다.
완전 무료로 세팅하려니 도메인, SSL, 권한 설정이 모두 수동이었고, 3일 넘게 삽질했다.
하지만 한 번 구축해두면 평생 무료로 n8n을 돌릴 수 있다.
로컬 n8n으로 개발하고, 서버 n8n으로 운영하는 구조를 만들면 안정적이다. 버전만 맞춰두면 워크플로우 이식도 문제없다.
완전 무료 조합을 찾아내서 다행이다.
참고 링크
- Google Cloud Console — https://console.cloud.google.com/
- GCP Always Free 프로그램 공식 문서 — https://cloud.google.com/free/docs/free-cloud-features
- n8n 공식 Docker 이미지 (Docker Hub) — https://hub.docker.com/r/n8nio/n8n
- n8n 공식 클라우드 호스팅 — https://n8n.io/cloud
- ngrok 공식 사이트 (가입 및 도메인 발급) — https://ngrok.com/
- ngrok 설치 공식 문서 — https://ngrok.com/docs/getting-started/
'📂 업무자동화 > n8n워크플로우' 카테고리의 다른 글
| Discord 메시지를 GitHub TIL로 자동 변환하는 n8n 워크플로우 (0) | 2026.02.03 |
|---|