#!/usr/bin/env bash set -euo pipefail # Proxmox VE - PBS Storage 추가 스크립트 # Proxmox Backup Server를 PVE 스토리지로 자동 추가 # 색상 정의 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 로그 함수 log_info() { echo -e "${BLUE}ℹ${NC} $1"; } log_success() { echo -e "${GREEN}✓${NC} $1"; } log_warning() { echo -e "${YELLOW}⚠${NC} $1"; } log_error() { echo -e "${RED}✗${NC} $1"; } # 배너 출력 print_banner() { echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo " Proxmox VE - PBS Storage 추가 스크립트" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" } # Root 권한 확인 check_root() { if [[ $EUID -ne 0 ]]; then log_error "이 스크립트는 root 권한이 필요합니다." exit 1 fi } # Proxmox VE 환경 확인 check_proxmox() { if ! command -v pvesm &> /dev/null; then log_error "Proxmox VE가 설치되어 있지 않습니다." exit 1 fi log_success "Proxmox VE 환경 확인 완료" } # 대화형 모드: 사용자 입력 받기 interactive_mode() { echo "" log_info "PBS 스토리지 설정 정보를 입력하세요" echo "" # Storage ID read -p "스토리지 ID (예: pbs-backup): " STORAGE_ID if [[ -z "$STORAGE_ID" ]]; then log_error "스토리지 ID는 필수입니다." exit 1 fi # PBS 서버 주소 read -p "PBS 서버 주소 (IP 또는 도메인): " PBS_SERVER if [[ -z "$PBS_SERVER" ]]; then log_error "PBS 서버 주소는 필수입니다." exit 1 fi # PBS 데이터스토어 read -p "PBS 데이터스토어 이름 (기본값: datastore1): " PBS_DATASTORE PBS_DATASTORE=${PBS_DATASTORE:-datastore1} # 인증 방법 선택 echo "" log_info "인증 방법을 선택하세요:" echo "1) API Token (권장)" echo "2) 사용자명/비밀번호" read -p "선택 (1 또는 2): " AUTH_METHOD if [[ "$AUTH_METHOD" == "1" ]]; then read -p "API Token ID (예: root@pam!backup): " PBS_TOKEN_NAME read -sp "API Token Secret: " PBS_TOKEN_VALUE echo "" AUTH_TYPE="token" else read -p "사용자명 (예: root@pam): " PBS_USERNAME read -sp "비밀번호: " PBS_PASSWORD echo "" AUTH_TYPE="password" fi # 포트 read -p "PBS 포트 (기본값: 8007): " PBS_PORT PBS_PORT=${PBS_PORT:-8007} # 핑거프린트 (선택사항) echo "" log_info "SSL 핑거프린트 (선택사항, Enter로 건너뛰기)" log_warning "핑거프린트를 입력하면 SSL 인증서를 검증합니다." read -p "Fingerprint: " PBS_FINGERPRINT # 고급 옵션 echo "" log_info "고급 옵션 (Enter로 기본값 사용)" read -p "최대 백업 수 (기본값: 1): " MAX_BACKUPS MAX_BACKUPS=${MAX_BACKUPS:-1} # 컨텐츠 타입 선택 echo "" log_info "저장할 컨텐츠 타입 선택 (쉼표로 구분)" echo "예: backup,snippets" read -p "컨텐츠 타입 (기본값: backup): " CONTENT_TYPES CONTENT_TYPES=${CONTENT_TYPES:-backup} } # 스토리지 추가 add_pbs_storage() { log_info "PBS 스토리지 추가 중..." # 기본 명령어 구성 local cmd="pvesm add pbs ${STORAGE_ID}" cmd+=" --server ${PBS_SERVER}" cmd+=" --datastore ${PBS_DATASTORE}" cmd+=" --port ${PBS_PORT}" cmd+=" --content ${CONTENT_TYPES}" cmd+=" --maxfiles ${MAX_BACKUPS}" # 인증 정보 추가 if [[ "$AUTH_TYPE" == "token" ]]; then cmd+=" --username ${PBS_TOKEN_NAME}" cmd+=" --password ${PBS_TOKEN_VALUE}" else cmd+=" --username ${PBS_USERNAME}" cmd+=" --password ${PBS_PASSWORD}" fi # 핑거프린트 추가 (있는 경우) if [[ -n "${PBS_FINGERPRINT:-}" ]]; then cmd+=" --fingerprint ${PBS_FINGERPRINT}" fi # 명령어 실행 if eval "$cmd" 2>/dev/null; then log_success "PBS 스토리지가 성공적으로 추가되었습니다!" return 0 else log_error "PBS 스토리지 추가 실패" return 1 fi } # 스토리지 확인 verify_storage() { echo "" log_info "스토리지 상태 확인 중..." if pvesm status -storage "${STORAGE_ID}" &> /dev/null; then log_success "스토리지가 정상적으로 작동합니다!" echo "" pvesm status -storage "${STORAGE_ID}" else log_warning "스토리지 연결 확인에 실패했습니다." log_info "PBS 서버와 인증 정보를 확인하세요." fi } # 설정 정보 출력 print_summary() { echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo " 추가된 스토리지 정보" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "스토리지 ID: ${STORAGE_ID}" echo "PBS 서버: ${PBS_SERVER}:${PBS_PORT}" echo "데이터스토어: ${PBS_DATASTORE}" echo "컨텐츠 타입: ${CONTENT_TYPES}" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" } # 사용법 출력 usage() { cat << EOF 사용법: $0 [옵션] 대화형 모드 (권장): $0 비대화형 모드: $0 -i STORAGE_ID -s PBS_SERVER -d DATASTORE [옵션] 필수 옵션: -i 스토리지 ID (예: pbs-backup) -s PBS 서버 주소 -d 데이터스토어 이름 인증 옵션 (둘 중 하나 필수): -t API Token Name (예: root@pam!backup) -T API Token Secret -u 사용자명 (예: root@pam) -p 비밀번호 추가 옵션: -P 포트 (기본값: 8007) -f SSL Fingerprint -m 최대 백업 수 (기본값: 1) -c 컨텐츠 타입 (기본값: backup) -h 도움말 표시 예시: # API Token 사용 $0 -i pbs-backup -s 192.168.1.100 -d datastore1 \\ -t "root@pam!backup" -T "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # 사용자명/비밀번호 사용 $0 -i pbs-backup -s pbs.example.com -d datastore1 \\ -u "root@pam" -p "password" EOF exit 0 } # 메인 함수 main() { print_banner check_root check_proxmox # 옵션 파싱 if [[ $# -eq 0 ]]; then # 대화형 모드 interactive_mode else # 비대화형 모드 while getopts "i:s:d:t:T:u:p:P:f:m:c:h" opt; do case $opt in i) STORAGE_ID="$OPTARG" ;; s) PBS_SERVER="$OPTARG" ;; d) PBS_DATASTORE="$OPTARG" ;; t) PBS_TOKEN_NAME="$OPTARG"; AUTH_TYPE="token" ;; T) PBS_TOKEN_VALUE="$OPTARG" ;; u) PBS_USERNAME="$OPTARG"; AUTH_TYPE="password" ;; p) PBS_PASSWORD="$OPTARG" ;; P) PBS_PORT="$OPTARG" ;; f) PBS_FINGERPRINT="$OPTARG" ;; m) MAX_BACKUPS="$OPTARG" ;; c) CONTENT_TYPES="$OPTARG" ;; h) usage ;; *) usage ;; esac done # 필수 값 확인 if [[ -z "${STORAGE_ID:-}" ]] || [[ -z "${PBS_SERVER:-}" ]] || [[ -z "${PBS_DATASTORE:-}" ]]; then log_error "필수 옵션이 누락되었습니다." usage fi # 기본값 설정 PBS_PORT=${PBS_PORT:-8007} MAX_BACKUPS=${MAX_BACKUPS:-1} CONTENT_TYPES=${CONTENT_TYPES:-backup} fi # 스토리지 추가 if add_pbs_storage; then print_summary verify_storage echo "" log_success "PBS 스토리지 설정이 완료되었습니다!" log_info "이제 PVE 웹 인터페이스에서 백업을 생성할 수 있습니다." else echo "" log_error "스토리지 추가 실패. 다음을 확인하세요:" echo " 1. PBS 서버 주소와 포트" echo " 2. 인증 정보 (API Token 또는 사용자명/비밀번호)" echo " 3. 데이터스토어 이름" echo " 4. PBS 서버가 실행 중인지 확인" exit 1 fi } # 스크립트 실행 main "$@"