AWS EC2에 n8n 설치 및 HTTPS 연결
오픈소스 자동화 도구 n8n을 AWS EC2에서 직접 구축하고,
도메인 + SSL(HTTPS)까지 완벽히 연결하는 방법을 정리했습니다.💡 이 문서는 개인용/기업용 자동화 서버를 직접 운영하려는 분들을 위한 가이드입니다.
🧾 1️⃣ 개요
- 환경: Ubuntu 22.04 LTS + Docker + Nginx + Certbot
- 서버 타입: AWS EC2 (t3.micro~t3.medium 권장)
- 비용: 약 10~12달러/월 (1.4만 원 내외)
- 결과: https://<SUBDOMAIN>.<YOUR_DOMAIN> 형태의 n8n 워크스페이스 완성
☁️ 2️⃣ EC2 생성 및 기본 설정
1️⃣ 인스턴스 생성
- AMI: Ubuntu 22.04 LTS
- 인스턴스 유형: t3.micro
- 스토리지: 20GB (gp3)
- 보안 그룹(인바운드 규칙):
- SSH (22) — 내 IP
- HTTP (80) — 0.0.0.0/0
- HTTPS (443) — 0.0.0.0/0
- (테스트용) TCP 5678 — 내 IP만 허용
2️⃣ 서버 접속
ssh -i <YOUR_KEY>.pem ubuntu@<EC2_PUBLIC_IP>
🐋 3️⃣ Docker 설치
sudo apt update -y
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
정상 확인
docker --version
# Docker version x.xx.x ...
⚙️ 4️⃣ n8n 컨테이너 실행 (임시 HTTP)
mkdir -p ~/n8n_data
sudo chown -R 1000:1000 ~/n8n_data
sudo docker run -d \
--name n8n \
-p 5678:5678 \
-v ~/n8n_data:/home/node/.n8n \
-e N8N_BASIC_AUTH_ACTIVE=true \
-e N8N_BASIC_AUTH_USER=admin \
-e N8N_BASIC_AUTH_PASSWORD=admin \
-e N8N_SECURE_COOKIE=false \
n8nio/n8n
✅ 정상 확인
sudo docker ps
# STATUS: Up ~ seconds → OK
브라우저에서 http://<EC2_PUBLIC_IP>:5678
→ “Set up owner account” 페이지가 보이면 성공
🌐 5️⃣ 도메인 연결
1️⃣ DNS 설정 (Route53 또는 Cloudflare 등)
A 레코드: <SUBDOMAIN>.<YOUR_DOMAIN> → <EC2_PUBLIC_IP>
TTL: 300
2️⃣ DNS 전파 확인
ping <SUBDOMAIN>.<YOUR_DOMAIN>
→ 결과에 EC2 IP 표시되면 OK
(ICMP 응답 없어도 IP만 맞으면 됨)
🧱 6️⃣ Nginx 리버스 프록시 설정
1️⃣ Nginx & Certbot 설치
sudo apt install -y nginx certbot python3-certbot-nginx
2️⃣ 설정 파일 생성
sudo vi /etc/nginx/sites-available/n8n
🔹 아래 내용 복사:
server {
server_name <SUBDOMAIN>.<YOUR_DOMAIN>;
listen 80;
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;
}
}
3️⃣ 활성화
sudo ln -sf /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl restart nginx
✅ 정상 확인
http://<SUBDOMAIN>.<YOUR_DOMAIN> → n8n 페이지 뜨면 성공!
(Welcome to nginx!가 나오면 설정 안 읽히는 상태)
🔒 7️⃣ SSL(HTTPS) 인증서 발급
sudo certbot --nginx -d <SUBDOMAIN>.<YOUR_DOMAIN>
- 이메일 입력 → 약관 동의(Y)
- 인증 완료 후 메시지:
- Congratulations! You have successfully enabled HTTPS
✅ 이 문구가 나오면 SSL 발급 성공
🧩 8️⃣ Nginx SSL 설정 (최종 수정)
sudo vi /etc/nginx/sites-available/n8n
아래처럼 수정👇
server {
server_name <SUBDOMAIN>.<YOUR_DOMAIN>;
listen 80;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/<SUBDOMAIN>.<YOUR_DOMAIN>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<SUBDOMAIN>.<YOUR_DOMAIN>/privkey.pem;
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;
}
}
✅ 중복 listen 80; 두 줄이면 반드시 한 줄 삭제!
적용:
sudo nginx -t
sudo systemctl restart nginx
🧭 9️⃣ HTTPS 적용 후 n8n 재실행
sudo docker stop n8n && sudo docker rm n8n
sudo docker run -d \
--name n8n \
-p 5678:5678 \
-v ~/n8n_data:/home/node/.n8n \
-e N8N_BASIC_AUTH_ACTIVE=true \
-e N8N_BASIC_AUTH_USER=admin \
-e N8N_BASIC_AUTH_PASSWORD=admin \
-e WEBHOOK_URL=https://<SUBDOMAIN>.<YOUR_DOMAIN>/ \
n8nio/n8n
✅ 성공 기준
| SSL 발급 완료 | https://<SUBDOMAIN>.<YOUR_DOMAIN> 접속 시 🔒 표시 |
| nginx 정상 | sudo nginx -t → OK |
| docker 정상 | sudo docker ps → STATUS: Up |
| n8n 정상 | “Set up owner account” 페이지 표시 |
| 보안 정리 | 5678 인바운드 규칙 삭제 완료 |
🧠 증상 / 원인 / 해결
| duplicate listen 80 | listen 80 중복 | 하나만 남기기 |
| Welcome to nginx! | default 활성화 | /etc/nginx/sites-enabled/default 삭제 |
| SSL 인증 실패 | 80/443 차단 or DNS 미전파 | SG 개방 후 재시도 |
| n8n 접속 안 됨 | 컨테이너 중지 | sudo docker logs n8n 확인 |
| 쿠키 오류 | HTTPS 미적용 | N8N_SECURE_COOKIE=false or SSL 적용 |
💾 Linux 항목 / 명령어
| SSL 자동 갱신 확인 | `sudo systemctl list-timers |
| 백업 | ~/n8n_data 폴더 (S3 업로드 권장) |
| 업데이트 | sudo docker pull n8nio/n8n 후 재실행 |
| 시간대 설정 | sudo timedatectl set-timezone Asia/Seoul |
이제 https://<SUBDOMAIN>.<YOUR_DOMAIN> 접속 시
n8n 워크스페이스 로그인 페이지 가 뜨면 완벽히 구축된 상태입니다.

이 환경에서
- Notion 자동 체크,
- Supabase 연동,
- Gmail 발송,
- 스케줄 기반 자동화
같은 워크플로우를 자유롭게 구현할 수 있습니다

간단하게 만든 테스트 워크플로우 입니다. 이런식으로 !
✅ 트러블슈팅
1️⃣ WebSocket & Proxy 관련 헤더 추가 (중요)
현재 Nginx 설정에
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
이 세 줄이 없으면
n8n 편집 화면에서 “Connection lost” 메시지가 반복됩니다.
따라서 SSL 설정 완료 후 최종 Nginx 구성을 이렇게 바꿔야합니다.
server {
server_name <SUBDOMAIN>.<YOUR_DOMAIN>;
listen 80;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/<SUBDOMAIN>.<YOUR_DOMAIN>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<SUBDOMAIN>.<YOUR_DOMAIN>/privkey.pem;
location / {
proxy_pass http://localhost:5678;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
proxy_buffering off;
proxy_read_timeout 3600;
proxy_send_timeout 3600;
}
}
- n8n은 워크플로 편집 화면에서 WebSocket / SSE 기반 실시간 통신을 사용합니다.
- 해당 헤더가 빠지면 브라우저가 서버 연결을 “끊김(Connection lost)”으로 인식합니다.
2️⃣ Docker 환경 변수 (보안 + 향후 호환성)
로그에 다음과 같은 경고가 있었습니다.
There are deprecations related to your environment variables...
이건 동작엔 문제 없지만, 아래처럼 하면 장기적으로 완벽한 운영환경이 됩니다.
sudo docker run -d \
--name n8n \
-p 5678:5678 \
-v ~/n8n_data:/home/node/.n8n \
-e N8N_BASIC_AUTH_ACTIVE=true \
-e N8N_BASIC_AUTH_USER=admin \
-e N8N_BASIC_AUTH_PASSWORD=admin \
-e WEBHOOK_URL=https://<SUBDOMAIN>.<YOUR_DOMAIN>/ \
-e N8N_TRUSTED_PROXIES=* \
-e N8N_PROXY_HOPS=1 \
-e N8N_PUSH_BACKEND=websocket \
-e N8N_RUNNERS_ENABLED=true \
-e DB_SQLITE_POOL_SIZE=5 \
-e N8N_GIT_NODE_DISABLE_BARE_REPOS=true \
n8nio/n8n
🔹 추가된 변수 의미
변수 설명
| N8N_TRUSTED_PROXIES | Nginx 뒤에서 올바른 클라이언트 IP 인식 |
| N8N_PROXY_HOPS | 프록시가 1단이라면 1 |
| N8N_PUSH_BACKEND=websocket | 실시간 연결 유지 (Connection lost 방지) |
| N8N_RUNNERS_ENABLED=true | 향후 필수 기능 선적용 |
| DB_SQLITE_POOL_SIZE=5 | SQLite 성능 최적화 |
| N8N_GIT_NODE_DISABLE_BARE_REPOS=true | Git 보안 강화 |
3️⃣ 퍼미션 경고 수정 (선택)
로그에 다음과 같은 경고가 있었습니다.
Permissions 0644 for n8n settings file ... are too wide.
→ 권장 설정:
sudo chmod 600 ~/n8n_data/config
또는 환경변수에 추가:
-e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
4️⃣ 자동 재시작 설정 (운영 안정화)
현재는 EC2 재부팅 시 n8n 컨테이너가 자동으로 안 켜집니다.
다음 옵션을 docker run 뒤에 붙이세요:
--restart unless-stopped
즉,
sudo docker run -d \
--name n8n \
--restart unless-stopped \
...
5️⃣ SSL 인증 자동 갱신 확인 문구 추가 (가이드용)
💡 SSL 자동 갱신 확인
sudo systemctl list-timers | grep certbot
→ 자동 스케줄러가 활성화되어 있으면 OK.
(보통 /lib/systemd/system/certbot.timer 에 등록됨)
6️⃣ 보안그룹 정리 단계 추가
✅ 보안 정리
- 5678 포트는 외부 접근 차단 (내 IP만 허용 또는 완전 삭제)
- 22번 SSH는 MyIP로 제한
- HTTP/HTTPS(80/443)만 전체 공개
📌 참고
- n8n 공식문서: https://docs.n8n.io
- Let’s Encrypt 인증서 만료 주기: 90일
- Cron 자동갱신: /etc/cron.d/certbot 자동 등록됨