- Published on
[홈서버] 홈서버에 vercel 호스팅하기.
- Authors
- Name
- MJ
홈서버에 vercel 호스팅하기
Open Source Alternative to Vercel, Netlify and Heroku.
Dokploy
는 Vercel
같은 호스팅 서비스를 대체할 수 있는 오픈소스 호스팅 프로젝트에요. 저는 홈서버를 구축하고 있고, 외부 IaaS
(Infrastructure as a Service)를 사용하면 추가 비용 + 관리에 대한 비용이 들기 때문에 되도록 사용을 지양하는 편이에요.
하지만, 홈서버에서 어떤 서비스를 빌드하고 배포하는 작업도 굉장히 많은 노력이 들어가요.
간단하게 Next.js
앱을 빌드하고 배포하는 작업을 상상해보면,
- nginx 설정(SSL)과 도메인 설정
- 서비스 빌드(자동화하려면 웹훅 추가해야 함)
- 모니터링(Prometheus, Grafana)
이 작업을 매번 CLI에서 해야 했고, 어디서 한 번 에러가 발생하면 매번 찾아서 수정해야 했어요. 자동화를 위한 자동화를 하기 위해서 새로운 플랫폼을 사용해보기로 했어요.
Dokploy Vercel의 오픈소스 대체제
Dokploy
는 Vercel
의 오픈소스 대체제에요. 서비스 배포부터, 모니터링 관리까지 완벽하게 지원해요.
기존에는 하나의 PC에서 여러 프로세스를 관리하기 위해서 노력을 했다면, Dokploy
를 사용하면 여러 대의 PC에서 프로세스를 관리할 수 있고, 더 안정적으로 서비스를 운영할 수 있어요. (Dokploy만 관리해주면 됨)
초보자를 위한 핵심 개념 정리
본격적으로 시작하기 전에, Dokploy를 사용하기 위해 Docker에 대한 개념을 알아야 해요.
Docker 관련 용어
용어 | 한 줄 요약 | Git에 비유 |
---|---|---|
Docker Image | 앱을 실행하기 위한 모든 것이 담긴 패키지 | 특정 시점의 커밋 스냅샷 |
Docker Container | 이미지를 실행한 프로세스 | |
Docker Registry | 이미지를 저장하고 공유하는 창고 | 원격 저장소 (GitHub/GitLab) |
Docker Swarm | 여러 컴퓨터를 하나처럼 관리하는 오케스트레이터 | |
Dokploy | Docker 앱을 웹 UI로 쉽게 배포/관리하는 도구 | Vercel + GitHub Actions 조합 |
위 단어에 대해서만 알고 있어도, Dokploy를 사용하는데 큰 어려움이 없어요.
우리가 만들 시스템의 흐름
Dokploy는 Linux 기반의 OS에서만 사용할 수 있어요.
저는 Mini PC와 Mac Mini를 사용해서 시스템을 구축할 거에요.
- Mini PC는 Ubuntu OS이기 때문에 Docker Swarm의 매니저 노드로 사용할 거에요.
- Mac Mini는 상대적으로 성능이 좋기 때문에 Docker Swarm의 워커 노드로 사용할 거에요.
- 두 Node가 하나의 클러스터를 이루고
- 빌드된 이미지를 Registry에 저장하고
- Docker Swarm이 노드를 선택하고
- Mini PC/Mac Mini에서 실행하고
- Dokploy가 이 모든 과정을 웹 UI로 관리해요.
이제 설정을 진행해볼게요.
Dokploy 설정
Step 1: Dokploy와 Docker Registry 설치
먼저 Mini PC에 Dokploy를 설치합니다. Dokploy는 내부적으로 Docker Swarm을 사용하기 때문에 자동으로 Swarm 모드가 활성화됩니다.
curl -sSL https://dokploy.com/install.sh | sudo bash
설치가 완료되면 http://localhost:3000
으로 접속할 수 있습니다.

원하는 도메인으로 접속하고 싶으면 Dokploy의 왼쪽 설정에서 Settings > Web Server의 Server Domain을 지정해주면 돼요. (자동으로 SSL 인증서까지 설정됩니다.)
Step 2: Docker Registry 구축
Dokploy에서 배포할 첫 번째 애플리케이션은 Docker Registry에요.
- Project > Create Project를 클릭하고, Project Name을 지정합니다.
- 해당 Project에서 Create Service를 클릭하고, Template을 선택해요.
- Search Template 검색창에서 Docker Registry를 검색해요.
- Docker Registry Create를 클릭해요.

