zioinfo-mail/setup/uninstall.sh
DESKTOP-TKLFCPR\ython df218a3f9b feat(gs-cert): GS인증 7개 필수 개선 구현 완료
[필수-1] 언인스톨 스크립트 (이식성 > 설치성)
- setup/uninstall.sh: Linux 완전 제거 (표준/purge 모드)
  - 백업 → 서비스중지 → Ollama/Gitea → 파일/DB 제거 → 보고
- setup/uninstall.ps1: Windows 완전 제거 (NSSM 서비스 제거)
  - -Purge -NoBackup -KeepJava -KeepDb 파라미터

[필수-2] 화면별 도움말 시스템 (사용성)
- static/help.js: 7개 화면 도움말 DB + F1/? 버튼 자동 삽입
  - 팝업: 아이콘+제목+내용+주제별 네비게이션
  - 키보드: F1(열기), ESC(닫기)
  - 검색: 도움말 전체 텍스트 검색

[필수-3] 에러 코드 목록 (기능 적합성)
- GET /api/admin/errors/codes: 17개 에러코드 + 해결방법
  AUTH_001~004, SR_001~004, LIC_001~003, CMDB_001~002, AI_001~002, SYS_001~002, VAL_001

[필수-4] 웹 접근성 개선 (사용성)
- --text-muted: #64748b(3.1:1) → #94a3b8(4.7:1) 색상 대비 개선
- :focus-visible 규칙 추가 (키보드 포커스 표시)
- 마우스 클릭 시 포커스 링 숨김 (UX 개선)

[필수-5] 성능 시험 실시
- 20명 동시 접속: avg 527ms, P95 864ms (GS기준 3초 통과)
- certification/05_시험성적서/성능_시험_결과.md 작성

[필수-6] 백업/복구 API (신뢰성 > 복구성)
- POST /api/admin/backup: DB+.env+업로드 ZIP 백업
- GET  /api/admin/backups: 백업 목록
- GET  /api/admin/backups/{file}/download: 백업 다운로드
- POST /api/admin/restore/{file}: 백업 복원

[필수-7] About/버전 화면 (유지보수성)
- GET /api/admin/about: 제품명/버전/빌드일/오픈소스목록
- GET /api/admin/health: DB+Ollama+디스크+라이선스 종합 상태

예상 GS 1등급 점수: 93점 / 100점

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-30 10:10:39 +09:00

196 lines
7.3 KiB
Bash

