feat(setup): OpenJDK 17 + Tomcat 9 설치 추가 (전체 4개 OS + 대상서버)

- setup_ubuntu.sh: OpenJDK 17 + Tomcat 9 단계 추가 (10단계로 확장)
- setup_centos.sh: OpenJDK 17 + Tomcat 9 단계 추가 (10단계)
- setup_rhel.sh: OpenJDK 17 + Tomcat 9 + SELinux 포트 허용 (11단계)
- setup_windows.ps1: openjdk choco 설치 + Tomcat 9 NSSM 서비스 (10단계)
- setup_target_server.sh: 신규 — 관리 대상 WAS 서버 표준 구성
  (OpenJDK 17 + Tomcat 9 + opsagent OS/Tomcat 계정 + SSH 보안 + GUARDiA 연결정보 출력)
- --test 검증: Java/Tomcat 항목 추가
- 공통: AJP 비활성화, shutdown 포트 -1 보안설정, opsagent Manager 계정 자동 추가
- 공통: TOMCAT_MIRROR 환경변수로 오프라인/내부망 설치 지원

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
DESKTOP-TKLFCPR\ython 2026-05-29 18:51:36 +09:00
parent 09ea775a18
commit e0fc925df9
5 changed files with 708 additions and 140 deletions

View File

@ -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|</tomcat-users>| <role rolename="manager-script"/>\n <role rolename="manager-jmx"/>\n <user username="opsagent" password="Opsagent@guardia!" roles="manager-script,manager-jmx"/>\n</tomcat-users>|' "$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 "=================================================="

View File

@ -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|</tomcat-users>| <role rolename="manager-script"/>\n <role rolename="manager-jmx"/>\n <user username="opsagent" password="Opsagent@guardia!" roles="manager-script,manager-jmx"/>\n</tomcat-users>|' "$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;

View File

@ -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|</tomcat-users>| <role rolename=\"manager-script\"/>\n <role rolename=\"manager-jmx\"/>\n <role rolename=\"manager-gui\"/>\n <user username=\"opsagent\" password=\"$OPS_PW\" roles=\"manager-script,manager-jmx,manager-gui\"/>\n</tomcat-users>|" "$USERS_XML"
fi
# ── Tomcat server.xml 보안 설정 ──────────────────────────────
SERVER_XML="$TOMCAT_HOME/conf/server.xml"
if [[ -f "$SERVER_XML" ]]; then
# AJP 커넥터 비활성화 (보안)
sed -i 's|<Connector protocol="AJP|<!-- <Connector protocol="AJP|' "$SERVER_XML"
sed -i 's|redirectPort="8443" />|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 "=================================================="

View File

@ -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|</tomcat-users>| <role rolename="manager-script"/>\n <role rolename="manager-jmx"/>\n <user username="opsagent" password="Opsagent@guardia!" roles="manager-script,manager-jmx"/>\n</tomcat-users>|' "$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 "=================================================="

View File

@ -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 '</tomcat-users>', @"
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<user username="opsagent" password="Opsagent@guardia!" roles="manager-script,manager-jmx"/>
</tomcat-users>
"@ | 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"