Docker Registry는 우리가 만든 이미지를 저장할 개인 저장소입니다. Docker Hub 같은 공개 저장소도 있지만, 회사 코드나 개인 프로젝트는 프라이빗 Registry를 사용하는 게 안전해요.
Dokploy UI에서 새 프로젝트를 만들고 다음 docker-compose.yml을 배포해요.
services:
registry:
restart: always
image: registry:2
ports:
- 5000
volumes:
- ../files/auth/registry.password:/auth/registry.password
- registry-data:/var/lib/registry
environment:
REGISTRY_STORAGE_DELETE_ENABLED: true
REGISTRY_HEALTH_STORAGEDRIVER_ENABLED: false
REGISTRY_HTTP_SECRET: ${REGISTRY_HTTP_SECRET}
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password
volumes:
registry-data:
이제 Private Docker Registry가 생겼어요. 앞으로 이 곳에 Docker Image를 저장할 거에요.
Step 3: Docker Swarm 클러스터 구성
Docker Swarm은 여러 대의 컴퓨터를 하나의 클러스터로 묶어주는 도구입니다. 쿠버네티스보다 훨씬 간단하면서도 기본적인 오케스트레이션 기능을 제공합니다.
Swarm이 뭐고 왜 필요한가요?
Swarm 없이도 각 컴퓨터에서 Docker를 실행할 수 있지만,
- A 컴퓨터에서 빌드한 이미지를 B 컴퓨터에서 어떻게 실행하지?
- 앱이 죽으면 누가 다시 실행해주지?
- 어느 컴퓨터에 배포해야 효율적이지?
Swarm이 이 모든 걸 자동으로 처리해줘요.
클러스터 초기화 (Mini PC)
# Mini PC에서 - Manager 노드로 초기화
sudo docker swarm init --advertise-addr 192.168.0.4
# 출력되는 토큰을 복사해주세요.
# docker swarm join --token SWMTKN-1-xxxxx... 192.168.0.4:2377
Mac Mini 추가 (Worker 노드)
# Mac Mini에서 - Worker로 참여
docker swarm join --token SWMTKN-1-xxxxx... 192.168.0.4:2377
연결 확인
sudo docker node ls
# 결과:
# HOSTNAME STATUS AVAILABILITY MANAGER STATUS
# mj-MINI-S Ready Active Leader
# mj-MAC-MINI Ready Active
이제 두 컴퓨터가 하나의 클러스터로 연결됐어요.
Step 4: 첫 번째 앱 배포하기
Mac Mini에서 앱 빌드
간단한 웹 페이지를 만들어볼게요. 아래 커맨드를 실행해주세요.
mkdir my-first-app && cd my-first-app
cat > index.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>My Swarm App</title>
</head>
<body>
<h1>🎉 Docker Swarm 클러스터에서 실행 중!</h1>
</body>
</html>
EOF
cat > Dockerfile << 'EOF'
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/
EOF
Multi-platform 빌드 (중요!)
Mac Mini(ARM)와 Mini PC(Intel)는 CPU 아키텍처가 다릅니다. 양쪽에서 모두 실행 가능한 이미지를 만들어야 해요.
docker buildx create --name mybuilder --use
# Multi-platform 빌드 & Registry에 푸시
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t registry.mj-dev.site/my-first-app:latest \
--push .
Dokploy에서 배포
- Dokploy UI 접속
- Create Service → Application
- 설정:
- Source Type: Docker
- Docker Image:
내 이미지 URL
(ex.https://hub.docker.com/r/library/nginx
) - Port: 80
- Deploy 클릭

이제 아래와 같이 서비스가 배포됐을거에요.

최종 아키텍처
우리가 구축한 시스템을 정리하면(내용상 스킵한 부분도 있어요)
[개발자 푸시] → [GitHub]
↓
[Mac Mini 빌드]
↓
[Registry 저장]
↓
[Dokploy 배포]
↓
[Swarm이 노드 선택]
↓
[Mini PC 또는 Mac Mini에서 실행]
↓
[Traefik이 트래픽 라우팅]
↓
[사용자 접속]
마치며
처음엔 단순히 "Next.js 앱 하나 배포하려는 것"이라고 생각했지만, 매번 해주는 nginx 설정, SSL 인증서, 자동 배포, 모니터링까지 수많은 작업이 필요했습니다. Dokploy는 이 모든 복잡한 과정을 웹 UI 몇 번의 클릭으로 해결해줬어요. 예시용 웹 이외에 개인용 옵시디언 노트 서비스도 배포하면서 배포 시간이 정말 빨라졌다는 것을 알 수 있게 됐어요.
이제 더 복잡한 서비스를 편리하게 배포할 수 있게 되었어요. 앞으로는 비용 걱정없이 서비스를 나만의 인프라 위에서 운영할 수 있게 되었어요. 성능이 부족하면 컴퓨터를 추가하면 되고, 최적화가 필요하면 직접 분석해볼 수 있는 기회도 생겼습니다.
집에 놀고 있는 컴퓨터가 있다면 한번 도전해보시는 것을 추천드립니다.
긴 글 읽어주셔서 감사해요. 🙇♂️