n8n AWS 문서대로 했는데 첫 명령어부터 막혔다 — Amazon Linux 2023의 Compose 함정
Amazon Linux 2023에서 dnf로 Docker를 설치하면 Compose v2 플러그인이 빠져 있어 `docker compose`가 바로 실패합니다. 원인과 해결법, 그리고 EC2 인스턴스에서 n8n 첫 로그인까지 가는 Docker Compose 구성을 정리했습니다.

I Followed the n8n AWS Docs and It Broke at the First Command
The one command that breaks n8n self-hosting on Amazon Linux 2023, why it happens, and the full paste-ready Docker Compose setup that gets you from a bare EC2 box to your first login.
개요 #
새로 띄운 EC2 인스턴스에 SSH로 들어가 sudo dnf install -y docker를 실행합니다. 가이드에 적힌 다음 명령어 docker compose up -d를 입력하면 곧바로 이런 에러가 납니다.
docker: 'compose' is not a docker command.AWS Community Builder인 Sarvar Nadaf는 영상을 찍다가 이 문제를 겪었습니다. 처음엔 자기가 뭔가 망가뜨린 줄 알았지만 그게 아니었습니다. 그는 "AWS에 n8n 셀프 호스팅하기" 튜토리얼 대부분에 같은 구멍이 있다고 지적합니다. 작성자들이 Docker 설치 방식이 다른 Ubuntu나 일반 VPS에서 테스트했기 때문입니다. EC2 기본 AMI인 Amazon Linux 2023(AL2023)에서는 튜토리얼에 나온 명령어로 필요한 것의 절반만 설치됩니다.
이 글에서는 원인과 해결법을 먼저 짚고, 빈 EC2 인스턴스에서 n8n 첫 로그인까지 가는 전체 과정을 정리합니다. 컨테이너 두 개, 바로 붙여 넣어 쓸 수 있는 Compose 파일 하나로 끝나고, 리버스 프록시는 아직 다루지 않습니다.
문제의 원인: 엔진만 있고 Compose 플러그인은 없다 #
Photo by Kindel Media on Pexels
AL2023에서 sudo dnf install -y docker를 실행하면 Docker 엔진만 설치되고 Compose v2 플러그인은 설치되지 않습니다. Compose는 몇 년 전에 별도 docker-compose 바이너리를 버리고 Docker CLI 아래에서 동작하는 플러그인으로 바뀌었습니다. 그런데 dnf의 docker 패키지에는 이 플러그인이 들어 있지 않습니다. 그래서 엔진도 잘 돌고 docker run도 되는데, docker compose만 'compose' is not a docker command를 내뱉습니다.
Ubuntu라면 Docker 공식 apt 저장소에서 docker.io와 docker-compose-plugin을 함께 설치하니 이 문제를 겪을 일이 없습니다. AL2023에서는 플러그인을 직접 넣어 줘야 합니다. 플러그인까지 포함한 전체 설치 명령입니다.
sudo dnf install -y docker
sudo mkdir -p /usr/local/lib/docker/cli-plugins
sudo curl -fsSL \
https://github.com/docker/compose/releases/download/v2.29.7/docker-compose-linux-x86_64 \
-o /usr/local/lib/docker/cli-plugins/docker-compose
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
sudo systemctl enable --now docker다른 가이드들이 빠뜨리는 부분이 세 번째 명령입니다. Docker 공식 Compose 플러그인 바이너리를 CLI가 실제로 찾는 디렉터리에 내려받습니다. 설치가 끝나면 두 명령 모두 버전을 출력해야 합니다.
sudo docker --version
# Docker version 25.0.14, build 0bab007
sudo docker compose version
# Docker Compose version v2.29.7버전 두 줄이 다 나와야 준비가 끝난 겁니다. 첫 번째만 확인하고 넘어가면 docker compose up 시점에야 플러그인이 없다는 걸 알게 되는데, 그때가 가장 곤란합니다.
아키텍처와 버전도 확인할 것 #
다운로드 URL이 x86_64로 끝나는데, 이는 t3 같은 Intel 인스턴스용입니다. Graviton/ARM 인스턴스(t4g 계열)를 띄웠다면 파일명을 docker-compose-linux-aarch64로 바꿔야 합니다. 아키텍처가 맞지 않는 바이너리도 설치 자체는 문제없이 끝납니다. 문제는 실행하는 순간 exec format 에러가 나서 엉뚱한 곳을 뒤지게 됩니다.
v2.29.7은 저자가 고정해 둔 버전일 뿐입니다. 최신 버전을 쓰고 싶다면 Docker Compose 릴리스 페이지에서 확인하면 됩니다.
인스턴스부터 준비하기 #
설치 전에 인스턴스는 이렇게 맞춰 둡니다.
- AMI: Amazon Linux 2023
- 크기:
t3.small이상. n8n과 Postgres를 함께 돌리려면 RAM이 2GB 정도 필요합니다. 1GB인t2.micro,t3.micro를 쓰면 실행 도중 컨테이너가 OOM으로 종료될 수 있습니다. - 보안 그룹: SSH(22)는 내 IP에서만 허용합니다. 비공개로 처음 테스트할 때는 5678 포트도 내 IP에만 열어도 됩니다. 5678을
0.0.0.0/0으로 열면 안 됩니다. 공개 인터넷에 노출된 n8n 에디터는 누구나 찾아서 차지할 수 있습니다. - 접속:
ssh -i your-key.pem ec2-user@PUBLIC_IP
이후 작업은 모두 이 인스턴스에서 ec2-user로 진행합니다.
셀프 호스팅을 하는 이유 #
저자는 n8n을 "자격 증명 집합소(credential aggregator)"라고 부릅니다. 인스턴스 하나에 Stripe 키, DB 비밀번호, Slack 토큰, Google OAuth가 전부 모입니다. n8n Cloud를 쓰면 이 정보가 남의 서버에 저장되고, 요금은 사용자 수 기준이며 실행 횟수에도 제한이 걸립니다. 셀프 호스팅을 하면 모든 게 내 AWS 계정 안으로 들어옵니다. 사용자 수 요금도, 실행 횟수 제한도 없고, 데이터가 밖으로 나가지 않으며 버전도 직접 고를 수 있습니다.
대신 패치, 백업, 보안은 모두 직접 챙겨야 합니다. 이 글은 일단 띄우는 데까지 다루고, 보안 강화는 시리즈 다음 편에서 다룹니다.
구성: 컨테이너 두 개 #
구성은 이게 전부입니다.
- n8n: 에디터와 워크플로 엔진
- Postgres: 재시작해도 워크플로와 실행 기록이 남도록 저장
n8n의 기본 DB는 SQLite입니다. 잠깐 둘러보기에는 괜찮지만 동시 실행 처리가 약하고, 나중에 다른 DB로 옮기려면 한나절은 고생해야 합니다. 처음부터 Postgres로 시작하는 편이 낫습니다.
저장소를 클론해 Compose 파일을 인스턴스로 가져옵니다.
git clone https://github.com/simplynadaf/self-host-n8n-on-ec2.git
cd self-host-n8n-on-ec2/composeCompose 파일은 이렇게 생겼습니다.
services:
n8n:
image: n8nio/n8n:1.123.64
restart: unless-stopped
ports:
- "5678:5678"
environment:
- N8N_SECURE_COOKIE=false
- N8N_DIAGNOSTICS_ENABLED=false
- N8N_PERSONALIZATION_ENABLED=false
- N8N_ENCRYPTION_KEY=change-me-to-a-long-random-string-please
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=change-me-strong-db-password
depends_on:
- postgres
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
- POSTGRES_DB=n8n
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=change-me-strong-db-password
volumes:
- pg_data:/var/lib/postgresql/data
volumes:
pg_data:성패를 가르는 세 가지 설정 #
이미지는 latest가 아니라 1.123.64로 고정했습니다. 버전을 고정하면 누가 언제 띄워도 같은 환경이 나옵니다. 이 버전에는 CVE-2026-65589 패치도 들어 있습니다. LLM 하위 노드에 커스텀 헤더로 넘긴 자격 증명이 실행 기록에 남을 수 있던 정보 노출 취약점입니다. latest를 쓰면 컨테이너가 조용히 재시작되는 순간 내가 고르지 않은 버전으로 바뀔 수 있습니다.
N8N_ENCRYPTION_KEY는 n8n이 저장하는 모든 자격 증명을 암호화합니다. 32자 이상의 무작위 문자열로 설정하고 지금 바로 안전한 곳에 보관해 두세요. 이 키를 잃으면 저장된 자격 증명을 하나도 복구할 수 없습니다. 키 없이 백업을 복원하면 로그인 정보를 풀 수 없는 워크플로만 잔뜩 남은 DB가 됩니다.
DB 비밀번호는 두 군데에 들어가고, 두 값이 같아야 합니다. n8n 서비스의 DB_POSTGRESDB_PASSWORD와 postgres 서비스의 POSTGRES_PASSWORD입니다. 값이 다르면 n8n이 자기 DB에 접속하지 못하고 컨테이너가 계속 재시작됩니다. 에디터는 끝내 뜨지 않습니다.
실행하고 첫 로그인까지 #
비밀번호 두 곳과 암호화 키를 수정한 뒤 실행합니다.
sudo docker compose up -d
sudo docker compose ps처음 실행하면 이미지 두 개를 내려받아 컨테이너를 띄웁니다. 20~40초쯤 기다린 뒤 n8n이 응답하는지 확인합니다.
curl -s -o /dev/null -w 'n8n -> HTTP %{http_code}\n' http://localhost:5678
# n8n -> HTTP 200200이 나오면 n8n이 정상적으로 떠 있는 겁니다. 저자는 Compose를 제대로 설치하고 나니 첫 시도에 바로 성공했다고 밝혔습니다.
브라우저에서 http://PUBLIC_IP:5678에 접속하면 새 인스턴스의 설정 마법사가 나옵니다. 이메일과 강력한 비밀번호로 소유자(owner) 계정을 만들면 캔버스 화면으로 넘어갑니다.
계정 생성은 인스턴스를 띄운 직후 바로 해야 합니다. 내일로 미루면 안 됩니다. 새 n8n에서 처음 만들어진 계정이 소유자가 되고, 누군가 그 폼을 제출하기 전까지는 먼저 접속한 사람이 차지할 수 있습니다. 보안 그룹을 비공개로 막아 뒀다면 접속할 수 있는 사람은 나뿐이지만, 그래도 들여 둘 만한 습관입니다.
Compose 파일의 N8N_SECURE_COOKIE=false는 테스트 중에 IP로 직접, 평문 HTTP로 첫 로그인을 하기 위한 설정입니다. 개발용 임시방편일 뿐이고, 운영 환경에서는 n8n을 HTTPS 뒤에 두고 이 설정을 없앱니다.
인터넷에 공개하기 전 체크리스트 #
지금 Compose 설정은 5678 포트를 그대로 외부에 열어 둡니다. 보안 그룹으로 내 IP만 허용한 비공개 테스트라면 괜찮지만, 공개 인터넷에서는 통하지 않습니다. 새 HTTPS 호스트는 인증서 투명성(Certificate Transparency) 로그에 몇 분 안에 올라가고, 스캐너도 새로 생긴 서버를 금방 찾아냅니다.
도메인을 연결하거나 보안 그룹을 넓히기 전에 아래 항목을 처리해야 합니다.
- n8n을 최신 패치 버전(1.123.64 이상)으로 유지합니다.
- 5678 포트를 외부에 열지 말고
expose로 바꿔 Docker 네트워크 안에서만 접근하게 합니다. - 앞단에 Caddy를 두어 TLS를 자동으로 적용하고, 에디터는 관리자 IP에서만 열리게 합니다. 외부에는
/webhook/*만 공개합니다. - 암호화 키와 DB 비밀번호는 AWS Secrets Manager로 옮기고, 최소 권한 IAM 역할로 읽어 오게 합니다.
- 보안 그룹은 22(내 IP), 80, 443만 허용합니다. 5678을
0.0.0.0/0에 여는 일은 없어야 합니다.
저자는 이 체크리스트 전체를 시리즈 다음 편인 보안 강화 글에서 다룬다고 밝혔습니다.
데이터를 잃지 않고 중지·재시작하기 #
데이터는 pg_data 볼륨에 저장되므로 스택을 안전하게 내릴 수 있습니다.
sudo docker compose down # 중지, 데이터는 유지
sudo docker compose up -d # 다시 시작down은 컨테이너만 내리고 볼륨은 남겨 두므로, 다시 up 하면 워크플로와 계정이 그대로 있습니다. 데이터까지 지우려면 down -v를 쓰는데, 정말 지울 생각일 때만 써야 합니다.
정리와 시리즈 예고 #
여기까지 마치면 다음 상태가 됩니다.
- 직접 관리하는 EC2 인스턴스에서 Postgres를 붙인 n8n이 돌아갑니다.
- 계속 바뀌는
latest대신 패치가 반영된 버전으로 이미지를 고정했습니다. - 암호화 키를 직접 설정하고 따로 보관해 두었습니다.
- 인터넷에 공개하기 전에 무엇을 해야 하는지 알고 있습니다.
핵심은 하나입니다. Amazon Linux 2023에서는 Docker를 설치해도 Compose가 따라오지 않고, 플러그인 디렉터리에 curl 한 줄로 받아 넣으면 해결됩니다.
저자가 예고한 시리즈 구성은 다음과 같습니다.
- 띄우기(이번 글): 빈 EC2에서 Compose 함정을 넘어 첫 로그인까지
- 보안 강화: TLS, 에디터 포트 차단, Secrets Manager, 최소 권한 IAM
- AI 붙이기: 같은 n8n을 Amazon Bedrock에 연결해 캔버스에서 AI 에이전트 만들기. 모델은 내 AWS 계정 안에서 돌고, OpenAI 키는 쓰지 않습니다.
Compose 파일과 설치·검증 스크립트, 전체 설정 노트는 github.com/simplynadaf/self-host-n8n-on-ec2 저장소에 있습니다.
이 글은 위 출처를 바탕으로 한국 독자를 위해 재작성한 기사입니다. 원문의 사실과 수치에 근거하며, 별도의 견해를 포함하지 않습니다.