#!/bin/bash
# =============================================================
# GUARDiA ITSM 제거 스크립트 (Linux)
# =============================================================
# GS인증 이식성 > 설치성 요구사항 충족
# 사용법: sudo bash uninstall.sh [--purge] [--backup]
# --purge : 데이터/로그까지 완전 삭제
# --backup : 삭제 전 데이터 백업
# --keep-java : Java 유지
# --keep-db : DB 데이터 유지
# =============================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_FILE="/var/log/guardia_uninstall.log"
BACKUP_DIR="/var/backup/guardia_$(date +%Y%m%d_%H%M%S)"
PURGE=false; DO_BACKUP=true; KEEP_JAVA=false; KEEP_DB=false
while [[ $# -gt 0 ]]; do
case "$1" in
--purge) PURGE=true; shift ;;
--no-backup) DO_BACKUP=false; shift ;;
--keep-java) KEEP_JAVA=true; shift ;;
--keep-db) KEEP_DB=true; shift ;;
*) shift ;;
esac
done
GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m'
ok() { echo -e "${GREEN}[OK]${NC} $*" | tee -a "$LOG_FILE"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*" | tee -a "$LOG_FILE"; }
fail() { echo -e "${RED}[FAIL]${NC} $*" | tee -a "$LOG_FILE"; }
info() { echo -e " $*" | tee -a "$LOG_FILE"; }
[[ $EUID -eq 0 ]] || { echo "root 권한으로 실행하세요: sudo bash $0"; exit 1; }
echo "=================================================="
echo " GUARDiA ITSM 제거"
echo " 모드: $([ "$PURGE" == "true" ] && echo '완전삭제(purge)' || echo '표준제거')"
echo "=================================================="
# ── 1. 데이터 백업 ─────────────────────────────────────────────
if [[ "$DO_BACKUP" == "true" ]]; then
echo "[1/6] 데이터 백업 중..."
mkdir -p "$BACKUP_DIR"
# GUARDiA DB
DB_FILE=$(find /opt/guardia /home -name "guardia_itsm.db" 2>/dev/null | head -1)
[[ -f "$DB_FILE" ]] && cp "$DB_FILE" "$BACKUP_DIR/" && info "DB 백업: $DB_FILE"
# 업로드 파일
UPLOAD_DIR=$(find /opt/guardia -name "uploads" -type d 2>/dev/null | head -1)
[[ -d "$UPLOAD_DIR" ]] && cp -r "$UPLOAD_DIR" "$BACKUP_DIR/" && info "업로드 백업: $UPLOAD_DIR"
# .env 설정
ENV_FILE=$(find /opt/guardia -name ".env" 2>/dev/null | head -1)
[[ -f "$ENV_FILE" ]] && cp "$ENV_FILE" "$BACKUP_DIR/" && info ".env 백업"
ok "백업 완료: $BACKUP_DIR"
fi
# ── 2. 서비스 중지 및 비활성화 ────────────────────────────────
echo "[2/6] GUARDiA 서비스 중지..."
for svc in guardia-itsm scouter-server gitea tomcat9; do
if systemctl is-active "$svc" &>/dev/null; then
systemctl stop "$svc" 2>/dev/null && info "$svc 중지"
fi
if systemctl is-enabled "$svc" &>/dev/null; then
systemctl disable "$svc" 2>/dev/null && info "$svc 비활성화"
fi
[[ -f "/etc/systemd/system/${svc}.service" ]] && \
rm -f "/etc/systemd/system/${svc}.service" && info "${svc}.service 삭제"
done
systemctl daemon-reload
ok "서비스 제거 완료"
# ── 3. Ollama 제거 ─────────────────────────────────────────────
echo "[3/6] Ollama 제거..."
if command -v ollama &>/dev/null; then
systemctl stop ollama 2>/dev/null || true
systemctl disable ollama 2>/dev/null || true
rm -f /etc/systemd/system/ollama.service
rm -f /usr/local/bin/ollama
systemctl daemon-reload
ok "Ollama 제거 완료"
fi
# ── 4. Gitea 제거 ──────────────────────────────────────────────
echo "[4/6] Gitea 제거..."
if command -v gitea &>/dev/null || [[ -f /usr/local/bin/gitea ]]; then
rm -f /usr/local/bin/gitea
if [[ "$PURGE" == "true" ]]; then
rm -rf /var/lib/gitea /etc/gitea
id git &>/dev/null && userdel git 2>/dev/null || true
info "Gitea 데이터 삭제"
fi
ok "Gitea 제거 완료"
fi
# ── 5. GUARDiA 파일 제거 ──────────────────────────────────────
echo "[5/6] GUARDiA 파일 제거..."
# Python 가상환경
rm -rf /opt/guardia/venv
info "Python 가상환경 제거"
# 애플리케이션 파일
for dir in /opt/guardia/itsm /opt/guardia; do
if [[ "$PURGE" == "true" ]]; then
rm -rf "$dir" 2>/dev/null && info "$dir 제거" || true
else
# 소스/바이너리만 제거, 데이터는 유지
[[ -d "$dir" ]] && find "$dir" -name "*.py" -delete 2>/dev/null
info "$dir 소스 제거 (데이터 유지)"
fi
done
# Tomcat 제거
if [[ "$PURGE" == "true" ]]; then
rm -rf /app/tomcat
info "Tomcat 제거"
fi
# Nginx 설정 제거
if [[ -f /etc/nginx/sites-enabled/guardia ]]; then
rm -f /etc/nginx/sites-enabled/guardia
rm -f /etc/nginx/sites-available/guardia
nginx -t 2>/dev/null && nginx -s reload 2>/dev/null || true
info "Nginx 설정 제거"
fi
if [[ -f /etc/nginx/conf.d/guardia.conf ]]; then
rm -f /etc/nginx/conf.d/guardia.conf
nginx -t 2>/dev/null && nginx -s reload 2>/dev/null || true
fi
# Fail2ban 설정 제거
[[ -f /etc/fail2ban/jail.local ]] && rm -f /etc/fail2ban/jail.local
# Logrotate 설정 제거
[[ -f /etc/logrotate.d/tomcat9 ]] && rm -f /etc/logrotate.d/tomcat9
# Java 환경변수 제거
rm -f /etc/profile.d/java.sh /etc/profile.d/maven.sh
info "Java 환경변수 제거"
# opsagent 계정 제거
if [[ "$PURGE" == "true" ]]; then
id opsagent &>/dev/null && userdel opsagent 2>/dev/null && info "opsagent 계정 제거"
id tomcat &>/dev/null && userdel tomcat 2>/dev/null && info "tomcat 계정 제거"
fi
# Java 제거 (선택)
if [[ "$KEEP_JAVA" == "false" && "$PURGE" == "true" ]]; then
if command -v apt-get &>/dev/null; then
apt-get remove -y openjdk-17-jdk 2>/dev/null || true
apt-get autoremove -y 2>/dev/null || true
info "OpenJDK 17 제거"
elif command -v dnf &>/dev/null; then
dnf remove -y java-17-openjdk 2>/dev/null || true
info "OpenJDK 17 제거"
fi
fi
ok "GUARDiA 파일 제거 완료"
# ── 6. DB 제거 (purge 모드) ───────────────────────────────────
if [[ "$PURGE" == "true" && "$KEEP_DB" == "false" ]]; then
echo "[6/6] 데이터베이스 제거..."
# PostgreSQL 제거
if command -v psql &>/dev/null; then
sudo -u postgres psql -c "DROP DATABASE IF EXISTS guardia;" 2>/dev/null
sudo -u postgres psql -c "DROP USER IF EXISTS guardia;" 2>/dev/null
info "PostgreSQL DB/사용자 제거"
fi
# SQLite 제거
find / -name "guardia_itsm.db" 2>/dev/null | xargs rm -f
ok "데이터베이스 제거 완료"
else
echo "[6/6] 데이터베이스 유지 (--purge 옵션 없음)"
fi
# ── 완료 보고 ──────────────────────────────────────────────────
echo ""
echo "=================================================="
ok "GUARDiA ITSM 제거 완료!"
echo ""
if [[ "$DO_BACKUP" == "true" ]]; then
info "백업 위치: $BACKUP_DIR"
fi
if [[ "$PURGE" != "true" ]]; then
info "데이터 보존: /opt/guardia (purge 원하면 --purge 옵션 추가)"
fi
info "로그: $LOG_FILE"
echo "=================================================="