Beszel Docker 설치 가이드: 경량 서버 모니터링의 새로운 표준




개요

Beszel은 Docker 통계, 히스토리 데이터, 알림 기능을 갖춘 경량 서버 모니터링 플랫폼입니다. Prometheus + Grafana 스택의 복잡함 없이, 몇 분 만에 서버와 컨테이너를 모니터링할 수 있습니다. Go로 작성되어 매우 가볍고, Hub-Agent 아키텍처로 여러 서버를 중앙에서 관리합니다.

항목내용
GitHubhttps://github.com/henrygd/beszel
공식 사이트https://beszel.dev
Docker Hubhttps://hub.docker.com/r/henrygd/beszel
라이선스MIT
개발 언어Go
최신 버전0.18.x (2025년 기준)

Beszel이란?

Beszel은 2024년에 등장해 빠르게 인기를 얻은 셀프호스팅 서버 모니터링 도구입니다. “간단하고 가벼운 서버 모니터링”을 목표로, 복잡한 설정 없이 즉시 사용할 수 있도록 설계되었습니다.

핵심 철학

"Simple, lightweight server monitoring"
- 설정 최소화
- 리소스 효율성
- Docker 네이티브 지원
- 즉시 사용 가능

아키텍처

Beszel은 두 가지 컴포넌트로 구성됩니다:

컴포넌트역할설명
Hub중앙 서버웹 대시보드, 데이터 저장, 알림 관리
Agent모니터링 에이전트각 서버에서 실행, 메트릭 수집 및 전송
┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│  Server 1   │     │  Server 2   │     │  Server 3   │
│   (Agent)   │     │   (Agent)   │     │   (Agent)   │
└──────┬──────┘     └──────┬──────┘     └──────┬──────┘
       │                   │                   │
       └───────────────────┼───────────────────┘
                           │ SSH (암호화)
                           ▼
                    ┌─────────────┐
                    │    Hub      │
                    │ (Dashboard) │
                    └─────────────┘

주요 기능

시스템 모니터링

메트릭설명
CPU호스트 및 컨테이너별 사용량
메모리RAM, Swap, ZFS ARC 포함
디스크사용량, I/O (다중 파티션 지원)
네트워크호스트 및 컨테이너 대역폭
로드Load Average
온도시스템 센서
GPUNvidia, AMD, Intel 지원
배터리노트북 배터리 잔량
S.M.A.R.T.디스크 건강 상태

Docker/Podman 모니터링

기능설명
컨테이너 목록실행 중인 모든 컨테이너
개별 통계컨테이너별 CPU/메모리/네트워크
히스토리시간별 사용량 그래프
상태 추적컨테이너 시작/중지 감지

알림 시스템

서비스지원
Discord
Slack
Telegram
Ntfy
Gotify
Pushover
Webhook (Generic)
Email (SMTP)
Matrix
Mattermost

알림 트리거 조건:

  • CPU 사용량 임계치
  • 메모리 사용량 임계치
  • 디스크 사용량 임계치
  • 대역폭 임계치
  • 온도 임계치
  • 로드 평균 임계치
  • 시스템 오프라인

추가 기능

기능설명
다중 사용자사용자별 시스템 관리
OAuth/OIDCGoogle, GitHub 등 SSO
자동 백업S3 호환 스토리지 지원
REST API외부 연동 가능
다크 모드UI 테마 지원

경쟁 도구 비교

기능BeszelUptime KumaNetdataPrometheus+Grafana
설치 난이도매우 쉬움쉬움쉬움어려움
리소스 사용매우 낮음낮음중간높음
Docker 통계✅ 개별✅ 설정 필요
히스토리 데이터
다중 서버
알림
업타임 체크
GPU 모니터링✅ 설정 필요

선택 가이드

상황추천
서버 + Docker 모니터링Beszel
웹사이트 업타임 체크Uptime Kuma
실시간 상세 분석Netdata
대규모 인프라Prometheus + Grafana
가장 간단한 설치Beszel

시스템 요구 사항

Hub (중앙 서버)

항목최소권장
CPU1 Core2 Core
RAM64MB128MB
저장소50MB + 데이터1GB+

Agent (모니터링 대상)

