AI

Ollama 로컬 모델 파일 복제 script

Gadget 2026. 5. 1. 09:23

원격지 서버에 Ollama 모델을 복제할 수 있도록 했습니다. (외부에서 받아온 모델에 대해 내부 서버간 복제를 위함)

아래 변수를 적절히 바꿔서 실행하면 됩니다.

BASE_MANIFEST_DIR
BLOB_DIR

REMOTE_SERVER

#!/bin/bash

# 1. 기본 경로 설정 (레지스트리 루트로 변경)
REGISTRY_ROOT="/app/ollama/models/manifests/registry.ollama.ai"
BLOB_DIR="/app/ollama/models/blobs"
REMOTE_SERVER="root@192.168.0.3"

# 2. 매개변수 받기
MODEL_INPUT=$1
REMOTE_SERVER=${2:-"$REMOTE_SERVER"}

# 3. 모델명이 입력되지 않았을 경우 전체 목록 출력
if [ -z "$MODEL_INPUT" ]; then
    echo "🔎 현재 복제 가능한 모든 모델 목록 (전체 디렉토리):"
    echo "------------------------------------------------"
    if [ -d "$REGISTRY_ROOT" ]; then
        # 모든 하위 디렉토리에서 파일을 찾아 상대 경로만 출력
        find "$REGISTRY_ROOT" -type f | sed "s|$REGISTRY_ROOT/||" | sort | sed 's/^/  - /'
    else
        echo "경로를 찾을 수 없습니다: $REGISTRY_ROOT"
    fi
    echo "------------------------------------------------"
    echo "💡 사용법: $0 [네임스페이스/모델/태그] [원격서버(선택)]"
    echo "예시 1 (기본): $0 library/llama3/latest"
    echo "예시 2 (커스텀): $0 userA/my-model/v1"
    exit 1
fi

# 4. 파일 경로 확인 logic
# 사용자가 'llama3/latest'만 입력했을 경우 'library/llama3/latest'를 우선 확인하는 편의기능 포함
if [ -f "$REGISTRY_ROOT/$MODEL_INPUT" ]; then
    FULL_MANIFEST_PATH="$REGISTRY_ROOT/$MODEL_INPUT"
elif [ -f "$REGISTRY_ROOT/library/$MODEL_INPUT" ]; then
    FULL_MANIFEST_PATH="$REGISTRY_ROOT/library/$MODEL_INPUT"
else
    echo "❌ 오류: 모델 정의 파일을 찾을 수 없습니다."
    echo "시도된 경로 1: $REGISTRY_ROOT/$MODEL_INPUT"
    echo "시도된 경로 2: $REGISTRY_ROOT/library/$MODEL_INPUT"
    exit 1
fi

echo "🚀 모델 복제를 시작합니다: $MODEL_INPUT -> $REMOTE_SERVER"
echo "---------------------------------------"

# 1단계: 모델 정의 파일(Manifest) 복사
# -R 옵션을 사용하여 $REGISTRY_ROOT 내부의 구조를 원격지에서도 그대로 유지합니다.
echo "📦 Manifest 복사 중..."
# rsync의 상대 경로 보존을 위해 해당 디렉토리로 이동 후 실행
cd "$REGISTRY_ROOT" && rsync -avR "$(echo $FULL_MANIFEST_PATH | sed "s|$REGISTRY_ROOT/||")" "$REMOTE_SERVER:$REGISTRY_ROOT/"

# 2단계: Digest 추출 및 Blobs 복사
echo "📂 관련 Blob 파일 복사 중..."
grep -o 'sha256:[a-z0-9]\+' "$FULL_MANIFEST_PATH" | \
sed 's/sha256:/sha256-/' | \
xargs -I {} rsync -av "$BLOB_DIR/{}" "$REMOTE_SERVER:$BLOB_DIR/"

echo "---------------------------------------"
echo "✅ 모든 복제 작업이 완료되었습니다!"