[파일 목록] - Dockerfile: GUARDiA ITSM Python 3.11-slim 이미지 - 비루트(guardia) 계정 실행 - 헬스체크 내장 - docker-compose.yml: 개발/테스트 풀스택 - guardia-itsm, nginx, postgres:15, redis:7, ollama/ollama, tomcat:9 - Ollama 모델은 볼륨 마운트 (이미지 외부) - docker-compose.prod.yml: 운영 환경 오버라이드 - 외부 포트 차단, 호스트 경로 마운트 - docker-compose.gpu.yml: NVIDIA GPU 오버라이드 - docker-start.sh: dev|prod|gpu 모드 빠른 시작 - .dockerignore: 보안 파일(.env, *.db) 제외 - docker/nginx/guardia.conf: 리버스 프록시 설정 - docker/tomcat/tomcat-users.xml: opsagent 계정 설정 [폐쇄망 패키지] - setup/docker_package.sh: 인터넷 서버에서 모든 이미지를 tar.gz로 패키징 - setup/docker_load.sh: 폐쇄망에서 tar.gz 로드 + 즉시 시작 옵션 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
148 lines
5.6 KiB
Bash
148 lines
5.6 KiB
Bash
#!/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 "=================================================="
|