logo
Published on

[홈서버] 홈서버에 vercel 호스팅하기.

Authors
  • avatar
    Name
    MJ
    Twitter

홈서버에 vercel 호스팅하기

Open Source Alternative to Vercel, Netlify and Heroku.

DokployVercel 같은 호스팅 서비스를 대체할 수 있는 오픈소스 호스팅 프로젝트에요. 저는 홈서버를 구축하고 있고, 외부 IaaS(Infrastructure as a Service)를 사용하면 추가 비용 + 관리에 대한 비용이 들기 때문에 되도록 사용을 지양하는 편이에요.

하지만, 홈서버에서 어떤 서비스를 빌드하고 배포하는 작업도 굉장히 많은 노력이 들어가요.

간단하게 Next.js 앱을 빌드하고 배포하는 작업을 상상해보면,

  1. nginx 설정(SSL)과 도메인 설정
  2. 서비스 빌드(자동화하려면 웹훅 추가해야 함)
  3. 모니터링(Prometheus, Grafana)

이 작업을 매번 CLI에서 해야 했고, 어디서 한 번 에러가 발생하면 매번 찾아서 수정해야 했어요. 자동화를 위한 자동화를 하기 위해서 새로운 플랫폼을 사용해보기로 했어요.

Dokploy Vercel의 오픈소스 대체제

DokployVercel의 오픈소스 대체제에요. 서비스 배포부터, 모니터링 관리까지 완벽하게 지원해요.

기존에는 하나의 PC에서 여러 프로세스를 관리하기 위해서 노력을 했다면, Dokploy를 사용하면 여러 대의 PC에서 프로세스를 관리할 수 있고, 더 안정적으로 서비스를 운영할 수 있어요. (Dokploy만 관리해주면 됨)

초보자를 위한 핵심 개념 정리

본격적으로 시작하기 전에, Dokploy를 사용하기 위해 Docker에 대한 개념을 알아야 해요.

Docker 관련 용어

용어한 줄 요약Git에 비유
Docker Image앱을 실행하기 위한 모든 것이 담긴 패키지특정 시점의 커밋 스냅샷
Docker Container이미지를 실행한 프로세스
Docker Registry이미지를 저장하고 공유하는 창고원격 저장소 (GitHub/GitLab)
Docker Swarm여러 컴퓨터를 하나처럼 관리하는 오케스트레이터
DokployDocker 앱을 웹 UI로 쉽게 배포/관리하는 도구Vercel + GitHub Actions 조합

위 단어에 대해서만 알고 있어도, Dokploy를 사용하는데 큰 어려움이 없어요.

우리가 만들 시스템의 흐름

Dokploy는 Linux 기반의 OS에서만 사용할 수 있어요.

저는 Mini PC와 Mac Mini를 사용해서 시스템을 구축할 거에요.

  • Mini PC는 Ubuntu OS이기 때문에 Docker Swarm의 매니저 노드로 사용할 거에요.
  • Mac Mini는 상대적으로 성능이 좋기 때문에 Docker Swarm의 워커 노드로 사용할 거에요.
  1. 두 Node가 하나의 클러스터를 이루고
  2. 빌드된 이미지를 Registry에 저장하고
  3. Docker Swarm이 노드를 선택하고
  4. Mini PC/Mac Mini에서 실행하고
  5. 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-home

원하는 도메인으로 접속하고 싶으면 Dokploy의 왼쪽 설정에서 Settings > Web Server의 Server Domain을 지정해주면 돼요. (자동으로 SSL 인증서까지 설정됩니다.)

Step 2: Docker Registry 구축

Dokploy에서 배포할 첫 번째 애플리케이션은 Docker Registry에요.

  1. Project > Create Project를 클릭하고, Project Name을 지정합니다.
  2. 해당 Project에서 Create Service를 클릭하고, Template을 선택해요.
  3. Search Template 검색창에서 Docker Registry를 검색해요.
  4. Docker Registry Create를 클릭해요.
dokploy-docker-registry

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에서 배포

  1. Dokploy UI 접속
  2. Create ServiceApplication
  3. 설정:
    • Source Type: Docker
    • Docker Image: 내 이미지 URL (ex. https://hub.docker.com/r/library/nginx)
    • Port: 80
  4. Deploy 클릭
first-app

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

first-app-deploy

최종 아키텍처

우리가 구축한 시스템을 정리하면(내용상 스킵한 부분도 있어요)

[개발자 푸시][GitHub]
            [Mac Mini 빌드]
            [Registry 저장]
            [Dokploy 배포]
         [Swarm이 노드 선택]
    [Mini PC 또는 Mac Mini에서 실행]
        [Traefik이 트래픽 라우팅]
              [사용자 접속]

마치며

처음엔 단순히 "Next.js 앱 하나 배포하려는 것"이라고 생각했지만, 매번 해주는 nginx 설정, SSL 인증서, 자동 배포, 모니터링까지 수많은 작업이 필요했습니다. Dokploy는 이 모든 복잡한 과정을 웹 UI 몇 번의 클릭으로 해결해줬어요. 예시용 웹 이외에 개인용 옵시디언 노트 서비스도 배포하면서 배포 시간이 정말 빨라졌다는 것을 알 수 있게 됐어요.

이제 더 복잡한 서비스를 편리하게 배포할 수 있게 되었어요. 앞으로는 비용 걱정없이 서비스를 나만의 인프라 위에서 운영할 수 있게 되었어요. 성능이 부족하면 컴퓨터를 추가하면 되고, 최적화가 필요하면 직접 분석해볼 수 있는 기회도 생겼습니다.

집에 놀고 있는 컴퓨터가 있다면 한번 도전해보시는 것을 추천드립니다.

긴 글 읽어주셔서 감사해요. 🙇‍♂️