zioinfo-mail/setup/docker_load.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

150 lines
5.3 KiB
Bash

#!/bin/bash
# ============================================================
# GUARDiA Docker 폐쇄망 로드 스크립트
# ============================================================
# docker_package.sh 로 생성된 패키지를 폐쇄망 서버에서 로드합니다.
#
# 사용법:
# tar -xzf guardia-docker-YYYYMMDD.tar.gz
# cd guardia-docker-YYYYMMDD
# bash docker_load.sh
# bash docker_load.sh --start # 로드 후 즉시 서비스 시작
# ============================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
START_AFTER="${1:-}"
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} $*"; }
fail() { echo -e "${RED}[FAIL]${NC} $*"; exit 1; }
info() { echo -e " $*"; }
echo "=================================================="
echo " GUARDiA Docker 폐쇄망 로드"
echo " 디렉토리: $SCRIPT_DIR"
echo "=================================================="
# Docker 설치 확인
command -v docker &>/dev/null || fail "Docker가 설치되지 않았습니다. Docker Engine을 먼저 설치하세요."
docker compose version &>/dev/null || fail "Docker Compose가 필요합니다. (docker compose 플러그인)"
# ── 1. 버전 정보 확인 ───────────────────────────────────
if [[ -f "$SCRIPT_DIR/VERSION" ]]; then
source "$SCRIPT_DIR/VERSION"
echo " 패키지 버전: ${GUARDIA_VERSION:-unknown}"
echo " 빌드 일자: ${BUILD_DATE:-unknown}"
fi
# ── 2. 이미지 로드 ──────────────────────────────────────
echo ""
echo "[1/4] Docker 이미지 로드..."
# 메인 이미지
if [[ -f "$SCRIPT_DIR/images.tar.gz" ]]; then
echo " 로드 중: images.tar.gz"
docker load < "$SCRIPT_DIR/images.tar.gz"
ok "메인 이미지 로드 완료"
else
fail "images.tar.gz 파일을 찾을 수 없습니다."
fi
# Ollama 이미지
if [[ -f "$SCRIPT_DIR/ollama.tar.gz" ]]; then
echo " 로드 중: ollama.tar.gz (시간이 걸릴 수 있습니다...)"
docker load < "$SCRIPT_DIR/ollama.tar.gz"
ok "Ollama 이미지 로드 완료"
else
warn "ollama.tar.gz 없음 — Ollama 이미지 로드 건너뜀"
fi
# 로드된 이미지 목록 출력
echo ""
echo " 로드된 이미지:"
docker images | grep -E "guardia|postgres|redis|nginx|ollama|tomcat" | awk '{printf " %-40s %-15s %s\n", $1, $2, $7}'
# ── 3. Ollama 모델 복사 ─────────────────────────────────
echo ""
echo "[2/4] Ollama 모델 설정..."
MODELS_TAR="$SCRIPT_DIR/ollama-models/models.tar.gz"
if [[ -f "$MODELS_TAR" ]]; then
OLLAMA_DATA="${OLLAMA_DATA_DIR:-/var/lib/guardia/ollama}"
mkdir -p "$OLLAMA_DATA"
echo " 모델 압축 해제: $OLLAMA_DATA"
tar -xzf "$MODELS_TAR" -C "$OLLAMA_DATA"
ok "Ollama 모델 복사 완료: $OLLAMA_DATA"
export OLLAMA_MODELS_PATH="$OLLAMA_DATA"
else
warn "Ollama 모델 파일 없음"
warn " 방법 1: docker compose up -d ollama && docker exec guardia-ollama ollama pull llama3.1:8b"
warn " 방법 2: 모델 파일을 수동으로 /var/lib/guardia/ollama/models 에 복사"
fi
# ── 4. 환경 파일 설정 ────────────────────────────────────
echo ""
echo "[3/4] 환경 파일 설정..."
ENV_FILE="$SCRIPT_DIR/.env"
if [[ ! -f "$ENV_FILE" ]]; then
cat > "$ENV_FILE" << 'ENVEOF'
# GUARDiA Docker 환경 설정
# 운영 배포 전 반드시 아래 값을 변경하세요!
SECRET_KEY=CHANGE_THIS_TO_RANDOM_32CHARS_MIN
POSTGRES_PASSWORD=guardia_secure_pw
GUARDIA_VERSION=latest
GUARDIA_LLM_MODEL=llama3.1:8b
# Ollama 모델 경로 (폐쇄망 복사 경로)
OLLAMA_MODELS_PATH=/var/lib/guardia/ollama
ENVEOF
warn ".env 파일 생성됨 — SECRET_KEY를 반드시 변경하세요: $ENV_FILE"
else
info ".env 파일 이미 존재"
fi
# ── 5. 서비스 시작 ──────────────────────────────────────
echo ""
echo "[4/4] 서비스 준비 완료"
if [[ "$START_AFTER" == "--start" ]]; then
echo " 서비스 시작 중..."
cd "$SCRIPT_DIR"
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# 헬스체크 대기
echo " 서비스 기동 대기 (최대 60초)..."
for i in $(seq 1 12); do
sleep 5
if curl -sf http://localhost/ &>/dev/null; then
ok "GUARDiA ITSM 서비스 정상 기동!"
break
fi
echo " 대기 중... (${i}/12)"
done
echo ""
echo " 서비스 상태:"
docker compose ps
else
echo ""
info "서비스 시작 명령어:"
info " cd $SCRIPT_DIR"
info " # .env 파일 편집 후:"
info " docker compose up -d"
info " # 또는 운영 모드:"
info " docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d"
info ""
info " # 즉시 시작:"
info " bash docker_load.sh --start"
fi
echo ""
echo "=================================================="
ok "Docker 로드 완료!"
info "접속 URL: http://$(hostname -I | awk '{print $1}')"
info "GUARDiA 로그: docker compose logs -f guardia"
echo "=================================================="