항목요구 사항
CPU최소
RAM~20MB
저장소~10MB

Docker 설치

방법 1: Hub만 설치 (기본)

# docker-compose.yml
services:
  beszel:
    image: henrygd/beszel:latest
    container_name: beszel
    restart: unless-stopped
    ports:
      - "8090:8090"
    environment:
      - APP_URL=http://localhost:8090
    volumes:
      - ./beszel_data:/beszel_data

실행:

mkdir -p ~/beszel && cd ~/beszel

# docker-compose.yml 생성 후
docker compose up -d

# 로그 확인
docker compose logs -f beszel

접속: http://localhost:8090

방법 2: Hub + 로컬 Agent (같은 서버)

Hub와 Agent를 같은 서버에서 실행하는 경우:

# docker-compose.yml
services:
  beszel:
    image: henrygd/beszel:latest
    container_name: beszel
    restart: unless-stopped
    ports:
      - "8090:8090"
    environment:
      - APP_URL=http://localhost:8090
    volumes:
      - ./beszel_data:/beszel_data
      - ./beszel_socket:/beszel_socket

  beszel-agent:
    image: henrygd/beszel-agent:latest
    container_name: beszel-agent
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./beszel_socket:/beszel_socket
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - LISTEN=/beszel_socket/beszel.sock
      - KEY=  # Hub에서 생성된 공개키 입력

방법 3: 원격 Agent (다른 서버)

Hub 서버 (docker-compose.yml):

services:
  beszel:
    image: henrygd/beszel:latest
    container_name: beszel
    restart: unless-stopped
    ports:
      - "8090:8090"
    environment:
      - APP_URL=https://beszel.example.com
    volumes:
      - ./beszel_data:/beszel_data

Agent 서버 (docker-compose.yml):

services:
  beszel-agent:
    image: henrygd/beszel-agent:latest
    container_name: beszel-agent
    restart: unless-stopped
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - LISTEN=45876
      - KEY=ssh-ed25519 AAAA...  # Hub에서 복사한 공개키

Agent 서버에서 포트 열기:

sudo ufw allow 45876/tcp

방법 4: 다중 디스크 모니터링

services:
  beszel-agent:
    image: henrygd/beszel-agent:latest
    container_name: beszel-agent
    restart: unless-stopped
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      # 추가 디스크 마운트
      - /mnt/data/.beszel:/extra-filesystems/data:ro
      - /mnt/backup/.beszel:/extra-filesystems/backup:ro
    environment:
      - LISTEN=45876
      - KEY=ssh-ed25519 AAAA...

방법 5: GPU 모니터링 (Nvidia)

services:
  beszel-agent:
    image: henrygd/beszel-agent:latest
    container_name: beszel-agent
    restart: unless-stopped
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - LISTEN=45876
      - KEY=ssh-ed25519 AAAA...
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

방법 6: Traefik 연동

services:
  beszel:
    image: henrygd/beszel:latest
    container_name: beszel
    restart: unless-stopped
    environment:
      - APP_URL=https://beszel.example.com
    volumes:
      - ./beszel_data:/beszel_data
    networks:
      - traefik_network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.beszel.rule=Host(`beszel.example.com`)"
      - "traefik.http.routers.beszel.entrypoints=websecure"
      - "traefik.http.routers.beszel.tls.certresolver=letsencrypt"
      - "traefik.http.services.beszel.loadbalancer.server.port=8090"

networks:
  traefik_network:
    external: true

방법 7: Docker Socket Proxy (보안 강화)

Docker 소켓 직접 마운트 대신 프록시 사용:

services:
  beszel-agent:
    image: henrygd/beszel-agent:latest
    container_name: beszel-agent
    restart: unless-stopped
    network_mode: host
    environment:
      - LISTEN=45876
      - KEY=ssh-ed25519 AAAA...
      - DOCKER_HOST=tcp://socket-proxy:2375
    depends_on:
      - socket-proxy

  socket-proxy:
    image: lscr.io/linuxserver/socket-proxy:latest
    container_name: socket-proxy
    restart: unless-stopped
    environment:
      - CONTAINERS=1  # 컨테이너 정보만 허용
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    ports:
      - "127.0.0.1:2375:2375"

환경 변수

Hub 환경 변수

