zioinfo-mail/setup/docker_package.sh
DESKTOP-TKLFCPR\ython eea643ce40 feat(docker): Docker 컨테이너 환경 구성
[파일 목록]
- 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>
2026-05-29 19:08:52 +09:00

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 "=================================================="