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 (최소 설치)
|
# 전제조건: 순수 CentOS OS (최소 설치)
|
||||||
# 실행 방법: sudo bash setup_centos.sh
|
# 실행 방법: sudo bash setup_centos.sh
|
||||||
# 설치 테스트: bash setup_centos.sh --test
|
# 설치 테스트: bash setup_centos.sh --test
|
||||||
|
# 환경변수:
|
||||||
|
# TOMCAT_VER=9.0.98 : Tomcat 버전
|
||||||
|
# TOMCAT_MIRROR=http:// : 내부 미러 URL (오프라인 환경)
|
||||||
# =============================================================
|
# =============================================================
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
@ -28,11 +31,13 @@ echo "=================================================="
|
|||||||
|
|
||||||
[[ $EUID -eq 0 ]] || fail "root 권한으로 실행하세요: sudo bash $0"
|
[[ $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
|
if [[ "$TEST_MODE" == "--test" ]]; then
|
||||||
echo "=== 설치 검증 모드 ==="
|
echo "=== 설치 검증 모드 ==="
|
||||||
PASS=0; FAIL=0
|
PASS=0; FAIL=0
|
||||||
|
|
||||||
check() {
|
check() {
|
||||||
local desc="$1"; shift
|
local desc="$1"; shift
|
||||||
if "$@" &>/dev/null; then
|
if "$@" &>/dev/null; then
|
||||||
@ -42,12 +47,18 @@ if [[ "$TEST_MODE" == "--test" ]]; then
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
check "Python 3.11+" python3.11 --version
|
check "Java 17 (OpenJDK)" java -version
|
||||||
check "PostgreSQL" pg_isready -q
|
check "Python 3.11+" python3.11 --version
|
||||||
check "Redis" redis-cli ping
|
check "PostgreSQL" pg_isready -q
|
||||||
check "GUARDiA 포트" bash -c 'curl -sf http://localhost:8001/api/dashboard/overview -o /dev/null'
|
check "Redis" redis-cli ping
|
||||||
check "Nginx" nginx -t
|
check "Tomcat 9 서비스" systemctl is-active tomcat9
|
||||||
check "systemd" systemctl is-active guardia-itsm
|
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 ""
|
||||||
echo "검증 결과: 성공 $PASS / 실패 $FAIL"
|
echo "검증 결과: 성공 $PASS / 실패 $FAIL"
|
||||||
@ -55,40 +66,102 @@ if [[ "$TEST_MODE" == "--test" ]]; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── OS 버전 감지 ──────────────────────────────────────────
|
# ── 1. 시스템 패키지 ─────────────────────────────────────────
|
||||||
OS_VER=$(rpm -E %{rhel} 2>/dev/null || echo "7")
|
|
||||||
echo "감지된 RHEL/CentOS 버전: $OS_VER"
|
|
||||||
|
|
||||||
# ── 1. 시스템 패키지 ────────────────────────────────────────
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "[1/8] 시스템 패키지 설치..."
|
echo "[1/10] 시스템 패키지 설치..."
|
||||||
|
|
||||||
# EPEL 저장소
|
|
||||||
yum install -y epel-release 2>/dev/null || dnf install -y epel-release 2>/dev/null || true
|
yum install -y epel-release 2>/dev/null || dnf install -y epel-release 2>/dev/null || true
|
||||||
|
|
||||||
if [[ "$OS_VER" -ge 8 ]]; then
|
if [[ "$OS_VER" -ge 8 ]]; then
|
||||||
# CentOS Stream 8/9
|
|
||||||
dnf install -y \
|
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 \
|
python3.11 python3.11-devel python3-pip \
|
||||||
|
java-17-openjdk java-17-openjdk-devel \
|
||||||
postgresql-server postgresql-contrib \
|
postgresql-server postgresql-contrib \
|
||||||
redis nginx supervisor \
|
redis nginx lsof unzip jq
|
||||||
unzip jq
|
|
||||||
else
|
else
|
||||||
# CentOS 7
|
|
||||||
yum install -y centos-release-scl 2>/dev/null || true
|
yum install -y centos-release-scl 2>/dev/null || true
|
||||||
yum install -y \
|
yum install -y \
|
||||||
curl wget git gcc openssl-devel libffi-devel \
|
curl wget git gcc openssl-devel libffi-devel \
|
||||||
rh-python38 \
|
rh-python38 \
|
||||||
|
java-17-openjdk java-17-openjdk-devel \
|
||||||
postgresql-server postgresql-contrib \
|
postgresql-server postgresql-contrib \
|
||||||
redis nginx supervisor \
|
redis nginx lsof unzip jq
|
||||||
unzip jq
|
|
||||||
fi
|
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 ""
|
||||||
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)
|
PYTHON_BIN=$(command -v python3.11 || command -v python3.8 || command -v python3)
|
||||||
mkdir -p /opt/guardia
|
mkdir -p /opt/guardia
|
||||||
$PYTHON_BIN -m venv /opt/guardia/venv
|
$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
|
pip install -r "$GUARDIA_ROOT/itsm/requirements.txt" -q
|
||||||
ok "Python 패키지 설치 완료"
|
ok "Python 패키지 설치 완료"
|
||||||
|
|
||||||
# ── 3. PostgreSQL 초기화 ────────────────────────────────────
|
# ── 4. PostgreSQL 초기화 ────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[3/8] PostgreSQL 초기화..."
|
echo "[4/10] PostgreSQL 초기화..."
|
||||||
if [[ "$OS_VER" -ge 8 ]]; then
|
if [[ "$OS_VER" -ge 8 ]]; then
|
||||||
postgresql-setup --initdb 2>/dev/null || true
|
postgresql-setup --initdb 2>/dev/null || true
|
||||||
else
|
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;"
|
sudo -u postgres psql -c "CREATE DATABASE guardia OWNER guardia;"
|
||||||
ok "PostgreSQL 설정 완료"
|
ok "PostgreSQL 설정 완료"
|
||||||
|
|
||||||
# ── 4. Redis 시작 ───────────────────────────────────────────
|
# ── 5. Redis ────────────────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[4/8] Redis 시작..."
|
echo "[5/10] Redis 시작..."
|
||||||
systemctl start redis
|
systemctl start redis
|
||||||
systemctl enable redis
|
systemctl enable redis
|
||||||
ok "Redis 시작 완료"
|
ok "Redis 완료"
|
||||||
|
|
||||||
# ── 5. 환경 설정 파일 ───────────────────────────────────────
|
# ── 6. 환경 파일 ────────────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[5/8] 환경 설정 파일..."
|
echo "[6/10] 환경 설정 파일..."
|
||||||
ENV_FILE="$GUARDIA_ROOT/itsm/.env"
|
ENV_FILE="$GUARDIA_ROOT/itsm/.env"
|
||||||
if [[ ! -f "$ENV_FILE" ]]; then
|
if [[ ! -f "$ENV_FILE" ]]; then
|
||||||
cat > "$ENV_FILE" << 'ENVEOF'
|
cat > "$ENV_FILE" << 'ENVEOF'
|
||||||
@ -136,33 +209,34 @@ OLLAMA_BASE_URL=http://localhost:11434
|
|||||||
GUARDIA_LLM_MODEL=llama3.1:8b
|
GUARDIA_LLM_MODEL=llama3.1:8b
|
||||||
MESSENGER_BASE_URL=http://localhost:8002
|
MESSENGER_BASE_URL=http://localhost:8002
|
||||||
MESSENGER_OPS_ROOM=ops
|
MESSENGER_OPS_ROOM=ops
|
||||||
|
CATALINA_HOME=/app/tomcat
|
||||||
ENVEOF
|
ENVEOF
|
||||||
warn ".env 생성됨 — SECRET_KEY를 변경하세요"
|
warn ".env 생성됨 — SECRET_KEY 필수 변경"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── 6. DB 초기화 (스키마 불일치 자동 감지·복구) ─────────────────────────
|
# ── 7. DB 초기화 ─────────────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[6/8] DB 초기화..."
|
echo "[7/10] DB 초기화..."
|
||||||
cd "$GUARDIA_ROOT/itsm"
|
cd "$GUARDIA_ROOT/itsm"
|
||||||
source /opt/guardia/venv/bin/activate
|
source /opt/guardia/venv/bin/activate
|
||||||
|
|
||||||
if ss -tlnp 2>/dev/null | grep -q ':8001'; then
|
if ss -tlnp 2>/dev/null | grep -q ':8001'; then
|
||||||
warn "포트 8001 사용 중 — 기존 프로세스 종료..."
|
warn "포트 8001 사용 중 — 종료..."
|
||||||
fuser -k 8001/tcp 2>/dev/null || true; sleep 2
|
fuser -k 8001/tcp 2>/dev/null || true; sleep 2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PYTHONIOENCODING=utf-8 python tools/db_init.py --force \
|
PYTHONIOENCODING=utf-8 python tools/db_init.py --force \
|
||||||
&& ok "DB 초기화 완료" || fail "DB 초기화 실패"
|
&& ok "DB 초기화 완료" || fail "DB 초기화 실패"
|
||||||
|
|
||||||
# ── 7. systemd 서비스 ───────────────────────────────────────
|
# ── 8. systemd 서비스 ────────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[7/8] systemd 서비스..."
|
echo "[8/10] GUARDiA ITSM 서비스..."
|
||||||
systemctl stop guardia-itsm 2>/dev/null || true
|
systemctl stop guardia-itsm 2>/dev/null || true
|
||||||
|
|
||||||
cat > /etc/systemd/system/guardia-itsm.service << SVCEOF
|
cat > /etc/systemd/system/guardia-itsm.service << SVCEOF
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=GUARDiA ITSM Server
|
Description=GUARDiA ITSM Server
|
||||||
After=network.target postgresql.service redis.service
|
After=network.target postgresql.service redis.service tomcat9.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=exec
|
Type=exec
|
||||||
@ -183,11 +257,11 @@ SVCEOF
|
|||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl enable guardia-itsm
|
systemctl enable guardia-itsm
|
||||||
systemctl start guardia-itsm
|
systemctl start guardia-itsm
|
||||||
ok "systemd 서비스 등록 완료"
|
ok "GUARDiA ITSM 서비스 완료"
|
||||||
|
|
||||||
# ── 8. Nginx ────────────────────────────────────────────────
|
# ── 9. Nginx ─────────────────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[8/8] Nginx 설정..."
|
echo "[9/10] Nginx..."
|
||||||
cat > /etc/nginx/conf.d/guardia.conf << 'NGXEOF'
|
cat > /etc/nginx/conf.d/guardia.conf << 'NGXEOF'
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
@ -206,26 +280,27 @@ server {
|
|||||||
}
|
}
|
||||||
NGXEOF
|
NGXEOF
|
||||||
|
|
||||||
# SELinux 허용 (CentOS)
|
|
||||||
setsebool -P httpd_can_network_connect 1 2>/dev/null || true
|
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
|
if systemctl is-active firewalld &>/dev/null; then
|
||||||
firewall-cmd --permanent --add-service=http
|
firewall-cmd --permanent --add-service=http
|
||||||
firewall-cmd --permanent --add-service=https
|
firewall-cmd --permanent --add-service=https
|
||||||
firewall-cmd --reload
|
firewall-cmd --reload
|
||||||
ok "방화벽 설정 완료"
|
|
||||||
fi
|
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 ""
|
||||||
echo "=================================================="
|
echo "=================================================="
|
||||||
ok "GUARDiA ITSM 설치 완료 — CentOS"
|
ok "GUARDiA ITSM 설치 완료 — CentOS"
|
||||||
echo ""
|
info "GUARDiA URL: http://$(hostname -I | awk '{print $1}')"
|
||||||
info "접속 URL: http://$(hostname -I | awk '{print $1}')"
|
info "Tomcat URL: http://$(hostname -I | awk '{print $1}'):8080 (내부 전용)"
|
||||||
info "설치 로그: $LOG_FILE"
|
|
||||||
info "검증: sudo bash $0 --test"
|
info "검증: sudo bash $0 --test"
|
||||||
echo "=================================================="
|
echo "=================================================="
|
||||||
|
|||||||
@ -42,13 +42,19 @@ if [[ "$TEST_MODE" == "--test" ]]; then
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
check "Python 3.11+" python3.11 --version
|
check "Java 17 (OpenJDK)" java -version
|
||||||
check "PostgreSQL" pg_isready -q
|
check "Python 3.11+" python3.11 --version
|
||||||
check "Redis" redis-cli ping
|
check "PostgreSQL" pg_isready -q
|
||||||
check "GUARDiA 포트" bash -c 'curl -sf http://localhost:8001/api/dashboard/overview -o /dev/null'
|
check "Redis" redis-cli ping
|
||||||
check "Nginx" nginx -t
|
check "Tomcat 9 서비스" systemctl is-active tomcat9
|
||||||
check "systemd" systemctl is-active guardia-itsm
|
check "Tomcat HTTP" bash -c 'curl -sf http://localhost:8080/ -o /dev/null'
|
||||||
check "SELinux 정책" bash -c 'getsebool httpd_can_network_connect | grep -q on'
|
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 ""
|
||||||
echo "검증 결과: 성공 $PASS / 실패 $FAIL"
|
echo "검증 결과: 성공 $PASS / 실패 $FAIL"
|
||||||
@ -72,20 +78,88 @@ ok "저장소 설정 완료"
|
|||||||
|
|
||||||
# ── 2. 패키지 설치 ──────────────────────────────────────────
|
# ── 2. 패키지 설치 ──────────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[2/9] 시스템 패키지 설치..."
|
echo "[2/11] 시스템 패키지 설치..."
|
||||||
dnf install -y \
|
dnf install -y \
|
||||||
curl wget git gcc make openssl-devel libffi-devel \
|
curl wget git gcc make openssl-devel libffi-devel \
|
||||||
python3.11 python3.11-devel python3-pip \
|
python3.11 python3.11-devel python3-pip \
|
||||||
|
java-17-openjdk java-17-openjdk-devel \
|
||||||
postgresql-server postgresql-contrib \
|
postgresql-server postgresql-contrib \
|
||||||
redis \
|
redis nginx lsof unzip jq
|
||||||
nginx \
|
|
||||||
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 ""
|
||||||
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
|
mkdir -p /opt/guardia
|
||||||
python3.11 -m venv /opt/guardia/venv
|
python3.11 -m venv /opt/guardia/venv
|
||||||
source /opt/guardia/venv/bin/activate
|
source /opt/guardia/venv/bin/activate
|
||||||
@ -95,7 +169,7 @@ ok "Python 환경 준비 완료"
|
|||||||
|
|
||||||
# ── 4. PostgreSQL 초기화 ────────────────────────────────────
|
# ── 4. PostgreSQL 초기화 ────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[4/9] PostgreSQL 설정..."
|
echo "[5/11] PostgreSQL 설정..."
|
||||||
postgresql-setup --initdb 2>/dev/null || true
|
postgresql-setup --initdb 2>/dev/null || true
|
||||||
systemctl start postgresql
|
systemctl start postgresql
|
||||||
systemctl enable postgresql
|
systemctl enable postgresql
|
||||||
@ -115,14 +189,14 @@ ok "PostgreSQL 설정 완료"
|
|||||||
|
|
||||||
# ── 5. Redis ────────────────────────────────────────────────
|
# ── 5. Redis ────────────────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[5/9] Redis 시작..."
|
echo "[6/11] Redis 시작..."
|
||||||
systemctl start redis
|
systemctl start redis
|
||||||
systemctl enable redis
|
systemctl enable redis
|
||||||
ok "Redis 완료"
|
ok "Redis 완료"
|
||||||
|
|
||||||
# ── 6. 환경 파일 ────────────────────────────────────────────
|
# ── 6. 환경 파일 ────────────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[6/9] 환경 설정 파일..."
|
echo "[7/11] 환경 설정 파일..."
|
||||||
ENV_FILE="$GUARDIA_ROOT/itsm/.env"
|
ENV_FILE="$GUARDIA_ROOT/itsm/.env"
|
||||||
if [[ ! -f "$ENV_FILE" ]]; then
|
if [[ ! -f "$ENV_FILE" ]]; then
|
||||||
cat > "$ENV_FILE" << 'ENVEOF'
|
cat > "$ENV_FILE" << 'ENVEOF'
|
||||||
@ -141,7 +215,7 @@ fi
|
|||||||
|
|
||||||
# ── 7. DB 초기화 (스키마 불일치 자동 감지·복구) ─────────────────────────
|
# ── 7. DB 초기화 (스키마 불일치 자동 감지·복구) ─────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[7/9] DB 초기화..."
|
echo "[8/11] DB 초기화..."
|
||||||
cd "$GUARDIA_ROOT/itsm"
|
cd "$GUARDIA_ROOT/itsm"
|
||||||
source /opt/guardia/venv/bin/activate
|
source /opt/guardia/venv/bin/activate
|
||||||
|
|
||||||
@ -155,7 +229,7 @@ PYTHONIOENCODING=utf-8 python tools/db_init.py --force \
|
|||||||
|
|
||||||
# ── 8. systemd ──────────────────────────────────────────────
|
# ── 8. systemd ──────────────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[8/9] systemd 서비스..."
|
echo "[9/11] systemd 서비스..."
|
||||||
systemctl stop guardia-itsm 2>/dev/null || true
|
systemctl stop guardia-itsm 2>/dev/null || true
|
||||||
|
|
||||||
cat > /etc/systemd/system/guardia-itsm.service << SVCEOF
|
cat > /etc/systemd/system/guardia-itsm.service << SVCEOF
|
||||||
@ -186,7 +260,7 @@ ok "systemd 서비스 완료"
|
|||||||
|
|
||||||
# ── 9. Nginx + SELinux ──────────────────────────────────────
|
# ── 9. Nginx + SELinux ──────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[9/9] Nginx + SELinux 설정..."
|
echo "[10/11] Nginx + SELinux 설정..."
|
||||||
cat > /etc/nginx/conf.d/guardia.conf << 'NGXEOF'
|
cat > /etc/nginx/conf.d/guardia.conf << 'NGXEOF'
|
||||||
server {
|
server {
|
||||||
listen 80;
|
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 (최소 설치)
|
# 전제조건: 순수 Ubuntu OS (최소 설치)
|
||||||
# 실행 방법: sudo bash setup_ubuntu.sh
|
# 실행 방법: sudo bash setup_ubuntu.sh
|
||||||
# 설치 테스트: bash setup_ubuntu.sh --test
|
# 설치 테스트: bash setup_ubuntu.sh --test
|
||||||
|
# 환경변수 (오프라인 환경):
|
||||||
|
# TOMCAT_VER=9.0.98 : Tomcat 버전 (기본 9.0.98)
|
||||||
|
# TOMCAT_MIRROR=http:// : 내부 미러 URL (기본 apache.org)
|
||||||
# =============================================================
|
# =============================================================
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
@ -13,7 +16,6 @@ GUARDIA_ROOT="$(dirname "$SCRIPT_DIR")"
|
|||||||
LOG_FILE="/var/log/guardia_install.log"
|
LOG_FILE="/var/log/guardia_install.log"
|
||||||
TEST_MODE="${1:-}"
|
TEST_MODE="${1:-}"
|
||||||
|
|
||||||
# ── 색상 출력 ────────────────────────────────────────────────
|
|
||||||
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
||||||
ok() { echo -e "${GREEN}[OK]${NC} $*"; }
|
ok() { echo -e "${GREEN}[OK]${NC} $*"; }
|
||||||
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
||||||
@ -27,7 +29,6 @@ echo " GUARDiA ITSM 설치 — Ubuntu"
|
|||||||
echo " 시작: $(date)"
|
echo " 시작: $(date)"
|
||||||
echo "=================================================="
|
echo "=================================================="
|
||||||
|
|
||||||
# ── root 권한 확인 ───────────────────────────────────────────
|
|
||||||
[[ $EUID -eq 0 ]] || fail "root 권한으로 실행하세요: sudo bash $0"
|
[[ $EUID -eq 0 ]] || fail "root 권한으로 실행하세요: sudo bash $0"
|
||||||
|
|
||||||
# ── 테스트 모드 ──────────────────────────────────────────────
|
# ── 테스트 모드 ──────────────────────────────────────────────
|
||||||
@ -40,105 +41,178 @@ if [[ "$TEST_MODE" == "--test" ]]; then
|
|||||||
if "$@" &>/dev/null; then
|
if "$@" &>/dev/null; then
|
||||||
ok "$desc"; ((PASS++))
|
ok "$desc"; ((PASS++))
|
||||||
else
|
else
|
||||||
fail_cnt "$desc"; ((FAIL++))
|
echo -e "${RED}[FAIL]${NC} $desc"; ((FAIL++))
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
fail_cnt() { echo -e "${RED}[FAIL]${NC} $*"; }
|
|
||||||
|
|
||||||
check "Python 3.11+" python3.11 --version
|
check "Java 17 (OpenJDK)" java -version
|
||||||
check "pip 설치" python3.11 -m pip --version
|
check "Python 3.11+" python3.11 --version
|
||||||
check "PostgreSQL" pg_isready -q
|
check "PostgreSQL" pg_isready -q
|
||||||
check "Redis" redis-cli ping
|
check "Redis" redis-cli ping
|
||||||
check "GUARDiA 서버 기동" systemctl is-active guardia-itsm
|
check "Tomcat 9 서비스" systemctl is-active tomcat9
|
||||||
check "GUARDiA HTTP 응답" bash -c 'curl -sf http://localhost:8001/ -o /dev/null'
|
check "Tomcat HTTP" bash -c 'curl -sf http://localhost:8080/ -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 "GUARDiA 서비스" systemctl is-active guardia-itsm
|
||||||
check "Nginx 설정" nginx -t
|
check "GUARDiA HTTP" bash -c 'curl -sf http://localhost:8001/ -o /dev/null'
|
||||||
check "Python UTF-8 인코딩" bash -c 'PYTHONIOENCODING=utf-8 python3.11 -c "print(\"OK\")" > /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 ""
|
||||||
echo "검증 결과: 성공 $PASS / 실패 $FAIL"
|
echo "검증 결과: 성공 $PASS / 실패 $FAIL"
|
||||||
[[ $FAIL -eq 0 ]] && ok "모든 검사 통과 — GUARDiA ITSM 정상 설치됨" || fail "일부 검사 실패 — 로그를 확인하세요: $LOG_FILE"
|
[[ $FAIL -eq 0 ]] && ok "모든 검사 통과 — GUARDiA ITSM 정상 설치됨" \
|
||||||
|
|| fail "일부 검사 실패 — 로그: $LOG_FILE"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── 1. 시스템 패키지 업데이트 ────────────────────────────────
|
# ── 1. 시스템 패키지 업데이트 ────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[1/8] 시스템 패키지 업데이트..."
|
echo "[1/10] 시스템 패키지 업데이트..."
|
||||||
apt-get update -qq
|
apt-get update -qq
|
||||||
apt-get install -y -qq \
|
apt-get install -y -qq \
|
||||||
curl wget git build-essential libssl-dev libffi-dev \
|
curl wget git build-essential libssl-dev libffi-dev \
|
||||||
python3.11 python3.11-venv python3.11-dev python3-pip \
|
python3.11 python3.11-venv python3.11-dev python3-pip \
|
||||||
|
openjdk-17-jdk \
|
||||||
postgresql postgresql-contrib \
|
postgresql postgresql-contrib \
|
||||||
redis-server \
|
redis-server nginx supervisor \
|
||||||
nginx \
|
unzip jq lsof
|
||||||
supervisor \
|
|
||||||
unzip jq
|
|
||||||
ok "시스템 패키지 설치 완료"
|
|
||||||
|
|
||||||
# ── 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 ""
|
||||||
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
|
python3.11 -m venv /opt/guardia/venv
|
||||||
source /opt/guardia/venv/bin/activate
|
source /opt/guardia/venv/bin/activate
|
||||||
pip install --upgrade pip -q
|
pip install --upgrade pip -q
|
||||||
pip install -r "$GUARDIA_ROOT/itsm/requirements.txt" -q
|
pip install -r "$GUARDIA_ROOT/itsm/requirements.txt" -q
|
||||||
ok "Python 패키지 설치 완료"
|
ok "Python 패키지 설치 완료"
|
||||||
|
|
||||||
# ── 3. PostgreSQL 설정 ─────────────────────────────────────
|
# ── 4. PostgreSQL 설정 ─────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[3/8] PostgreSQL 설정..."
|
echo "[4/10] PostgreSQL 설정..."
|
||||||
systemctl start postgresql
|
systemctl start postgresql
|
||||||
systemctl enable 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 -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 -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 -tc "SELECT 1 FROM pg_database WHERE datname='guardia'" | grep -q 1 || \
|
||||||
sudo -u postgres psql -c "CREATE DATABASE guardia OWNER guardia;"
|
sudo -u postgres psql -c "CREATE DATABASE guardia OWNER guardia;"
|
||||||
ok "PostgreSQL 설정 완료"
|
ok "PostgreSQL 설정 완료"
|
||||||
|
|
||||||
# ── 4. 환경 설정 파일 ─────────────────────────────────────
|
# ── 5. 환경 설정 파일 ─────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[4/8] 환경 설정 파일 생성..."
|
echo "[5/10] 환경 설정 파일 생성..."
|
||||||
ENV_FILE="$GUARDIA_ROOT/itsm/.env"
|
ENV_FILE="$GUARDIA_ROOT/itsm/.env"
|
||||||
if [[ ! -f "$ENV_FILE" ]]; then
|
if [[ ! -f "$ENV_FILE" ]]; then
|
||||||
cat > "$ENV_FILE" << 'ENVEOF'
|
cat > "$ENV_FILE" << 'ENVEOF'
|
||||||
# GUARDiA ITSM 환경 설정
|
|
||||||
DATABASE_URL=postgresql+asyncpg://guardia:guardia_secure_pw@localhost:5432/guardia
|
DATABASE_URL=postgresql+asyncpg://guardia:guardia_secure_pw@localhost:5432/guardia
|
||||||
SECRET_KEY=change_this_secret_key_in_production_min_32chars
|
SECRET_KEY=change_this_secret_key_in_production_min_32chars
|
||||||
ALGORITHM=HS256
|
ALGORITHM=HS256
|
||||||
ACCESS_TOKEN_EXPIRE_MINUTES=480
|
ACCESS_TOKEN_EXPIRE_MINUTES=480
|
||||||
|
|
||||||
# Redis (선택)
|
|
||||||
REDIS_URL=redis://localhost:6379/0
|
REDIS_URL=redis://localhost:6379/0
|
||||||
|
|
||||||
# Ollama LLM (온프레미스 필수)
|
|
||||||
OLLAMA_BASE_URL=http://localhost:11434
|
OLLAMA_BASE_URL=http://localhost:11434
|
||||||
GUARDIA_LLM_MODEL=llama3.1:8b
|
GUARDIA_LLM_MODEL=llama3.1:8b
|
||||||
|
|
||||||
# 메신저 연동 (선택)
|
|
||||||
MESSENGER_BASE_URL=http://localhost:8002
|
MESSENGER_BASE_URL=http://localhost:8002
|
||||||
MESSENGER_OPS_ROOM=ops
|
MESSENGER_OPS_ROOM=ops
|
||||||
|
CATALINA_HOME=/app/tomcat
|
||||||
# 라이선스 (상용화 시 설정)
|
|
||||||
# GUARDIA_LICENSE_KEY=GRD-...
|
|
||||||
|
|
||||||
# VAPID 푸시 알림 (선택)
|
|
||||||
# VAPID_PRIVATE_KEY=...
|
|
||||||
# VAPID_PUBLIC_KEY=...
|
|
||||||
ENVEOF
|
ENVEOF
|
||||||
warn ".env 파일 생성됨 — 운영 환경에서는 SECRET_KEY를 반드시 변경하세요: $ENV_FILE"
|
warn ".env 생성됨 — SECRET_KEY를 변경하세요: $ENV_FILE"
|
||||||
else
|
else
|
||||||
info ".env 파일 이미 존재 — 건너뜀"
|
info ".env 파일 이미 존재 — 건너뜀"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── 5. DB 초기화 (스키마 불일치 자동 감지·복구) ─────────────────────────
|
# ── 6. DB 초기화 (스키마 불일치 자동 감지·복구) ─────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[5/8] DB 초기화..."
|
echo "[6/10] DB 초기화..."
|
||||||
cd "$GUARDIA_ROOT/itsm"
|
cd "$GUARDIA_ROOT/itsm"
|
||||||
source /opt/guardia/venv/bin/activate
|
source /opt/guardia/venv/bin/activate
|
||||||
|
|
||||||
# 포트 8001 기존 프로세스 종료 (업그레이드 시 충돌 방지)
|
|
||||||
if ss -tlnp 2>/dev/null | grep -q ':8001'; then
|
if ss -tlnp 2>/dev/null | grep -q ':8001'; then
|
||||||
warn "포트 8001 사용 중 — 기존 프로세스 종료..."
|
warn "포트 8001 사용 중 — 기존 프로세스 종료..."
|
||||||
fuser -k 8001/tcp 2>/dev/null || true
|
fuser -k 8001/tcp 2>/dev/null || true
|
||||||
@ -146,18 +220,17 @@ if ss -tlnp 2>/dev/null | grep -q ':8001'; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
PYTHONIOENCODING=utf-8 python tools/db_init.py --force \
|
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 ""
|
||||||
echo "[6/8] systemd 서비스 등록..."
|
echo "[7/10] GUARDiA ITSM 서비스 등록..."
|
||||||
# 기존 서비스 중지 (재설치/업그레이드)
|
|
||||||
systemctl stop guardia-itsm 2>/dev/null || true
|
systemctl stop guardia-itsm 2>/dev/null || true
|
||||||
|
|
||||||
cat > /etc/systemd/system/guardia-itsm.service << SVCEOF
|
cat > /etc/systemd/system/guardia-itsm.service << SVCEOF
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=GUARDiA ITSM Server
|
Description=GUARDiA ITSM Server
|
||||||
After=network.target postgresql.service redis.service
|
After=network.target postgresql.service redis.service tomcat9.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=exec
|
Type=exec
|
||||||
@ -181,16 +254,15 @@ chown -R www-data:www-data "$GUARDIA_ROOT/itsm" 2>/dev/null || true
|
|||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl enable guardia-itsm
|
systemctl enable guardia-itsm
|
||||||
systemctl start guardia-itsm
|
systemctl start guardia-itsm
|
||||||
ok "systemd 서비스 등록 완료"
|
ok "GUARDiA ITSM 서비스 등록 완료"
|
||||||
|
|
||||||
# ── 7. Nginx 리버스 프록시 ───────────────────────────────
|
# ── 8. Nginx 리버스 프록시 ───────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[7/8] Nginx 리버스 프록시 설정..."
|
echo "[8/10] Nginx 리버스 프록시 설정..."
|
||||||
cat > /etc/nginx/sites-available/guardia << 'NGXEOF'
|
cat > /etc/nginx/sites-available/guardia << 'NGXEOF'
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
server_name _;
|
server_name _;
|
||||||
|
|
||||||
client_max_body_size 100M;
|
client_max_body_size 100M;
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
@ -208,6 +280,9 @@ server {
|
|||||||
alias /opt/guardia/static/;
|
alias /opt/guardia/static/;
|
||||||
expires 1d;
|
expires 1d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Tomcat 직접 노출 금지 — GUARDiA를 통해서만 접근
|
||||||
|
# location /tomcat/ { proxy_pass http://127.0.0.1:8080/; }
|
||||||
}
|
}
|
||||||
NGXEOF
|
NGXEOF
|
||||||
|
|
||||||
@ -216,29 +291,43 @@ rm -f /etc/nginx/sites-enabled/default
|
|||||||
nginx -t && systemctl reload nginx
|
nginx -t && systemctl reload nginx
|
||||||
ok "Nginx 설정 완료"
|
ok "Nginx 설정 완료"
|
||||||
|
|
||||||
# ── 8. 방화벽 ────────────────────────────────────────────
|
# ── 9. 방화벽 ────────────────────────────────────────────
|
||||||
echo ""
|
echo ""
|
||||||
echo "[8/8] 방화벽 설정..."
|
echo "[9/10] 방화벽 설정..."
|
||||||
if command -v ufw &>/dev/null; then
|
if command -v ufw &>/dev/null; then
|
||||||
ufw allow 22/tcp 2>/dev/null || true
|
ufw allow 22/tcp 2>/dev/null || true
|
||||||
ufw allow 80/tcp 2>/dev/null || true
|
ufw allow 80/tcp 2>/dev/null || true
|
||||||
ufw allow 443/tcp 2>/dev/null || true
|
ufw allow 443/tcp 2>/dev/null || true
|
||||||
|
# 8080(Tomcat) 외부 직접 노출은 기본 차단 (Nginx 통해서만)
|
||||||
ufw --force enable 2>/dev/null || true
|
ufw --force enable 2>/dev/null || true
|
||||||
ok "UFW 방화벽 설정 완료"
|
ok "UFW 방화벽 설정 완료 (22/80/443 허용, 8080 내부 전용)"
|
||||||
fi
|
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 ""
|
||||||
echo "=================================================="
|
echo "=================================================="
|
||||||
ok "GUARDiA ITSM 설치 완료!"
|
ok "GUARDiA ITSM 설치 완료!"
|
||||||
echo ""
|
echo ""
|
||||||
info "접속 URL: http://$(hostname -I | awk '{print $1}')"
|
info "GUARDiA URL: http://$(hostname -I | awk '{print $1}')"
|
||||||
info "설치 로그: $LOG_FILE"
|
info "Tomcat URL: http://$(hostname -I | awk '{print $1}'):8080 (내부 전용)"
|
||||||
info "서비스 상태: systemctl status guardia-itsm"
|
info "설치 로그: $LOG_FILE"
|
||||||
|
info "서비스 상태: systemctl status guardia-itsm tomcat9"
|
||||||
echo ""
|
echo ""
|
||||||
warn "보안 필수 조치:"
|
warn "보안 필수 조치:"
|
||||||
warn " 1. $ENV_FILE 의 SECRET_KEY 변경"
|
warn " 1. $ENV_FILE 의 SECRET_KEY 변경"
|
||||||
warn " 2. PostgreSQL 비밀번호 변경"
|
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 ""
|
echo ""
|
||||||
info "설치 검증: sudo bash $0 --test"
|
info "설치 검증: sudo bash $0 --test"
|
||||||
echo "=================================================="
|
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 "Python 3.11+" { python --version 2>&1 | Select-String "3\.(1[1-9]|[2-9]\d)" }
|
||||||
Check-Item "PostgreSQL 응답" { pg_isready -q }
|
Check-Item "PostgreSQL 응답" { pg_isready -q }
|
||||||
Check-Item "Redis 응답" { redis-cli ping }
|
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 "NSSM 서비스 등록" { Get-Service "guardia-itsm" -ErrorAction Stop }
|
||||||
Check-Item "GUARDiA 서비스 실행" {
|
Check-Item "GUARDiA 서비스 실행" {
|
||||||
$s = Get-Service "guardia-itsm"
|
$s = Get-Service "guardia-itsm"
|
||||||
@ -97,10 +100,11 @@ Write-OK "Chocolatey 준비 완료"
|
|||||||
|
|
||||||
# ── 1. 필수 패키지 설치 ──────────────────────────────────────
|
# ── 1. 필수 패키지 설치 ──────────────────────────────────────
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "[2/8] 필수 패키지 설치 (Python, PostgreSQL, Redis, Nginx, NSSM)..."
|
Write-Host "[2/10] 필수 패키지 설치 (Python, Java, PostgreSQL, Redis, Nginx, NSSM)..."
|
||||||
|
|
||||||
$packages = @(
|
$packages = @(
|
||||||
"python --version=3.11.9",
|
"python --version=3.11.9",
|
||||||
|
"openjdk --version=17.0.11",
|
||||||
"postgresql",
|
"postgresql",
|
||||||
"redis-64",
|
"redis-64",
|
||||||
"nginx-winssl",
|
"nginx-winssl",
|
||||||
@ -116,11 +120,84 @@ foreach ($pkg in $packages) {
|
|||||||
|
|
||||||
# PATH 갱신
|
# PATH 갱신
|
||||||
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
|
$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 "필수 패키지 설치 완료"
|
Write-OK "필수 패키지 설치 완료"
|
||||||
|
|
||||||
# ── 2. Python 가상환경 ──────────────────────────────────────
|
# ── 2. Tomcat 9 설치 ────────────────────────────────────────
|
||||||
Write-Host ""
|
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"
|
$venvPath = "C:\guardia\venv"
|
||||||
if (-not (Test-Path $venvPath)) {
|
if (-not (Test-Path $venvPath)) {
|
||||||
python -m venv $venvPath
|
python -m venv $venvPath
|
||||||
@ -146,7 +223,7 @@ Write-OK "PostgreSQL 설정 완료"
|
|||||||
|
|
||||||
# ── 4. Redis 서비스 등록 ────────────────────────────────────
|
# ── 4. Redis 서비스 등록 ────────────────────────────────────
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "[5/8] Redis 서비스 등록..."
|
Write-Host "[5/10] Redis 서비스 등록..."
|
||||||
$redisExe = (Get-Command redis-server -ErrorAction SilentlyContinue)?.Source
|
$redisExe = (Get-Command redis-server -ErrorAction SilentlyContinue)?.Source
|
||||||
if ($redisExe) {
|
if ($redisExe) {
|
||||||
nssm install redis-server $redisExe 2>$null
|
nssm install redis-server $redisExe 2>$null
|
||||||
@ -156,7 +233,7 @@ Write-OK "Redis 완료"
|
|||||||
|
|
||||||
# ── 5. 환경 설정 파일 ───────────────────────────────────────
|
# ── 5. 환경 설정 파일 ───────────────────────────────────────
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "[6/8] 환경 설정 파일 생성..."
|
Write-Host "[6/10] 환경 설정 파일 생성..."
|
||||||
$envFile = "$GuardiaRoot\itsm\.env"
|
$envFile = "$GuardiaRoot\itsm\.env"
|
||||||
if (-not (Test-Path $envFile)) {
|
if (-not (Test-Path $envFile)) {
|
||||||
@"
|
@"
|
||||||
@ -175,7 +252,7 @@ MESSENGER_OPS_ROOM=ops
|
|||||||
|
|
||||||
# ── 6. DB 초기화 (스키마 불일치 자동 감지·복구) ────────────────────────
|
# ── 6. DB 초기화 (스키마 불일치 자동 감지·복구) ────────────────────────
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "[7/8] DB 초기화..."
|
Write-Host "[7/10] DB 초기화..."
|
||||||
|
|
||||||
# 포트 8001 기존 프로세스 종료 (업그레이드 시 충돌 방지)
|
# 포트 8001 기존 프로세스 종료 (업그레이드 시 충돌 방지)
|
||||||
$portProc = Get-NetTCPConnection -LocalPort 8001 -State Listen -ErrorAction SilentlyContinue | Select-Object -First 1
|
$portProc = Get-NetTCPConnection -LocalPort 8001 -State Listen -ErrorAction SilentlyContinue | Select-Object -First 1
|
||||||
@ -198,7 +275,7 @@ Write-OK "DB 초기화 완료"
|
|||||||
|
|
||||||
# ── 7. NSSM Windows 서비스 등록 ─────────────────────────────
|
# ── 7. NSSM Windows 서비스 등록 ─────────────────────────────
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "[8/8] Windows 서비스 등록 (NSSM)..."
|
Write-Host "[8/10] Windows 서비스 등록 (NSSM)..."
|
||||||
|
|
||||||
$uvicorn = "$venvPath\Scripts\uvicorn.exe"
|
$uvicorn = "$venvPath\Scripts\uvicorn.exe"
|
||||||
$svcName = "guardia-itsm"
|
$svcName = "guardia-itsm"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user