변수기본값설명
APP_URL웹 UI URL (리버스 프록시 시 필수)
USER_EMAIL첫 번째 사용자 이메일
USER_PASSWORD첫 번째 사용자 비밀번호
DISABLE_PASSWORD_AUTHfalse비밀번호 로그인 비활성화 (OAuth 전용)
MFA_OTPfalse이메일 OTP 활성화
SHARE_ALL_SYSTEMSfalse모든 사용자에게 시스템 공유
CONTAINER_DETAILStrue컨테이너 상세 정보 허용
CSPContent-Security-Policy 헤더

Agent 환경 변수

변수기본값설명
KEYHub의 공개 SSH 키 (필수)
LISTEN45876포트 또는 소켓 경로
DOCKER_HOSTDocker 소켓 경로 오버라이드
FILESYSTEM루트 디스크 지정
EXTRA_FILESYSTEMS추가 디스크 (바이너리 설치 시)
SENSORS온도 센서 화이트/블랙리스트
NICS네트워크 인터페이스 필터
EXCLUDE_CONTAINERS제외할 컨테이너 패턴
LOG_LEVELinfo로그 레벨
MEM_CALC메모리 계산 방식 (htop)
SKIP_GPUfalseGPU 모니터링 비활성화

컨테이너 제외 예시

environment:
  # 특정 컨테이너 제외
  - EXCLUDE_CONTAINERS=test-web,test-api
  # 패턴으로 제외
  - EXCLUDE_CONTAINERS=test-*,*-staging

네트워크 인터페이스 필터

environment:
  # 화이트리스트 (eth*만 모니터링)
  - NICS=eth*
  # 블랙리스트 (docker* 제외)
  - NICS=-docker*,veth*

초기 설정

1) Hub 접속 및 관리자 생성

URL: http://localhost:8090

첫 접속 시 관리자 계정을 생성합니다.

2) 시스템 추가

  1. 대시보드에서 Add System 클릭
  2. 시스템 이름과 호스트 정보 입력
  3. Copy docker compose 클릭하여 Agent 설정 복사
  4. Agent 서버에서 docker-compose.yml 생성 및 실행
  5. Hub에서 Add System 버튼 클릭하여 완료

3) 알림 설정

Settings → Notifications:

  1. 알림 URL 추가 (예: Discord, Telegram)
  2. 테스트 알림 전송
  3. 시스템별 알림 임계치 설정

알림 URL 예시:

# Discord
discord://token@webhookid

# Telegram
telegram://token@telegram?chats=@channel

# Ntfy
ntfy://ntfy.sh/mytopic

# Gotify
gotify://gotify.example.com/token

# Slack
slack://token-a/token-b/token-c

# Generic Webhook
generic://example.com/webhook?template=json

알림 설정 상세

Discord 알림

  1. Discord 채널 설정 → Webhooks → 새 Webhook 생성
  2. Webhook URL 복사: https://discord.com/api/webhooks/123456789/abcdef...
  3. Beszel 형식으로 변환: discord://abcdef...@123456789

Telegram 알림

  1. @BotFather에서 봇 생성, 토큰 받기
  2. 채팅 ID 확인
  3. URL 형식: telegram://BOT_TOKEN@telegram?chats=CHAT_ID

Ntfy 알림

ntfy://ntfy.sh/your-topic
# 또는 셀프호스팅
ntfy://ntfy.example.com/your-topic

알림 임계치 설정

시스템 테이블에서 벨 아이콘 클릭:

메트릭예시 임계치
CPU80% (10분 평균)
메모리90%
디스크85%
온도80°C

OAuth/OIDC 설정

Google OAuth

  1. Google Cloud Console에서 OAuth 2.0 클라이언트 생성
  2. Redirect URI: https://beszel.example.com/api/oauth2-redirect
  3. Hub 설정:
environment:
  - APP_URL=https://beszel.example.com

Settings → Auth providers → Google 에서 Client ID/Secret 입력

GitHub OAuth

  1. GitHub Settings → Developer settings → OAuth Apps
  2. Callback URL: https://beszel.example.com/api/oauth2-redirect
  3. Hub에서 Client ID/Secret 설정

백업 및 복원

자동 백업 (S3)

