Ubuntu에 Docker 설치하고 n8n 자동화 서버 구축하기: 단계별 가이드
매일 반복되는 업무를 자동화하고 싶다면? 이 글에서는 Ubuntu에 Docker를 설치하고 PostgreSQL과 연동된 n8n 자동화 서버를 구축하는 단계별 가이드를 제공합니다. n8n은 Zapier, Make 같은 유료 서비스의 무료 오픈소스 대안으로, 200개 이상의 서비스를 노코드로 연결할 수 있습니다.
처음엔 클라우드 버전을 쓰다가 데이터 보안과 비용 문제로 직접 서버를 구축하기로 했습니다. Docker를 사용하면 복잡한 의존성 관리 없이 몇 분 만에 n8n 환경을 만들 수 있어요. Ubuntu 서버만 있다면 누구나 따라할 수 있게 정리했습니다.
이 글에서는 Ubuntu에 Docker를 설치하고, PostgreSQL과 연동된 n8n 서버를 완전히 구축하는 과정을 다룹니다. 인증서 오류 같은 실제 발생 가능한 문제와 해결법도 포함했어요.
Docker란 무엇인가요? (Ubuntu 설치용)
Docker는 애플리케이션을 컨테이너라는 격리된 환경에서 실행하는 도구입니다. 쉽게 말해 "프로그램 + 실행에 필요한 모든 것"을 하나의 패키지로 묶어서 어디서든 똑같이 돌아가게 만드는 기술이죠.
일반적으로 프로그램을 설치하면 Python 버전, 라이브러리, 운영체제 설정 등이 맞지 않아 문제가 생깁니다. Docker는 이런 의존성 문제를 해결합니다. "내 컴퓨터에서는 되는데?"라는 말이 사라지는 거죠.
가상머신(VM)과 비슷하지만 훨씬 가볍습니다. VM은 OS를 통째로 설치하지만, Docker는 필요한 부분만 격리해서 실행합니다. 그래서 용량도 작고 속도도 빠릅니다.
👉 Docker 공식 페이지
n8n 자동화 서버 직접 구축 이유: 무료/보안
n8n 클라우드는 유료 플랜이 필요하지만, 자체 서버 구축 시 완전 무료입니다. 워크플로우 개수 제한도 없고, 민감한 데이터를 외부에 보내지 않아도 되죠. Docker로 구축하면 이식성이 좋아서 다른 서버로 옮기기도 쉽습니다.
👉 n8n 공식 페이지
Docker 설치 과정
GPG 키 및 저장소 추가
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
ca-certificates와 curl은 HTTPS 통신에 필요한 패키지입니다. /etc/apt/keyrings 디렉토리를 만들고 Docker 공식 GPG 키를 다운로드하는데, 이 키는 패키지의 무결성을 검증하는 용도입니다. chmod a+r로 모든 사용자가 읽을 수 있게 권한을 부여합니다.

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
dpkg --print-architecture는 현재 시스템 아키텍처(amd64, arm64 등)를 자동 감지합니다. /etc/os-release 파일에서 Ubuntu 코드네임(jammy, focal 등)을 읽어와 적절한 저장소를 추가하죠. 이 명령어 하나로 시스템에 맞는 Docker 저장소가 자동 설정됩니다.
Docker 패키지 설치
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker-ce는 Docker 엔진 본체, docker-ce-cli는 명령어 도구, containerd.io는 컨테이너 런타임입니다. docker-compose-plugin은 여러 컨테이너를 한 번에 관리하는 도구로, n8n과 PostgreSQL을 함께 실행할 때 필수입니다.
Docker 서비스 실행 및 확인

sudo systemctl status docker
sudo systemctl start docker
systemctl status로 Docker 데몬 상태를 확인하고, 실행 중이 아니면 start 명령어로 시작합니다. Ubuntu에서는 설치 후 자동 실행되지만, 확인 차원에서 체크하는 게 좋습니다.

sudo docker run hello-world
Docker가 제대로 설치됐는지 테스트하는 명령어입니다. hello-world 이미지를 다운로드하고 컨테이너를 실행해서 "Hello from Docker!" 메시지를 출력합니다.
인증서 오류 해결

