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:
parent
09ea775a18
commit
e0fc925df9
@ -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 "=================================================="
|
||||
|
||||
@ -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;
|
||||
|
||||
253
setup/setup_target_server.sh
Normal file
253
setup/setup_target_server.sh
Normal 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 "=================================================="
|
||||
@ -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 "=================================================="
|
||||
|
||||
@ -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"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user