diff --git a/setup/setup_centos.sh b/setup/setup_centos.sh
index 0df9af14..e7e6af67 100644
--- a/setup/setup_centos.sh
+++ b/setup/setup_centos.sh
@@ -5,6 +5,9 @@
# 전제조건: 순수 CentOS OS (최소 설치)
# 실행 방법: sudo bash setup_centos.sh
# 설치 테스트: bash setup_centos.sh --test
+# 환경변수:
+# TOMCAT_VER=9.0.98 : Tomcat 버전
+# TOMCAT_MIRROR=http:// : 내부 미러 URL (오프라인 환경)
# =============================================================
set -euo pipefail
@@ -28,11 +31,13 @@ echo "=================================================="
[[ $EUID -eq 0 ]] || fail "root 권한으로 실행하세요: sudo bash $0"
+OS_VER=$(rpm -E %{rhel} 2>/dev/null || echo "7")
+echo "감지된 CentOS 버전: $OS_VER"
+
# ── 테스트 모드 ──────────────────────────────────────────────
if [[ "$TEST_MODE" == "--test" ]]; then
echo "=== 설치 검증 모드 ==="
PASS=0; FAIL=0
-
check() {
local desc="$1"; shift
if "$@" &>/dev/null; then
@@ -42,12 +47,18 @@ if [[ "$TEST_MODE" == "--test" ]]; then
fi
}
- check "Python 3.11+" python3.11 --version
- check "PostgreSQL" pg_isready -q
- check "Redis" redis-cli ping
- check "GUARDiA 포트" bash -c 'curl -sf http://localhost:8001/api/dashboard/overview -o /dev/null'
- check "Nginx" nginx -t
- check "systemd" systemctl is-active guardia-itsm
+ check "Java 17 (OpenJDK)" java -version
+ check "Python 3.11+" python3.11 --version
+ check "PostgreSQL" pg_isready -q
+ check "Redis" redis-cli ping
+ check "Tomcat 9 서비스" systemctl is-active tomcat9
+ check "Tomcat HTTP" bash -c 'curl -sf http://localhost:8080/ -o /dev/null'
+ check "GUARDiA 서비스" systemctl is-active guardia-itsm
+ check "GUARDiA HTTP" bash -c 'curl -sf http://localhost:8001/ -o /dev/null'
+ check "GUARDiA 로그인 API" bash -c 'curl -sf -X POST http://localhost:8001/api/auth/login \
+ -H "Content-Type: application/json" -d "{\"username\":\"admin\",\"password\":\"1111\"}" -o /dev/null'
+ check "Nginx" nginx -t
+ check "Python UTF-8" bash -c 'PYTHONIOENCODING=utf-8 python3.11 -c "print(\"OK\")" > /dev/null'
echo ""
echo "검증 결과: 성공 $PASS / 실패 $FAIL"
@@ -55,40 +66,102 @@ if [[ "$TEST_MODE" == "--test" ]]; then
exit 0
fi
-# ── OS 버전 감지 ──────────────────────────────────────────
-OS_VER=$(rpm -E %{rhel} 2>/dev/null || echo "7")
-echo "감지된 RHEL/CentOS 버전: $OS_VER"
-
-# ── 1. 시스템 패키지 ────────────────────────────────────────
+# ── 1. 시스템 패키지 ─────────────────────────────────────────
echo ""
-echo "[1/8] 시스템 패키지 설치..."
-
-# EPEL 저장소
+echo "[1/10] 시스템 패키지 설치..."
yum install -y epel-release 2>/dev/null || dnf install -y epel-release 2>/dev/null || true
if [[ "$OS_VER" -ge 8 ]]; then
- # CentOS Stream 8/9
dnf install -y \
- curl wget git gcc openssl-devel libffi-devel \
+ curl wget git gcc openssl-devel libffi-dev \
python3.11 python3.11-devel python3-pip \
+ java-17-openjdk java-17-openjdk-devel \
postgresql-server postgresql-contrib \
- redis nginx supervisor \
- unzip jq
+ redis nginx lsof unzip jq
else
- # CentOS 7
yum install -y centos-release-scl 2>/dev/null || true
yum install -y \
curl wget git gcc openssl-devel libffi-devel \
rh-python38 \
+ java-17-openjdk java-17-openjdk-devel \
postgresql-server postgresql-contrib \
- redis nginx supervisor \
- unzip jq
+ redis nginx lsof unzip jq
fi
-ok "시스템 패키지 설치 완료"
-# ── 2. Python 가상환경 ──────────────────────────────────────
+# JAVA_HOME 설정
+JAVA_HOME_PATH=$(alternatives --list 2>/dev/null | grep jre_17 | awk '{print $3}' | head -1)
+[ -z "$JAVA_HOME_PATH" ] && JAVA_HOME_PATH=$(dirname $(dirname $(readlink -f $(which java))))
+cat > /etc/profile.d/java.sh << JHEOF
+export JAVA_HOME=$JAVA_HOME_PATH
+export PATH=\$JAVA_HOME/bin:\$PATH
+JHEOF
+source /etc/profile.d/java.sh
+ok "시스템 패키지 + OpenJDK 17 설치 완료"
+
+# ── 2. Tomcat 9 설치 ─────────────────────────────────────────
echo ""
-echo "[2/8] Python 가상환경..."
+echo "[2/10] Tomcat 9 설치..."
+TOMCAT_VER="${TOMCAT_VER:-9.0.98}"
+TOMCAT_HOME="/app/tomcat"
+TOMCAT_USER="tomcat"
+
+id $TOMCAT_USER &>/dev/null || useradd -r -s /bin/false -d "$TOMCAT_HOME" $TOMCAT_USER
+
+# CentOS는 tomcat 패키지 버전이 낮을 수 있으므로 수동 설치 기본
+TOMCAT_TAR="apache-tomcat-${TOMCAT_VER}.tar.gz"
+MIRROR="${TOMCAT_MIRROR:-https://archive.apache.org/dist/tomcat/tomcat-9/v${TOMCAT_VER}/bin}"
+
+if [[ ! -d "$TOMCAT_HOME/bin" ]]; then
+ warn "Tomcat ${TOMCAT_VER} 설치 중 (MIRROR: $MIRROR)..."
+ wget -q "$MIRROR/$TOMCAT_TAR" -O /tmp/$TOMCAT_TAR \
+ || fail "Tomcat 다운로드 실패. TOMCAT_MIRROR=http://내부미러/... 로 설정하세요."
+ mkdir -p "$TOMCAT_HOME"
+ tar -xzf /tmp/$TOMCAT_TAR -C "$TOMCAT_HOME" --strip-components=1
+ chmod +x "$TOMCAT_HOME/bin/"*.sh
+fi
+
+mkdir -p "$TOMCAT_HOME/logs" "$TOMCAT_HOME/temp"
+chown -R $TOMCAT_USER:$TOMCAT_USER "$TOMCAT_HOME"
+
+# opsagent 계정 추가
+USERS_XML="$TOMCAT_HOME/conf/tomcat-users.xml"
+if [[ -f "$USERS_XML" ]] && ! grep -q "opsagent" "$USERS_XML"; then
+ sed -i 's|| \n \n \n|' "$USERS_XML"
+fi
+
+cat > /etc/systemd/system/tomcat9.service << TCEOF
+[Unit]
+Description=Apache Tomcat 9
+After=network.target
+
+[Service]
+Type=forking
+User=$TOMCAT_USER
+Group=$TOMCAT_USER
+Environment="JAVA_HOME=$JAVA_HOME_PATH"
+Environment="CATALINA_HOME=$TOMCAT_HOME"
+Environment="CATALINA_BASE=$TOMCAT_HOME"
+Environment="CATALINA_PID=$TOMCAT_HOME/temp/tomcat.pid"
+Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
+Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom"
+ExecStart=$TOMCAT_HOME/bin/startup.sh
+ExecStop=$TOMCAT_HOME/bin/shutdown.sh
+Restart=on-failure
+RestartSec=10
+SuccessExitStatus=143
+
+[Install]
+WantedBy=multi-user.target
+TCEOF
+
+systemctl daemon-reload
+systemctl enable tomcat9
+systemctl start tomcat9
+ok "Tomcat 9 서비스 등록 완료 (포트 8080)"
+
+# ── 3. Python 가상환경 ──────────────────────────────────────
+echo ""
+echo "[3/10] Python 가상환경..."
PYTHON_BIN=$(command -v python3.11 || command -v python3.8 || command -v python3)
mkdir -p /opt/guardia
$PYTHON_BIN -m venv /opt/guardia/venv
@@ -97,9 +170,9 @@ pip install --upgrade pip -q
pip install -r "$GUARDIA_ROOT/itsm/requirements.txt" -q
ok "Python 패키지 설치 완료"
-# ── 3. PostgreSQL 초기화 ────────────────────────────────────
+# ── 4. PostgreSQL 초기화 ────────────────────────────────────
echo ""
-echo "[3/8] PostgreSQL 초기화..."
+echo "[4/10] PostgreSQL 초기화..."
if [[ "$OS_VER" -ge 8 ]]; then
postgresql-setup --initdb 2>/dev/null || true
else
@@ -114,16 +187,16 @@ sudo -u postgres psql -tc "SELECT 1 FROM pg_database WHERE datname='guardia'" |
sudo -u postgres psql -c "CREATE DATABASE guardia OWNER guardia;"
ok "PostgreSQL 설정 완료"
-# ── 4. Redis 시작 ───────────────────────────────────────────
+# ── 5. Redis ────────────────────────────────────────────────
echo ""
-echo "[4/8] Redis 시작..."
+echo "[5/10] Redis 시작..."
systemctl start redis
systemctl enable redis
-ok "Redis 시작 완료"
+ok "Redis 완료"
-# ── 5. 환경 설정 파일 ───────────────────────────────────────
+# ── 6. 환경 파일 ────────────────────────────────────────────
echo ""
-echo "[5/8] 환경 설정 파일..."
+echo "[6/10] 환경 설정 파일..."
ENV_FILE="$GUARDIA_ROOT/itsm/.env"
if [[ ! -f "$ENV_FILE" ]]; then
cat > "$ENV_FILE" << 'ENVEOF'
@@ -136,33 +209,34 @@ OLLAMA_BASE_URL=http://localhost:11434
GUARDIA_LLM_MODEL=llama3.1:8b
MESSENGER_BASE_URL=http://localhost:8002
MESSENGER_OPS_ROOM=ops
+CATALINA_HOME=/app/tomcat
ENVEOF
- warn ".env 생성됨 — SECRET_KEY를 변경하세요"
+ warn ".env 생성됨 — SECRET_KEY 필수 변경"
fi
-# ── 6. DB 초기화 (스키마 불일치 자동 감지·복구) ─────────────────────────
+# ── 7. DB 초기화 ─────────────────────────────────────────────
echo ""
-echo "[6/8] DB 초기화..."
+echo "[7/10] DB 초기화..."
cd "$GUARDIA_ROOT/itsm"
source /opt/guardia/venv/bin/activate
if ss -tlnp 2>/dev/null | grep -q ':8001'; then
- warn "포트 8001 사용 중 — 기존 프로세스 종료..."
+ warn "포트 8001 사용 중 — 종료..."
fuser -k 8001/tcp 2>/dev/null || true; sleep 2
fi
PYTHONIOENCODING=utf-8 python tools/db_init.py --force \
&& ok "DB 초기화 완료" || fail "DB 초기화 실패"
-# ── 7. systemd 서비스 ───────────────────────────────────────
+# ── 8. systemd 서비스 ────────────────────────────────────────
echo ""
-echo "[7/8] systemd 서비스..."
+echo "[8/10] GUARDiA ITSM 서비스..."
systemctl stop guardia-itsm 2>/dev/null || true
cat > /etc/systemd/system/guardia-itsm.service << SVCEOF
[Unit]
Description=GUARDiA ITSM Server
-After=network.target postgresql.service redis.service
+After=network.target postgresql.service redis.service tomcat9.service
[Service]
Type=exec
@@ -183,11 +257,11 @@ SVCEOF
systemctl daemon-reload
systemctl enable guardia-itsm
systemctl start guardia-itsm
-ok "systemd 서비스 등록 완료"
+ok "GUARDiA ITSM 서비스 완료"
-# ── 8. Nginx ────────────────────────────────────────────────
+# ── 9. Nginx ─────────────────────────────────────────────────
echo ""
-echo "[8/8] Nginx 설정..."
+echo "[9/10] Nginx..."
cat > /etc/nginx/conf.d/guardia.conf << 'NGXEOF'
server {
listen 80;
@@ -206,26 +280,27 @@ server {
}
NGXEOF
-# SELinux 허용 (CentOS)
setsebool -P httpd_can_network_connect 1 2>/dev/null || true
+systemctl enable nginx; systemctl start nginx
-systemctl enable nginx
-systemctl start nginx
-ok "Nginx 설정 완료"
-
-# firewalld 설정
if systemctl is-active firewalld &>/dev/null; then
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
- ok "방화벽 설정 완료"
fi
+ok "Nginx 완료"
+
+# ── 10. 서비스 상태 확인 ─────────────────────────────────────
+echo ""
+echo "[10/10] 서비스 상태 확인..."
+for svc in tomcat9 guardia-itsm nginx postgresql redis; do
+ systemctl is-active "$svc" &>/dev/null && ok "$svc 실행 중" || warn "$svc 미실행"
+done
echo ""
echo "=================================================="
ok "GUARDiA ITSM 설치 완료 — CentOS"
-echo ""
-info "접속 URL: http://$(hostname -I | awk '{print $1}')"
-info "설치 로그: $LOG_FILE"
+info "GUARDiA URL: http://$(hostname -I | awk '{print $1}')"
+info "Tomcat URL: http://$(hostname -I | awk '{print $1}'):8080 (내부 전용)"
info "검증: sudo bash $0 --test"
echo "=================================================="
diff --git a/setup/setup_rhel.sh b/setup/setup_rhel.sh
index b03e0709..87d6dce4 100644
--- a/setup/setup_rhel.sh
+++ b/setup/setup_rhel.sh
@@ -42,13 +42,19 @@ if [[ "$TEST_MODE" == "--test" ]]; then
fi
}
- check "Python 3.11+" python3.11 --version
- check "PostgreSQL" pg_isready -q
- check "Redis" redis-cli ping
- check "GUARDiA 포트" bash -c 'curl -sf http://localhost:8001/api/dashboard/overview -o /dev/null'
- check "Nginx" nginx -t
- check "systemd" systemctl is-active guardia-itsm
- check "SELinux 정책" bash -c 'getsebool httpd_can_network_connect | grep -q on'
+ check "Java 17 (OpenJDK)" java -version
+ check "Python 3.11+" python3.11 --version
+ check "PostgreSQL" pg_isready -q
+ check "Redis" redis-cli ping
+ check "Tomcat 9 서비스" systemctl is-active tomcat9
+ check "Tomcat HTTP" bash -c 'curl -sf http://localhost:8080/ -o /dev/null'
+ check "GUARDiA 서비스" systemctl is-active guardia-itsm
+ check "GUARDiA HTTP" bash -c 'curl -sf http://localhost:8001/ -o /dev/null'
+ check "GUARDiA 로그인 API" bash -c 'curl -sf -X POST http://localhost:8001/api/auth/login \
+ -H "Content-Type: application/json" -d "{\"username\":\"admin\",\"password\":\"1111\"}" -o /dev/null'
+ check "Nginx" nginx -t
+ check "SELinux httpd_can_network_connect" bash -c 'getsebool httpd_can_network_connect | grep -q on'
+ check "Python UTF-8" bash -c 'PYTHONIOENCODING=utf-8 python3.11 -c "print(\"OK\")" > /dev/null'
echo ""
echo "검증 결과: 성공 $PASS / 실패 $FAIL"
@@ -72,20 +78,88 @@ ok "저장소 설정 완료"
# ── 2. 패키지 설치 ──────────────────────────────────────────
echo ""
-echo "[2/9] 시스템 패키지 설치..."
+echo "[2/11] 시스템 패키지 설치..."
dnf install -y \
curl wget git gcc make openssl-devel libffi-devel \
python3.11 python3.11-devel python3-pip \
+ java-17-openjdk java-17-openjdk-devel \
postgresql-server postgresql-contrib \
- redis \
- nginx \
- unzip jq
+ redis nginx lsof unzip jq
-ok "시스템 패키지 설치 완료"
+# JAVA_HOME 설정
+JAVA_HOME_PATH=$(alternatives --list 2>/dev/null | grep jre_17 | awk '{print $3}' | head -1)
+[ -z "$JAVA_HOME_PATH" ] && JAVA_HOME_PATH=$(dirname $(dirname $(readlink -f $(which java))))
+cat > /etc/profile.d/java.sh << JHEOF
+export JAVA_HOME=$JAVA_HOME_PATH
+export PATH=\$JAVA_HOME/bin:\$PATH
+JHEOF
+source /etc/profile.d/java.sh
+ok "시스템 패키지 + OpenJDK 17 설치 완료"
-# ── 3. Python 가상환경 ──────────────────────────────────────
+# ── 3. Tomcat 9 설치 ─────────────────────────────────────────
echo ""
-echo "[3/9] Python 가상환경 설정..."
+echo "[3/11] Tomcat 9 설치..."
+TOMCAT_VER="${TOMCAT_VER:-9.0.98}"
+TOMCAT_HOME="/app/tomcat"
+TOMCAT_USER="tomcat"
+
+id $TOMCAT_USER &>/dev/null || useradd -r -s /bin/false -d "$TOMCAT_HOME" $TOMCAT_USER
+
+TOMCAT_TAR="apache-tomcat-${TOMCAT_VER}.tar.gz"
+MIRROR="${TOMCAT_MIRROR:-https://archive.apache.org/dist/tomcat/tomcat-9/v${TOMCAT_VER}/bin}"
+
+if [[ ! -d "$TOMCAT_HOME/bin" ]]; then
+ wget -q "$MIRROR/$TOMCAT_TAR" -O /tmp/$TOMCAT_TAR \
+ || fail "Tomcat 다운로드 실패. TOMCAT_MIRROR 환경변수를 설정하세요."
+ mkdir -p "$TOMCAT_HOME"
+ tar -xzf /tmp/$TOMCAT_TAR -C "$TOMCAT_HOME" --strip-components=1
+ chmod +x "$TOMCAT_HOME/bin/"*.sh
+fi
+
+mkdir -p "$TOMCAT_HOME/logs" "$TOMCAT_HOME/temp"
+chown -R $TOMCAT_USER:$TOMCAT_USER "$TOMCAT_HOME"
+
+USERS_XML="$TOMCAT_HOME/conf/tomcat-users.xml"
+if [[ -f "$USERS_XML" ]] && ! grep -q "opsagent" "$USERS_XML"; then
+ sed -i 's|| \n \n \n|' "$USERS_XML"
+fi
+
+# SELinux: Tomcat 포트 허용
+semanage port -a -t http_port_t -p tcp 8080 2>/dev/null || true
+
+cat > /etc/systemd/system/tomcat9.service << TCEOF
+[Unit]
+Description=Apache Tomcat 9
+After=network.target
+
+[Service]
+Type=forking
+User=$TOMCAT_USER
+Group=$TOMCAT_USER
+Environment="JAVA_HOME=$JAVA_HOME_PATH"
+Environment="CATALINA_HOME=$TOMCAT_HOME"
+Environment="CATALINA_BASE=$TOMCAT_HOME"
+Environment="CATALINA_PID=$TOMCAT_HOME/temp/tomcat.pid"
+Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
+Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom"
+ExecStart=$TOMCAT_HOME/bin/startup.sh
+ExecStop=$TOMCAT_HOME/bin/shutdown.sh
+Restart=on-failure
+RestartSec=10
+SuccessExitStatus=143
+
+[Install]
+WantedBy=multi-user.target
+TCEOF
+
+systemctl daemon-reload
+systemctl enable tomcat9
+systemctl start tomcat9
+ok "Tomcat 9 서비스 등록 완료"
+
+# ── 4. Python 가상환경 ──────────────────────────────────────
+echo ""
+echo "[4/11] Python 가상환경 설정..."
mkdir -p /opt/guardia
python3.11 -m venv /opt/guardia/venv
source /opt/guardia/venv/bin/activate
@@ -95,7 +169,7 @@ ok "Python 환경 준비 완료"
# ── 4. PostgreSQL 초기화 ────────────────────────────────────
echo ""
-echo "[4/9] PostgreSQL 설정..."
+echo "[5/11] PostgreSQL 설정..."
postgresql-setup --initdb 2>/dev/null || true
systemctl start postgresql
systemctl enable postgresql
@@ -115,14 +189,14 @@ ok "PostgreSQL 설정 완료"
# ── 5. Redis ────────────────────────────────────────────────
echo ""
-echo "[5/9] Redis 시작..."
+echo "[6/11] Redis 시작..."
systemctl start redis
systemctl enable redis
ok "Redis 완료"
# ── 6. 환경 파일 ────────────────────────────────────────────
echo ""
-echo "[6/9] 환경 설정 파일..."
+echo "[7/11] 환경 설정 파일..."
ENV_FILE="$GUARDIA_ROOT/itsm/.env"
if [[ ! -f "$ENV_FILE" ]]; then
cat > "$ENV_FILE" << 'ENVEOF'
@@ -141,7 +215,7 @@ fi
# ── 7. DB 초기화 (스키마 불일치 자동 감지·복구) ─────────────────────────
echo ""
-echo "[7/9] DB 초기화..."
+echo "[8/11] DB 초기화..."
cd "$GUARDIA_ROOT/itsm"
source /opt/guardia/venv/bin/activate
@@ -155,7 +229,7 @@ PYTHONIOENCODING=utf-8 python tools/db_init.py --force \
# ── 8. systemd ──────────────────────────────────────────────
echo ""
-echo "[8/9] systemd 서비스..."
+echo "[9/11] systemd 서비스..."
systemctl stop guardia-itsm 2>/dev/null || true
cat > /etc/systemd/system/guardia-itsm.service << SVCEOF
@@ -186,7 +260,7 @@ ok "systemd 서비스 완료"
# ── 9. Nginx + SELinux ──────────────────────────────────────
echo ""
-echo "[9/9] Nginx + SELinux 설정..."
+echo "[10/11] Nginx + SELinux 설정..."
cat > /etc/nginx/conf.d/guardia.conf << 'NGXEOF'
server {
listen 80;
diff --git a/setup/setup_target_server.sh b/setup/setup_target_server.sh
new file mode 100644
index 00000000..43faaf83
--- /dev/null
+++ b/setup/setup_target_server.sh
@@ -0,0 +1,253 @@
+#!/bin/bash
+# =============================================================
+# GUARDiA 관리 대상 서버 표준 설치 스크립트
+# =============================================================
+# 목적: GUARDiA가 SSH로 관리할 WAS 서버(관공서·기관)의 표준 구성
+# 설치 내용: OpenJDK 17 + Tomcat 9 + opsagent 계정
+#
+# 전제조건: 순수 Linux OS (Ubuntu 20+/CentOS 7+/RHEL 8+)
+# 실행 방법: sudo bash setup_target_server.sh
+# 설치 테스트: bash setup_target_server.sh --test
+#
+# 환경변수:
+# TOMCAT_VER=9.0.98 : Tomcat 버전 (기본 9.0.98)
+# TOMCAT_MIRROR=http://.. : 내부 미러 URL (망분리 환경)
+# OPSAGENT_PW=... : opsagent 계정 비밀번호 (기본: 랜덤 생성)
+# =============================================================
+
+set -euo pipefail
+LOG_FILE="/var/log/guardia_target_install.log"
+TEST_MODE="${1:-}"
+
+RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; 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"; exit 1; }
+info() { echo -e " $*"; }
+
+exec > >(tee -a "$LOG_FILE") 2>&1
+
+echo "=================================================="
+echo " GUARDiA 관리 대상 서버 설치 (WAS 표준 구성)"
+echo " 시작: $(date)"
+echo "=================================================="
+
+[[ $EUID -eq 0 ]] || fail "root 권한으로 실행하세요: sudo bash $0"
+
+# OS 감지
+if command -v apt-get &>/dev/null; then OS_TYPE="debian"
+elif command -v dnf &>/dev/null; then OS_TYPE="rhel"
+elif command -v yum &>/dev/null; then OS_TYPE="centos7"
+else fail "지원하지 않는 OS입니다."
+fi
+info "감지된 OS 유형: $OS_TYPE"
+
+# ── 테스트 모드 ──────────────────────────────────────────────
+if [[ "$TEST_MODE" == "--test" ]]; then
+ echo "=== 대상 서버 설치 검증 ==="
+ PASS=0; FAIL=0
+ check() {
+ local desc="$1"; shift
+ if "$@" &>/dev/null; then
+ ok "$desc"; ((PASS++))
+ else
+ echo -e "${RED}[FAIL]${NC} $desc"; ((FAIL++))
+ fi
+ }
+
+ check "Java 17 설치" java -version
+ check "JAVA_HOME 설정" bash -c 'test -n "$JAVA_HOME" && java -version'
+ check "opsagent 계정 존재" id opsagent
+ check "opsagent sudo 권한" bash -c 'sudo -l -U opsagent 2>/dev/null | grep -q NOPASSWD'
+ check "Tomcat 9 서비스 실행" systemctl is-active tomcat9
+ check "Tomcat HTTP 응답" bash -c 'curl -sf http://localhost:8080/ -o /dev/null'
+ check "Tomcat Manager 경로" bash -c 'curl -sf http://localhost:8080/manager/text/list \
+ -u "opsagent:$(cat /etc/guardia/.opsagent_pw 2>/dev/null || echo wrong)" -o /dev/null'
+ check "포트 22 (SSH)" bash -c 'ss -tlnp | grep ":22 "'
+ check "포트 8080 (Tomcat)" bash -c 'ss -tlnp | grep ":8080 "'
+ check "/app/tomcat 경로 존재" test -d /app/tomcat
+ check "catalina.out 로그" test -f /app/tomcat/logs/catalina.out
+
+ echo ""
+ echo "검증 결과: 성공 $PASS / 실패 $FAIL"
+ [[ $FAIL -eq 0 ]] && ok "모든 검사 통과 — GUARDiA 관리 대상 서버 준비 완료" \
+ || fail "일부 검사 실패 — 로그: $LOG_FILE"
+ exit 0
+fi
+
+TOMCAT_VER="${TOMCAT_VER:-9.0.98}"
+TOMCAT_HOME="/app/tomcat"
+TOMCAT_USER="tomcat"
+
+# opsagent 비밀번호 생성 또는 환경변수 사용
+if [[ -n "${OPSAGENT_PW:-}" ]]; then
+ OPS_PW="$OPSAGENT_PW"
+else
+ OPS_PW=$(tr -dc 'A-Za-z0-9@#$' < /dev/urandom | head -c 20)
+fi
+mkdir -p /etc/guardia
+echo "$OPS_PW" > /etc/guardia/.opsagent_pw
+chmod 600 /etc/guardia/.opsagent_pw
+
+# ── 1. OpenJDK 17 설치 ───────────────────────────────────────
+echo ""
+echo "[1/5] OpenJDK 17 설치..."
+case $OS_TYPE in
+ debian)
+ apt-get update -qq
+ apt-get install -y -qq openjdk-17-jdk curl wget lsof
+ JAVA_HOME_PATH=$(update-java-alternatives -l 2>/dev/null | grep java-17 | awk '{print $3}' | head -1)
+ ;;
+ rhel)
+ dnf install -y java-17-openjdk java-17-openjdk-devel curl wget lsof
+ JAVA_HOME_PATH=$(alternatives --list 2>/dev/null | grep jre_17 | awk '{print $3}' | head -1)
+ ;;
+ centos7)
+ yum install -y java-17-openjdk java-17-openjdk-devel curl wget lsof 2>/dev/null || \
+ yum install -y java-11-openjdk java-11-openjdk-devel curl wget lsof
+ JAVA_HOME_PATH=$(alternatives --list 2>/dev/null | grep jre | awk '{print $3}' | head -1)
+ ;;
+esac
+
+[ -z "${JAVA_HOME_PATH:-}" ] && JAVA_HOME_PATH=$(dirname $(dirname $(readlink -f $(which java))))
+
+cat > /etc/profile.d/java.sh << JHEOF
+export JAVA_HOME=$JAVA_HOME_PATH
+export PATH=\$JAVA_HOME/bin:\$PATH
+JHEOF
+source /etc/profile.d/java.sh
+ok "OpenJDK 17 설치 완료 (JAVA_HOME=$JAVA_HOME_PATH)"
+
+# ── 2. Tomcat 9 설치 ─────────────────────────────────────────
+echo ""
+echo "[2/5] Tomcat 9 설치 (경로: $TOMCAT_HOME)..."
+id $TOMCAT_USER &>/dev/null || useradd -r -s /bin/false -d "$TOMCAT_HOME" $TOMCAT_USER
+
+TOMCAT_TAR="apache-tomcat-${TOMCAT_VER}.tar.gz"
+MIRROR="${TOMCAT_MIRROR:-https://archive.apache.org/dist/tomcat/tomcat-9/v${TOMCAT_VER}/bin}"
+
+if [[ ! -d "$TOMCAT_HOME/bin" ]]; then
+ wget -q "$MIRROR/$TOMCAT_TAR" -O /tmp/$TOMCAT_TAR \
+ || fail "Tomcat 다운로드 실패. TOMCAT_MIRROR=http://내부미러 로 설정하세요."
+ mkdir -p "$TOMCAT_HOME"
+ tar -xzf /tmp/$TOMCAT_TAR -C "$TOMCAT_HOME" --strip-components=1
+ chmod +x "$TOMCAT_HOME/bin/"*.sh
+fi
+
+mkdir -p "$TOMCAT_HOME/logs" "$TOMCAT_HOME/temp"
+chown -R $TOMCAT_USER:$TOMCAT_USER "$TOMCAT_HOME"
+
+# opsagent 계정 추가 (GUARDiA Manager 원격 관리용)
+USERS_XML="$TOMCAT_HOME/conf/tomcat-users.xml"
+if [[ -f "$USERS_XML" ]]; then
+ # 기존 opsagent 제거 후 재추가 (비밀번호 갱신)
+ sed -i '/opsagent/d; /manager-script/d; /manager-jmx/d' "$USERS_XML"
+ sed -i "s|| \n \n \n \n|" "$USERS_XML"
+fi
+
+# ── Tomcat server.xml 보안 설정 ──────────────────────────────
+SERVER_XML="$TOMCAT_HOME/conf/server.xml"
+if [[ -f "$SERVER_XML" ]]; then
+ # AJP 커넥터 비활성화 (보안)
+ sed -i 's||redirectPort="8443" /> -->|' "$SERVER_XML"
+ # shutdown 포트 무작위화 (기본 8005 → 변경)
+ sed -i 's/port="8005"/port="-1"/' "$SERVER_XML"
+fi
+
+# systemd 서비스 등록
+cat > /etc/systemd/system/tomcat9.service << TCEOF
+[Unit]
+Description=Apache Tomcat 9 WAS
+After=network.target
+
+[Service]
+Type=forking
+User=$TOMCAT_USER
+Group=$TOMCAT_USER
+Environment="JAVA_HOME=$JAVA_HOME_PATH"
+Environment="CATALINA_HOME=$TOMCAT_HOME"
+Environment="CATALINA_BASE=$TOMCAT_HOME"
+Environment="CATALINA_PID=$TOMCAT_HOME/temp/tomcat.pid"
+Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
+Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom"
+ExecStart=$TOMCAT_HOME/bin/startup.sh
+ExecStop=$TOMCAT_HOME/bin/shutdown.sh
+Restart=on-failure
+RestartSec=10
+SuccessExitStatus=143
+
+[Install]
+WantedBy=multi-user.target
+TCEOF
+
+systemctl daemon-reload
+systemctl enable tomcat9
+systemctl start tomcat9
+ok "Tomcat 9 서비스 등록 완료 (포트 8080)"
+
+# ── 3. opsagent OS 계정 생성 ─────────────────────────────────
+echo ""
+echo "[3/5] opsagent OS 계정 설정..."
+id opsagent &>/dev/null || useradd -m -s /bin/bash opsagent
+echo "opsagent:$OPS_PW" | chpasswd
+
+# sudo 권한 부여 (Tomcat 재기동, 로그 조회만)
+cat > /etc/sudoers.d/opsagent << 'SUDOEOF'
+# GUARDiA opsagent — Tomcat 관리 전용 (root 직접 접속 금지)
+opsagent ALL=(ALL) NOPASSWD: \
+ /bin/systemctl start tomcat9, \
+ /bin/systemctl stop tomcat9, \
+ /bin/systemctl restart tomcat9, \
+ /bin/systemctl status tomcat9, \
+ /usr/bin/tail -f /app/tomcat/logs/catalina.out, \
+ /bin/cat /app/tomcat/logs/catalina.out
+SUDOEOF
+chmod 440 /etc/sudoers.d/opsagent
+ok "opsagent 계정 설정 완료"
+
+# ── 4. SSH 보안 설정 (root 직접 접속 금지) ───────────────────
+echo ""
+echo "[4/5] SSH 보안 설정..."
+# root 직접 SSH 금지
+sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
+# 비밀번호 인증 허용 (GUARDiA SSH 에이전트 사용)
+sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
+systemctl restart sshd 2>/dev/null || systemctl restart ssh 2>/dev/null || true
+ok "SSH 보안 설정 완료 (root 직접 접속 금지)"
+
+# ── 5. GUARDiA 연결 정보 출력 ────────────────────────────────
+echo ""
+echo "[5/5] GUARDiA 연결 정보 저장..."
+SERVER_IP=$(hostname -I | awk '{print $1}')
+cat > /etc/guardia/connection_info.txt << CONNEOF
+# GUARDiA ITSM 연결 정보 — $(date)
+서버 IP: $SERVER_IP
+SSH 계정: opsagent
+SSH 비밀번호: $OPS_PW (보안상 이 파일을 삭제하고 GUARDiA CMDB에만 저장할 것)
+Tomcat Manager: http://${SERVER_IP}:8080/manager
+Tomcat 계정: opsagent / $OPS_PW
+CATALINA_HOME: $TOMCAT_HOME
+JAVA_HOME: $JAVA_HOME_PATH
+CONNEOF
+chmod 600 /etc/guardia/connection_info.txt
+
+ok "GUARDiA 연결 정보 저장: /etc/guardia/connection_info.txt"
+
+echo ""
+echo "=================================================="
+ok "GUARDiA 관리 대상 서버 설치 완료"
+echo ""
+info "=== GUARDiA CMDB에 등록할 서버 정보 ==="
+info "서버 IP: $SERVER_IP"
+info "SSH 계정: opsagent"
+info "SSH 비밀번호: $OPS_PW"
+info "CATALINA_HOME: $TOMCAT_HOME"
+info "Tomcat 포트: 8080"
+echo ""
+warn "보안 주의: 위 비밀번호를 GUARDiA CMDB에 등록한 후"
+warn " /etc/guardia/connection_info.txt 파일을 삭제하세요."
+warn " shred -u /etc/guardia/connection_info.txt"
+echo ""
+info "설치 검증: sudo bash $0 --test"
+echo "=================================================="
diff --git a/setup/setup_ubuntu.sh b/setup/setup_ubuntu.sh
index c00b39e1..08e4b1db 100644
--- a/setup/setup_ubuntu.sh
+++ b/setup/setup_ubuntu.sh
@@ -5,6 +5,9 @@
# 전제조건: 순수 Ubuntu OS (최소 설치)
# 실행 방법: sudo bash setup_ubuntu.sh
# 설치 테스트: bash setup_ubuntu.sh --test
+# 환경변수 (오프라인 환경):
+# TOMCAT_VER=9.0.98 : Tomcat 버전 (기본 9.0.98)
+# TOMCAT_MIRROR=http:// : 내부 미러 URL (기본 apache.org)
# =============================================================
set -euo pipefail
@@ -13,7 +16,6 @@ GUARDIA_ROOT="$(dirname "$SCRIPT_DIR")"
LOG_FILE="/var/log/guardia_install.log"
TEST_MODE="${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} $*"; }
@@ -27,7 +29,6 @@ echo " GUARDiA ITSM 설치 — Ubuntu"
echo " 시작: $(date)"
echo "=================================================="
-# ── root 권한 확인 ───────────────────────────────────────────
[[ $EUID -eq 0 ]] || fail "root 권한으로 실행하세요: sudo bash $0"
# ── 테스트 모드 ──────────────────────────────────────────────
@@ -40,105 +41,178 @@ if [[ "$TEST_MODE" == "--test" ]]; then
if "$@" &>/dev/null; then
ok "$desc"; ((PASS++))
else
- fail_cnt "$desc"; ((FAIL++))
+ echo -e "${RED}[FAIL]${NC} $desc"; ((FAIL++))
fi
}
- fail_cnt() { echo -e "${RED}[FAIL]${NC} $*"; }
- check "Python 3.11+" python3.11 --version
- check "pip 설치" python3.11 -m pip --version
- check "PostgreSQL" pg_isready -q
- check "Redis" redis-cli ping
- check "GUARDiA 서버 기동" systemctl is-active guardia-itsm
- check "GUARDiA HTTP 응답" bash -c 'curl -sf http://localhost:8001/ -o /dev/null'
- check "GUARDiA 로그인 API" bash -c 'curl -sf -X POST http://localhost:8001/api/auth/login -H "Content-Type: application/json" -d "{\"username\":\"admin\",\"password\":\"1111\"}" -o /dev/null'
- check "Nginx 설정" nginx -t
- check "Python UTF-8 인코딩" bash -c 'PYTHONIOENCODING=utf-8 python3.11 -c "print(\"OK\")" > /dev/null'
+ check "Java 17 (OpenJDK)" java -version
+ check "Python 3.11+" python3.11 --version
+ check "PostgreSQL" pg_isready -q
+ check "Redis" redis-cli ping
+ check "Tomcat 9 서비스" systemctl is-active tomcat9
+ check "Tomcat HTTP" bash -c 'curl -sf http://localhost:8080/ -o /dev/null'
+ check "GUARDiA 서비스" systemctl is-active guardia-itsm
+ check "GUARDiA HTTP" bash -c 'curl -sf http://localhost:8001/ -o /dev/null'
+ check "GUARDiA 로그인 API" bash -c 'curl -sf -X POST http://localhost:8001/api/auth/login \
+ -H "Content-Type: application/json" -d "{\"username\":\"admin\",\"password\":\"1111\"}" -o /dev/null'
+ check "Nginx 설정" nginx -t
+ check "Python UTF-8 인코딩" bash -c 'PYTHONIOENCODING=utf-8 python3.11 -c "print(\"OK\")" > /dev/null'
echo ""
echo "검증 결과: 성공 $PASS / 실패 $FAIL"
- [[ $FAIL -eq 0 ]] && ok "모든 검사 통과 — GUARDiA ITSM 정상 설치됨" || fail "일부 검사 실패 — 로그를 확인하세요: $LOG_FILE"
+ [[ $FAIL -eq 0 ]] && ok "모든 검사 통과 — GUARDiA ITSM 정상 설치됨" \
+ || fail "일부 검사 실패 — 로그: $LOG_FILE"
exit 0
fi
# ── 1. 시스템 패키지 업데이트 ────────────────────────────────
echo ""
-echo "[1/8] 시스템 패키지 업데이트..."
+echo "[1/10] 시스템 패키지 업데이트..."
apt-get update -qq
apt-get install -y -qq \
curl wget git build-essential libssl-dev libffi-dev \
python3.11 python3.11-venv python3.11-dev python3-pip \
+ openjdk-17-jdk \
postgresql postgresql-contrib \
- redis-server \
- nginx \
- supervisor \
- unzip jq
-ok "시스템 패키지 설치 완료"
+ redis-server nginx supervisor \
+ unzip jq lsof
-# ── 2. Python 가상환경 ──────────────────────────────────────
+# JAVA_HOME 설정
+JAVA_HOME_PATH=$(update-java-alternatives -l 2>/dev/null | grep java-17 | awk '{print $3}' | head -1)
+[ -z "$JAVA_HOME_PATH" ] && JAVA_HOME_PATH=$(dirname $(dirname $(readlink -f $(which java))))
+cat > /etc/profile.d/java.sh << JHEOF
+export JAVA_HOME=$JAVA_HOME_PATH
+export PATH=\$JAVA_HOME/bin:\$PATH
+JHEOF
+source /etc/profile.d/java.sh
+ok "시스템 패키지 + OpenJDK 17 설치 완료"
+
+# ── 2. Tomcat 9 설치 ─────────────────────────────────────────
echo ""
-echo "[2/8] Python 가상환경 설정..."
+echo "[2/10] Tomcat 9 + OpenJDK 17 설정..."
+TOMCAT_VER="${TOMCAT_VER:-9.0.98}"
+TOMCAT_HOME="/app/tomcat"
+TOMCAT_USER="tomcat"
+
+# tomcat 전용 계정
+id $TOMCAT_USER &>/dev/null || useradd -r -s /bin/false -d "$TOMCAT_HOME" $TOMCAT_USER
+
+if apt-cache show tomcat9 &>/dev/null 2>&1; then
+ # 패키지 관리자 설치 (온라인 환경)
+ apt-get install -y -qq tomcat9 tomcat9-admin
+ # shell_scripts_guide의 /app/tomcat 경로로 심링크
+ ln -sfn /usr/share/tomcat9 "$TOMCAT_HOME" 2>/dev/null || true
+ ln -sfn /var/log/tomcat9 "$TOMCAT_HOME/logs" 2>/dev/null || true
+ TOMCAT_CONF="/etc/tomcat9"
+ ok "Tomcat 9 패키지 설치 완료"
+else
+ # 수동 설치 — 오프라인 또는 버전 고정 환경
+ warn "apt 저장소에 tomcat9 없음 — Tomcat ${TOMCAT_VER} 수동 설치..."
+ TOMCAT_TAR="apache-tomcat-${TOMCAT_VER}.tar.gz"
+ MIRROR="${TOMCAT_MIRROR:-https://archive.apache.org/dist/tomcat/tomcat-9/v${TOMCAT_VER}/bin}"
+ wget -q "$MIRROR/$TOMCAT_TAR" -O /tmp/$TOMCAT_TAR \
+ || fail "Tomcat 다운로드 실패. 오프라인 환경이면 TOMCAT_MIRROR=http://내부미러/... 로 설정하세요."
+ mkdir -p "$TOMCAT_HOME"
+ tar -xzf /tmp/$TOMCAT_TAR -C "$TOMCAT_HOME" --strip-components=1
+ chmod +x "$TOMCAT_HOME/bin/"*.sh
+ TOMCAT_CONF="$TOMCAT_HOME/conf"
+ ok "Tomcat ${TOMCAT_VER} 수동 설치 완료: $TOMCAT_HOME"
+fi
+
+# 로그 디렉토리 보장
+mkdir -p "$TOMCAT_HOME/logs" "$TOMCAT_HOME/temp"
+chown -R $TOMCAT_USER:$TOMCAT_USER "$TOMCAT_HOME" 2>/dev/null || true
+
+# opsagent 계정 — GUARDiA Manager 원격 제어용
+for XML in "${TOMCAT_CONF}/tomcat-users.xml" "$TOMCAT_HOME/conf/tomcat-users.xml"; do
+ if [[ -f "$XML" ]] && ! grep -q "opsagent" "$XML"; then
+ sed -i 's|| \n \n \n|' "$XML"
+ info "opsagent 계정 추가: $XML"
+ break
+ fi
+done
+
+# systemd 서비스
+cat > /etc/systemd/system/tomcat9.service << TCEOF
+[Unit]
+Description=Apache Tomcat 9
+After=network.target
+
+[Service]
+Type=forking
+User=$TOMCAT_USER
+Group=$TOMCAT_USER
+Environment="JAVA_HOME=$JAVA_HOME_PATH"
+Environment="CATALINA_HOME=$TOMCAT_HOME"
+Environment="CATALINA_BASE=$TOMCAT_HOME"
+Environment="CATALINA_PID=$TOMCAT_HOME/temp/tomcat.pid"
+Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
+Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom"
+ExecStart=$TOMCAT_HOME/bin/startup.sh
+ExecStop=$TOMCAT_HOME/bin/shutdown.sh
+Restart=on-failure
+RestartSec=10
+SuccessExitStatus=143
+
+[Install]
+WantedBy=multi-user.target
+TCEOF
+
+systemctl daemon-reload
+systemctl enable tomcat9
+systemctl start tomcat9
+ok "Tomcat 9 서비스 등록 완료 (포트 8080)"
+
+# ── 3. Python 가상환경 ──────────────────────────────────────
+echo ""
+echo "[3/10] Python 가상환경 설정..."
+mkdir -p /opt/guardia
python3.11 -m venv /opt/guardia/venv
source /opt/guardia/venv/bin/activate
pip install --upgrade pip -q
pip install -r "$GUARDIA_ROOT/itsm/requirements.txt" -q
ok "Python 패키지 설치 완료"
-# ── 3. PostgreSQL 설정 ─────────────────────────────────────
+# ── 4. PostgreSQL 설정 ─────────────────────────────────────
echo ""
-echo "[3/8] PostgreSQL 설정..."
+echo "[4/10] PostgreSQL 설정..."
systemctl start postgresql
systemctl enable postgresql
-# DB/사용자 생성 (이미 존재하면 무시)
sudo -u postgres psql -tc "SELECT 1 FROM pg_user WHERE usename='guardia'" | grep -q 1 || \
sudo -u postgres psql -c "CREATE USER guardia WITH PASSWORD 'guardia_secure_pw';"
sudo -u postgres psql -tc "SELECT 1 FROM pg_database WHERE datname='guardia'" | grep -q 1 || \
sudo -u postgres psql -c "CREATE DATABASE guardia OWNER guardia;"
ok "PostgreSQL 설정 완료"
-# ── 4. 환경 설정 파일 ─────────────────────────────────────
+# ── 5. 환경 설정 파일 ─────────────────────────────────────
echo ""
-echo "[4/8] 환경 설정 파일 생성..."
+echo "[5/10] 환경 설정 파일 생성..."
ENV_FILE="$GUARDIA_ROOT/itsm/.env"
if [[ ! -f "$ENV_FILE" ]]; then
cat > "$ENV_FILE" << 'ENVEOF'
-# GUARDiA ITSM 환경 설정
DATABASE_URL=postgresql+asyncpg://guardia:guardia_secure_pw@localhost:5432/guardia
SECRET_KEY=change_this_secret_key_in_production_min_32chars
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=480
-
-# Redis (선택)
REDIS_URL=redis://localhost:6379/0
-
-# Ollama LLM (온프레미스 필수)
OLLAMA_BASE_URL=http://localhost:11434
GUARDIA_LLM_MODEL=llama3.1:8b
-
-# 메신저 연동 (선택)
MESSENGER_BASE_URL=http://localhost:8002
MESSENGER_OPS_ROOM=ops
-
-# 라이선스 (상용화 시 설정)
-# GUARDIA_LICENSE_KEY=GRD-...
-
-# VAPID 푸시 알림 (선택)
-# VAPID_PRIVATE_KEY=...
-# VAPID_PUBLIC_KEY=...
+CATALINA_HOME=/app/tomcat
ENVEOF
- warn ".env 파일 생성됨 — 운영 환경에서는 SECRET_KEY를 반드시 변경하세요: $ENV_FILE"
+ warn ".env 생성됨 — SECRET_KEY를 변경하세요: $ENV_FILE"
else
info ".env 파일 이미 존재 — 건너뜀"
fi
-# ── 5. DB 초기화 (스키마 불일치 자동 감지·복구) ─────────────────────────
+# ── 6. DB 초기화 (스키마 불일치 자동 감지·복구) ─────────────────────────
echo ""
-echo "[5/8] DB 초기화..."
+echo "[6/10] DB 초기화..."
cd "$GUARDIA_ROOT/itsm"
source /opt/guardia/venv/bin/activate
-# 포트 8001 기존 프로세스 종료 (업그레이드 시 충돌 방지)
if ss -tlnp 2>/dev/null | grep -q ':8001'; then
warn "포트 8001 사용 중 — 기존 프로세스 종료..."
fuser -k 8001/tcp 2>/dev/null || true
@@ -146,18 +220,17 @@ if ss -tlnp 2>/dev/null | grep -q ':8001'; then
fi
PYTHONIOENCODING=utf-8 python tools/db_init.py --force \
- && ok "DB 초기화 완료" || fail "DB 초기화 실패 — 로그를 확인하세요"
+ && ok "DB 초기화 완료" || fail "DB 초기화 실패 — 로그: $LOG_FILE"
-# ── 6. systemd 서비스 등록 ───────────────────────────────
+# ── 7. systemd 서비스 등록 ───────────────────────────────
echo ""
-echo "[6/8] systemd 서비스 등록..."
-# 기존 서비스 중지 (재설치/업그레이드)
+echo "[7/10] GUARDiA ITSM 서비스 등록..."
systemctl stop guardia-itsm 2>/dev/null || true
cat > /etc/systemd/system/guardia-itsm.service << SVCEOF
[Unit]
Description=GUARDiA ITSM Server
-After=network.target postgresql.service redis.service
+After=network.target postgresql.service redis.service tomcat9.service
[Service]
Type=exec
@@ -181,16 +254,15 @@ chown -R www-data:www-data "$GUARDIA_ROOT/itsm" 2>/dev/null || true
systemctl daemon-reload
systemctl enable guardia-itsm
systemctl start guardia-itsm
-ok "systemd 서비스 등록 완료"
+ok "GUARDiA ITSM 서비스 등록 완료"
-# ── 7. Nginx 리버스 프록시 ───────────────────────────────
+# ── 8. Nginx 리버스 프록시 ───────────────────────────────
echo ""
-echo "[7/8] Nginx 리버스 프록시 설정..."
+echo "[8/10] Nginx 리버스 프록시 설정..."
cat > /etc/nginx/sites-available/guardia << 'NGXEOF'
server {
listen 80;
server_name _;
-
client_max_body_size 100M;
location / {
@@ -208,6 +280,9 @@ server {
alias /opt/guardia/static/;
expires 1d;
}
+
+ # Tomcat 직접 노출 금지 — GUARDiA를 통해서만 접근
+ # location /tomcat/ { proxy_pass http://127.0.0.1:8080/; }
}
NGXEOF
@@ -216,29 +291,43 @@ rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx
ok "Nginx 설정 완료"
-# ── 8. 방화벽 ────────────────────────────────────────────
+# ── 9. 방화벽 ────────────────────────────────────────────
echo ""
-echo "[8/8] 방화벽 설정..."
+echo "[9/10] 방화벽 설정..."
if command -v ufw &>/dev/null; then
ufw allow 22/tcp 2>/dev/null || true
ufw allow 80/tcp 2>/dev/null || true
ufw allow 443/tcp 2>/dev/null || true
+ # 8080(Tomcat) 외부 직접 노출은 기본 차단 (Nginx 통해서만)
ufw --force enable 2>/dev/null || true
- ok "UFW 방화벽 설정 완료"
+ ok "UFW 방화벽 설정 완료 (22/80/443 허용, 8080 내부 전용)"
fi
+# ── 10. 최종 상태 확인 ───────────────────────────────────
+echo ""
+echo "[10/10] 서비스 상태 확인..."
+for svc in tomcat9 guardia-itsm nginx postgresql redis-server; do
+ if systemctl is-active "$svc" &>/dev/null; then
+ ok "$svc 실행 중"
+ else
+ warn "$svc 미실행 — 수동 확인 필요: systemctl status $svc"
+ fi
+done
+
echo ""
echo "=================================================="
ok "GUARDiA ITSM 설치 완료!"
echo ""
-info "접속 URL: http://$(hostname -I | awk '{print $1}')"
-info "설치 로그: $LOG_FILE"
-info "서비스 상태: systemctl status guardia-itsm"
+info "GUARDiA URL: http://$(hostname -I | awk '{print $1}')"
+info "Tomcat URL: http://$(hostname -I | awk '{print $1}'):8080 (내부 전용)"
+info "설치 로그: $LOG_FILE"
+info "서비스 상태: systemctl status guardia-itsm tomcat9"
echo ""
warn "보안 필수 조치:"
warn " 1. $ENV_FILE 의 SECRET_KEY 변경"
warn " 2. PostgreSQL 비밀번호 변경"
-warn " 3. HTTPS(Let's Encrypt) 설정 권장"
+warn " 3. Tomcat opsagent 비밀번호 변경 (${TOMCAT_CONF}/tomcat-users.xml)"
+warn " 4. HTTPS(Let's Encrypt) 설정 권장"
echo ""
info "설치 검증: sudo bash $0 --test"
echo "=================================================="
diff --git a/setup/setup_windows.ps1 b/setup/setup_windows.ps1
index e8251d68..bb9a166f 100644
--- a/setup/setup_windows.ps1
+++ b/setup/setup_windows.ps1
@@ -45,6 +45,9 @@ if ($Test) {
Check-Item "Python 3.11+" { python --version 2>&1 | Select-String "3\.(1[1-9]|[2-9]\d)" }
Check-Item "PostgreSQL 응답" { pg_isready -q }
Check-Item "Redis 응답" { redis-cli ping }
+ Check-Item "Java 17 (OpenJDK)" { java -version 2>$null }
+ Check-Item "Tomcat 9 서비스" { $s = Get-Service "tomcat9" -ErrorAction Stop; if ($s.Status -ne "Running") { throw "" } }
+ Check-Item "Tomcat HTTP" { $r = Invoke-WebRequest "http://localhost:8080/" -UseBasicParsing -TimeoutSec 5; if ($r.StatusCode -ne 200) { throw "" } }
Check-Item "NSSM 서비스 등록" { Get-Service "guardia-itsm" -ErrorAction Stop }
Check-Item "GUARDiA 서비스 실행" {
$s = Get-Service "guardia-itsm"
@@ -97,10 +100,11 @@ Write-OK "Chocolatey 준비 완료"
# ── 1. 필수 패키지 설치 ──────────────────────────────────────
Write-Host ""
-Write-Host "[2/8] 필수 패키지 설치 (Python, PostgreSQL, Redis, Nginx, NSSM)..."
+Write-Host "[2/10] 필수 패키지 설치 (Python, Java, PostgreSQL, Redis, Nginx, NSSM)..."
$packages = @(
"python --version=3.11.9",
+ "openjdk --version=17.0.11",
"postgresql",
"redis-64",
"nginx-winssl",
@@ -116,11 +120,84 @@ foreach ($pkg in $packages) {
# PATH 갱신
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
+
+# JAVA_HOME 설정
+$javaHome = (Get-ChildItem "C:\Program Files\Eclipse Adoptium" -ErrorAction SilentlyContinue | Sort-Object Name -Descending | Select-Object -First 1)?.FullName
+if (-not $javaHome) {
+ $javaHome = (Get-ChildItem "C:\Program Files\Java" -Filter "jdk*17*" -ErrorAction SilentlyContinue | Select-Object -First 1)?.FullName
+}
+if (-not $javaHome) {
+ $javaHome = (Get-Command java -ErrorAction SilentlyContinue)?.Source | Split-Path | Split-Path
+}
+if ($javaHome) {
+ [System.Environment]::SetEnvironmentVariable("JAVA_HOME", $javaHome, "Machine")
+ $env:JAVA_HOME = $javaHome
+ Write-OK "OpenJDK 17 설치 완료 (JAVA_HOME=$javaHome)"
+} else {
+ Write-Warn "JAVA_HOME을 찾을 수 없음 — 수동 설정 필요"
+}
Write-OK "필수 패키지 설치 완료"
-# ── 2. Python 가상환경 ──────────────────────────────────────
+# ── 2. Tomcat 9 설치 ────────────────────────────────────────
Write-Host ""
-Write-Host "[3/8] Python 가상환경 설정..."
+Write-Host "[3/10] Tomcat 9 설치..."
+
+$TomcatVer = if ($env:TOMCAT_VER) { $env:TOMCAT_VER } else { "9.0.98" }
+$TomcatHome = "C:\app\tomcat"
+$TomcatMirror = if ($env:TOMCAT_MIRROR) { $env:TOMCAT_MIRROR } else {
+ "https://archive.apache.org/dist/tomcat/tomcat-9/v$TomcatVer/bin"
+}
+
+if (-not (Test-Path "$TomcatHome\bin\startup.bat")) {
+ $tarName = "apache-tomcat-$TomcatVer.zip"
+ $tarUrl = "$TomcatMirror/$tarName"
+ Write-Host " 다운로드: $tarUrl"
+ try {
+ Invoke-WebRequest $tarUrl -OutFile "$env:TEMP\$tarName" -TimeoutSec 120 -UseBasicParsing
+ Expand-Archive "$env:TEMP\$tarName" -DestinationPath "C:\app" -Force
+ Rename-Item "C:\app\apache-tomcat-$TomcatVer" $TomcatHome -ErrorAction SilentlyContinue
+ if (-not (Test-Path $TomcatHome)) {
+ Move-Item "C:\app\apache-tomcat-$TomcatVer" $TomcatHome
+ }
+ } catch {
+ Write-Warn "Tomcat 다운로드 실패: $_"
+ Write-Warn "TOMCAT_MIRROR 환경변수를 내부 미러로 설정하거나 수동 설치하세요."
+ }
+} else {
+ Write-Host " Tomcat이 이미 설치되어 있음: $TomcatHome"
+}
+
+# opsagent 계정 추가 (GUARDiA Manager 원격 제어용)
+$TomcatUsersXml = "$TomcatHome\conf\tomcat-users.xml"
+if ((Test-Path $TomcatUsersXml) -and -not (Select-String "opsagent" $TomcatUsersXml -Quiet)) {
+ (Get-Content $TomcatUsersXml) -replace '', @"
+
+
+
+
+"@ | Set-Content $TomcatUsersXml -Encoding utf8
+}
+
+# NSSM으로 Tomcat 9 Windows 서비스 등록
+$tcSvc = "tomcat9"
+try { nssm stop $tcSvc 2>$null; nssm remove $tcSvc confirm 2>$null } catch {}
+nssm install $tcSvc "$TomcatHome\bin\tomcat9.exe" 2>$null
+if ($LASTEXITCODE -ne 0) {
+ # tomcat9.exe 없으면 startup.bat 방식
+ nssm install $tcSvc "cmd"
+ nssm set $tcSvc AppParameters "/c $TomcatHome\bin\startup.bat"
+}
+nssm set $tcSvc AppDirectory $TomcatHome
+nssm set $tcSvc AppEnvironmentExtra "JAVA_HOME=$env:JAVA_HOME CATALINA_HOME=$TomcatHome"
+nssm set $tcSvc Start SERVICE_AUTO_START
+nssm set $tcSvc AppStdout "C:\guardia\logs\tomcat9.log"
+New-Item -ItemType Directory -Force "C:\guardia\logs" | Out-Null
+nssm start $tcSvc
+Write-OK "Tomcat 9 서비스 등록 완료 (포트 8080)"
+
+# ── 2(b). Python 가상환경 ──────────────────────────────────────
+Write-Host ""
+Write-Host "[4/10] Python 가상환경 설정..."
$venvPath = "C:\guardia\venv"
if (-not (Test-Path $venvPath)) {
python -m venv $venvPath
@@ -146,7 +223,7 @@ Write-OK "PostgreSQL 설정 완료"
# ── 4. Redis 서비스 등록 ────────────────────────────────────
Write-Host ""
-Write-Host "[5/8] Redis 서비스 등록..."
+Write-Host "[5/10] Redis 서비스 등록..."
$redisExe = (Get-Command redis-server -ErrorAction SilentlyContinue)?.Source
if ($redisExe) {
nssm install redis-server $redisExe 2>$null
@@ -156,7 +233,7 @@ Write-OK "Redis 완료"
# ── 5. 환경 설정 파일 ───────────────────────────────────────
Write-Host ""
-Write-Host "[6/8] 환경 설정 파일 생성..."
+Write-Host "[6/10] 환경 설정 파일 생성..."
$envFile = "$GuardiaRoot\itsm\.env"
if (-not (Test-Path $envFile)) {
@"
@@ -175,7 +252,7 @@ MESSENGER_OPS_ROOM=ops
# ── 6. DB 초기화 (스키마 불일치 자동 감지·복구) ────────────────────────
Write-Host ""
-Write-Host "[7/8] DB 초기화..."
+Write-Host "[7/10] DB 초기화..."
# 포트 8001 기존 프로세스 종료 (업그레이드 시 충돌 방지)
$portProc = Get-NetTCPConnection -LocalPort 8001 -State Listen -ErrorAction SilentlyContinue | Select-Object -First 1
@@ -198,7 +275,7 @@ Write-OK "DB 초기화 완료"
# ── 7. NSSM Windows 서비스 등록 ─────────────────────────────
Write-Host ""
-Write-Host "[8/8] Windows 서비스 등록 (NSSM)..."
+Write-Host "[8/10] Windows 서비스 등록 (NSSM)..."
$uvicorn = "$venvPath\Scripts\uvicorn.exe"
$svcName = "guardia-itsm"