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"