user@user:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
17eec7bbc9d7: Retrying in 8 seconds
docker: error pulling image configuration: download failed after attempts=6: tls: failed to verify certificate: x509: certificate signed by unknown authority
Run 'docker run --help' for more information
회사 방화벽이나 프록시 환경에서 자주 발생하는 오류입니다. 중간자 인증서를 시스템이 신뢰하지 않아서 생기는 문제죠.
sudo cp [your-proxy-ca.crt] /usr/local/share/ca-certificates/
sudo update-ca-certificates
sudo systemctl restart docker
프록시 CA 인증서를 /usr/local/share/ca-certificates/에 복사하고, update-ca-certificates로 시스템 인증서 저장소를 갱신합니다. Docker 데몬을 재시작해야 변경사항이 적용됩니다. your-proxy-ca.crt 부분은 실제 인증서 파일명으로 바꿔야 해요.
user@user:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
17eec7bbc9d7: Pull complete
Digest: sha256:54e66cc1dd1fcb1c3c58bd8017914dbed8701e2d8c74d9262e26bd9cc1642d31
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
n8n 서버 구성
디렉토리 생성 및 설정 파일 작성
mkdir n8n-docker
cd n8n-docker
vim docker-compose.yml
vim .env
n8n 관련 파일을 한 곳에 모으기 위해 전용 디렉토리를 만듭니다. docker-compose.yml은 컨테이너 구성 파일, .env는 환경변수 파일입니다.
docker-compose.yml 작성
services:
n8n:
image: n8nio/n8n
restart: always
ports:
- "5678:5678"
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgresql
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=${N8N_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_PASSWORD}
- N8N_EDITOR_BASE_URL=http://localhost:5678/
- WEBHOOK_URL=http://localhost:5678/
- GENERIC_TIMEZONE=Asia/Seoul
volumes:
- ./n8n_data:/home/node/.n8n
depends_on:
- postgresql
postgresql:
image: postgres:13
restart: always
environment:
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- ./pg_data:/var/lib/postgresql/data
restart: always는 서버 재부팅 시 자동 실행을 보장합니다. ports의 5678:5678은 호스트 5678 포트를 컨테이너 5678 포트로 연결한다는 의미죠.
DB_TYPE=postgresdb로 SQLite 대신 PostgreSQL을 사용합니다. 데이터 안정성과 성능이 훨씬 좋습니다.
DB_POSTGRESDB_HOST=postgresql은 docker-compose 내부 네트워크에서 postgresql 서비스를 가리킵니다.
N8N_BASIC_AUTH_ACTIVE=true로 기본 인증을 활성화합니다. 외부 접근을 막기 위한 최소한의 보안 설정이에요.
GENERIC_TIMEZONE=Asia/Seoul로 시간대를 한국으로 설정합니다.
volumes의 ./n8n_data:/home/node/.n8n은 워크플로우 데이터를 호스트에 저장합니다. 컨테이너를 삭제해도 데이터가 유지되죠.
depends_on은 PostgreSQL이 먼저 실행되도록 순서를 지정합니다.
.env 파일 작성
POSTGRES_DB=n8n
POSTGRES_USER=user
POSTGRES_PASSWORD=dbwj!@34
N8N_USER=admin
N8N_PASSWORD=djemalspw
민감한 정보를 코드에서 분리하는 방식입니다. docker-compose.yml에서 ${POSTGRES_DB} 형식으로 참조합니다. 실제 운영 시에는 비밀번호를 더 복잡하게 설정하세요.
서버 실행 및 권한 설정

docker compose up -d
-d 옵션은 백그라운드 실행을 의미합니다. 터미널을 종료해도 컨테이너가 계속 실행됩니다.

user@user:~/n8n-docker$ sudo chown -R 1000:1000 ./n8n_data/
user@user:~/n8n-docker$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d782e8a17f5 n8nio/n8n "tini -- /docker-ent…" 7 minutes ago Up 21 seconds 0.0.0.0:5678->5678/tcp, [::]:5678->5678/tcp n8n-docker-n8n-1
7a71a720c7de postgres:13 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 5432/tcp n8n-docker-postgresql-1
user@user:~/n8n-docker$ docker restart n8n-docker-n8n-1
docker compose ps
실행 중인 컨테이너 목록을 확인합니다. n8n과 postgresql 두 개가 Up 상태여야 정상입니다.
sudo chown -R 1000:1000 ./n8n_data/
n8n 컨테이너는 UID 1000으로 실행되는데, 호스트 디렉토리 권한이 root로 되어 있으면 쓰기가 안 됩니다. chown으로 소유자를 변경하면 해결됩니다.
docker restart n8n-docker-n8n-1
권한 변경 후 n8n 컨테이너만 재시작합니다. 컨테이너명은 docker ps로 확인할 수 있어요.
접속 확인

브라우저에서 http://localhost:5678로 접속하면 n8n 로그인 화면이 나타납니다. .env에 설정한 N8N_USER와 N8N_PASSWORD로 로그인하면 됩니다.

마무리
Ubuntu 환경에서 Docker를 설치하고 n8n 자동화 서버를 구축하는 전 과정을 다뤘습니다. 인증서 오류나 권한 문제는 실제 설치 시 자주 발생하는 케이스인데, 원인과 해결법을 알면 쉽게 넘어갈 수 있어요.
PostgreSQL 연동으로 데이터 안정성을 확보했고, Docker Compose로 관리가 간편해졌습니다. 이제 워크플로우를 만들어서 반복 작업을 자동화할 수 있습니다. 슬랙 알림, 데이터 수집, API 연동 등 활용 범위는 무궁무진합니다.
'환경설정' 카테고리의 다른 글
| 우분투 Python 환경설정. pip, venv, 자동실행 스크립트까지 (0) | 2025.10.10 |
|---|---|
| VSCode Vim 설치 후 Ctrl+C, Ctrl+V 안 될 때 해결법 (0) | 2025.10.08 |
| 리눅스 개발자를 위한 터미널 색상 설정 - Gogh로 우분투 테마 설정 (0) | 2025.10.05 |