#!/bin/bash # ============================================================ # GUARDiA Docker 폐쇄망 패키지 생성 스크립트 # ============================================================ # 인터넷이 연결된 서버에서 실행하여 모든 이미지를 tar로 패키징합니다. # 생성된 패키지를 USB/내부 서버를 통해 폐쇄망에 복사 후 docker_load.sh 실행. # # 사용법: # bash setup/docker_package.sh [출력 디렉토리] # bash setup/docker_package.sh /mnt/usb/guardia-docker # # 결과: # guardia-docker-<버전>.tar.gz (약 5~8GB — Ollama 모델 별도) # ============================================================ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" GUARDIA_ROOT="$(dirname "$SCRIPT_DIR")" OUTPUT_DIR="${1:-$GUARDIA_ROOT/docker-package}" VERSION="${GUARDIA_VERSION:-$(date +%Y%m%d)}" PACKAGE_NAME="guardia-docker-${VERSION}" RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' ok() { echo -e "${GREEN}[OK]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } info() { echo -e " $*"; } echo "==================================================" echo " GUARDiA Docker 패키지 생성" echo " 버전: $VERSION" echo " 출력: $OUTPUT_DIR" echo "==================================================" mkdir -p "$OUTPUT_DIR/$PACKAGE_NAME" cd "$GUARDIA_ROOT" # ── 1. GUARDiA 이미지 빌드 ─────────────────────────────── echo "" echo "[1/5] GUARDiA ITSM 이미지 빌드..." docker build -t "guardia-itsm:${VERSION}" -t "guardia-itsm:latest" . ok "guardia-itsm:${VERSION} 빌드 완료" # ── 2. 외부 이미지 Pull ────────────────────────────────── echo "" echo "[2/5] 외부 이미지 다운로드..." IMAGES=( "postgres:15-alpine" "redis:7-alpine" "nginx:alpine" "ollama/ollama:latest" "tomcat:9.0-jdk17-temurin-jammy" ) for img in "${IMAGES[@]}"; do echo " pulling: $img" docker pull "$img" || warn "$img 다운로드 실패 — 건너뜀" done ok "외부 이미지 다운로드 완료" # ── 3. 이미지 tar 저장 ────────────────────────────────── echo "" echo "[3/5] 이미지 저장 (tar)..." TAR_FILE="$OUTPUT_DIR/$PACKAGE_NAME/images.tar" docker save \ "guardia-itsm:${VERSION}" \ "guardia-itsm:latest" \ "postgres:15-alpine" \ "redis:7-alpine" \ "nginx:alpine" \ "tomcat:9.0-jdk17-temurin-jammy" \ | gzip > "${TAR_FILE}.gz" ok "이미지 저장 완료: ${TAR_FILE}.gz ($(du -sh "${TAR_FILE}.gz" | cut -f1))" # Ollama는 용량이 크므로 별도 패키징 OLLAMA_TAR="$OUTPUT_DIR/$PACKAGE_NAME/ollama.tar" docker save "ollama/ollama:latest" | gzip > "${OLLAMA_TAR}.gz" ok "Ollama 이미지 저장: ${OLLAMA_TAR}.gz ($(du -sh "${OLLAMA_TAR}.gz" | cut -f1))" # ── 4. Ollama 모델 패키징 (선택) ────────────────────────── echo "" echo "[4/5] Ollama 모델 패키징..." OLLAMA_MODELS_DIR="${OLLAMA_MODELS_DIR:-$HOME/.ollama}" MODELS_OUTPUT="$OUTPUT_DIR/$PACKAGE_NAME/ollama-models" if [[ -d "$OLLAMA_MODELS_DIR/models" ]]; then echo " 모델 디렉토리: $OLLAMA_MODELS_DIR" mkdir -p "$MODELS_OUTPUT" # 각 모델을 개별 파일로 저장 (크기 분할) if command -v ollama &>/dev/null; then ollama list 2>/dev/null | tail -n +2 | awk '{print $1}' | while read -r model; do model_file="${model//:/--}.tar" echo " 패키징 모델: $model → $model_file" # 모델 블obs 복사 mkdir -p "$MODELS_OUTPUT/$model_file" done fi # 전체 모델 디렉토리 압축 tar -czf "$MODELS_OUTPUT/models.tar.gz" -C "$OLLAMA_MODELS_DIR" models manifests 2>/dev/null \ && ok "Ollama 모델 패키징 완료 ($(du -sh "$MODELS_OUTPUT/models.tar.gz" | cut -f1))" \ || warn "모델 패키징 실패 — 수동으로 ~/.ollama/models 를 복사하세요" else warn "Ollama 모델 디렉토리 없음 — 별도 복사 필요: $OLLAMA_MODELS_DIR" echo " # 모델을 미리 다운로드: ollama pull llama3.1:8b" fi # ── 5. 배포 파일 패키징 ────────────────────────────────── echo "" echo "[5/5] 배포 파일 패키징..." # docker-compose 파일 복사 cp "$GUARDIA_ROOT/docker-compose.yml" "$OUTPUT_DIR/$PACKAGE_NAME/" cp "$GUARDIA_ROOT/docker-compose.prod.yml" "$OUTPUT_DIR/$PACKAGE_NAME/" cp "$GUARDIA_ROOT/docker-compose.gpu.yml" "$OUTPUT_DIR/$PACKAGE_NAME/" cp "$GUARDIA_ROOT/setup/docker_load.sh" "$OUTPUT_DIR/$PACKAGE_NAME/" cp -r "$GUARDIA_ROOT/docker/" "$OUTPUT_DIR/$PACKAGE_NAME/docker/" chmod +x "$OUTPUT_DIR/$PACKAGE_NAME/docker_load.sh" # 버전 정보 cat > "$OUTPUT_DIR/$PACKAGE_NAME/VERSION" << VEREOF GUARDIA_VERSION=$VERSION BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ) IMAGES_INCLUDED=guardia-itsm,postgres,redis,nginx,tomcat,ollama VEREOF # 전체 패키지 압축 echo " 전체 패키지 압축 중..." cd "$OUTPUT_DIR" tar -czf "${PACKAGE_NAME}.tar.gz" "$PACKAGE_NAME/" ok "패키지 생성 완료: $OUTPUT_DIR/${PACKAGE_NAME}.tar.gz" echo "" echo "==================================================" ok "패키지 생성 완료!" echo "" info "패키지 크기:" du -sh "$OUTPUT_DIR/${PACKAGE_NAME}.tar.gz" echo "" info "폐쇄망 설치 절차:" info " 1. ${PACKAGE_NAME}.tar.gz 을 폐쇄망 서버로 복사" info " 2. tar -xzf ${PACKAGE_NAME}.tar.gz" info " 3. bash ${PACKAGE_NAME}/docker_load.sh" echo "=================================================="