[파일 목록] - 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>
150 lines
5.3 KiB
Bash
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 "=================================================="
|