#!/bin/bash
set -e
NEXUS_URL=“http://localhost:8091”
NEXUS_USER=“admin”
NEXUS_PASS=“admin123” # 초기 패스워드, 변경 필요
echo “=== Kubespray용 Nexus Docker Registry 설정 시작 ===”
echo “1. Nexus 서비스 상태 확인…”
until curl -s -f “${NEXUS_URL}/service/metrics/ping” > /dev/null; do
echo “ Nexus 시작 대기 중…”
sleep 10
done
echo “ ✓ Nexus 서비스 준비 완료”
echo “2. Docker 전용 Blob Store 생성…”
curl -u {NEXUS_PASS}
-H ‘Content-Type: application/json’
-X POST “${NEXUS_URL}/service/rest/v1/blobstores/file”
-d ‘{
“name”: “docker-kubespray”,
“path”: “/nexus-data/blobs/docker-kubespray”,
“softQuota”: {
“type”: “spaceRemainingQuota”,
“limit”: 50000000000
}
}’ || echo “ (Blob Store 이미 존재)”
declare -A REGISTRIES=(
[“docker-hub”]=“https://registry-1.docker.io:HUB”
[“gcr-io”]=“https://gcr.io:REGISTRY”
[“quay-io”]=“https://quay.io:REGISTRY”
[“k8s-registry”]=“https://registry.k8s.io:REGISTRY”
[“ghcr-io”]=“https://ghcr.io:REGISTRY”
)
echo “3. 외부 저장소 프록시들 생성…”
for name in “{REGISTRIES[$name]}”
echo " → ${name} (${url}) 생성 중..."
curl -u ${NEXUS_USER}:${NEXUS_PASS} \
-H 'Content-Type: application/json' \
-X POST "${NEXUS_URL}/service/rest/v1/repositories/docker/proxy" \
-d "{
\"name\": \"${name}-proxy\",
\"online\": true,
\"storage\": {
\"blobStoreName\": \"docker-kubespray\",
\"strictContentTypeValidation\": true
},
\"proxy\": {
\"remoteUrl\": \"${url}\",
\"contentMaxAge\": 1440,
\"metadataMaxAge\": 720
},
\"negativeCache\": {
\"enabled\": true,
\"timeToLive\": 1440
},
\"httpClient\": {
\"blocked\": false,
\"autoBlock\": true
},
\"docker\": {
\"v1Enabled\": false,
\"forceBasicAuth\": false
},
\"dockerProxy\": {
\"indexType\": \"${index_type}\"
}
}" && echo " ✓ ${name} 프록시 생성 완료" || echo " ! ${name} 이미 존재"
done
echo “4. Docker Group Repository 생성 (포트 8092)…”
MEMBER_NAMES=””
for name in “{MEMBER_NAMES}"{MEMBER_NAMES%,} # 마지막 쉼표 제거
curl -u {NEXUS_PASS}
-H ‘Content-Type: application/json’
-X POST “{NEXUS_URL}/service/rest/v1/repositories/docker/group” -d “{ "name": "docker-kubespray-all", "online": true, "storage": { "blobStoreName": "docker-kubespray", "strictContentTypeValidation": true }, "group": { "memberNames": [{MEMBER_NAMES}]
},
"docker": {
"v1Enabled": false,
"forceBasicAuth": false,
"httpPort": 8092
}
}” && echo “ ✓ Group Repository 생성 완료” || echo “ ! Group Repository 이미 존재”
echo “5. Docker Cleanup 정책 생성…”
curl -u {NEXUS_PASS}
-H ‘Content-Type: application/json’
-X POST “${NEXUS_URL}/service/rest/v1/cleanup-policies”
-d ‘{
“name”: “kubespray-cleanup-60d”,
“format”: “docker”,
“criteriaLastDownloaded”: 60,
“retain”: 5
}’ && echo “ ✓ Cleanup 정책 생성 완료” || echo “ ! Cleanup 정책 이미 존재”
echo “”
echo “=== 설정 완료! ===”
echo “”
echo “📌 Docker Registry 접근 정보:”
echo “ URL: (hostname -I | awk ‘{print $1}’):8092” echo “ 또는: nexus-dmz.company.local:8092” echo “” echo “📌 테스트 명령어:” echo “ docker pull $(hostname -I | awk ‘{print $1}’):8092/library/nginx” echo “” echo “📌 Kubespray 설정에서 사용할 레지스트리:” echo “ registry_host: "(hostname -I | awk ‘{print $1}’):8092"”
echo “”