Settings → Backups:

  1. S3 호환 스토리지 정보 입력
  2. 백업 주기 설정 (예: 매일)
  3. 보관 기간 설정

수동 백업

# 데이터 디렉토리 백업
tar czf beszel-backup-$(date +%Y%m%d).tar.gz beszel_data/

# 복원
tar xzf beszel-backup-20250129.tar.gz

업데이트

cd ~/beszel

# 최신 이미지 다운로드
docker compose pull

# 재시작
docker compose up -d

트러블슈팅

Agent 연결 실패

1) 포트 확인:

# Agent 서버에서
sudo ufw status
sudo ufw allow 45876/tcp

2) 키 확인:

# KEY가 정확히 복사되었는지 확인
environment:
  - KEY=ssh-ed25519 AAAA...

3) 네트워크 모드:

# network_mode: host 필수 (Agent)
network_mode: host

Docker 통계 안 보임

1) 소켓 마운트 확인:

volumes:
  - /var/run/docker.sock:/var/run/docker.sock:ro

2) 권한 확인:

# Docker 그룹에 사용자 추가
sudo usermod -aG docker $USER

디스크가 안 보임

Docker 볼륨으로 추가 디스크 마운트:

volumes:
  - /mnt/data/.beszel:/extra-filesystems/data:ro

메모리 계산이 다름

# htop 방식으로 변경
environment:
  - MEM_CALC=htop

로그 확인

# Hub 로그
docker logs beszel -f

# Agent 로그
docker logs beszel-agent -f

# 디버그 모드
environment:
  - LOG_LEVEL=debug

보안

기본 보안 설정

  1. 강력한 비밀번호 사용
  2. HTTPS 필수 (리버스 프록시)
  3. OAuth 활성화 권장

Docker Socket 보안

# 읽기 전용 마운트
volumes:
  - /var/run/docker.sock:/var/run/docker.sock:ro

# 또는 Socket Proxy 사용
environment:
  - DOCKER_HOST=tcp://socket-proxy:2375

방화벽 설정

# Agent 포트는 Hub에서만 접근 가능하도록
sudo ufw allow from HUB_IP to any port 45876

비밀번호 로그인 비활성화 (OAuth 전용)

environment:
  - DISABLE_PASSWORD_AUTH=true

REST API 사용

Beszel은 PocketBase 기반으로 REST API를 제공합니다.

인증:

# 토큰 발급
curl -X POST https://beszel.example.com/api/collections/users/auth-with-password \
  -H "Content-Type: application/json" \
  -d '{"identity":"user@example.com","password":"password"}'

시스템 목록:

curl https://beszel.example.com/api/collections/systems/records \
  -H "Authorization: Bearer TOKEN"

사용 사례

1. 홈랩 모니터링

  • 여러 서버/NAS 중앙 관리
  • Docker 컨테이너 리소스 추적
  • 디스크 공간 알림

2. 소규모 팀 인프라

  • 개발/스테이징/프로덕션 서버 모니터링
  • 팀원별 접근 권한 관리
  • Slack/Discord 알림

3. VPS 모니터링

  • 여러 VPS 중앙 대시보드
  • 대역폭 사용량 추적
  • 비용 최적화를 위한 리소스 분석

마무리

Beszel은 복잡한 설정 없이 서버와 Docker 컨테이너를 모니터링할 수 있는 경량 도구입니다. Prometheus + Grafana의 강력함이 필요 없는 소규모 환경에서 최적의 선택이며, 몇 분 만에 설치하고 바로 사용할 수 있습니다.

핵심 장점

장점설명
초경량Hub ~64MB, Agent ~20MB
간편한 설치Docker Compose 한 줄로 시작
Docker 네이티브컨테이너별 상세 통계
다양한 알림20+ 알림 서비스 지원
다중 서버Hub-Agent 아키텍처
OAuth 지원Google, GitHub 등 SSO

이런 분께 추천

복잡한 모니터링 스택이 부담스러운 분
Docker 컨테이너 리소스를 추적하고 싶은 분
여러 서버를 중앙에서 관리하고 싶은 분
가벼운 리소스 사용을 원하는 분
빠른 설치와 즉시 사용을 원하는 분



댓글 남기기