zioinfo-mail/setup/setup_ubuntu.sh
DESKTOP-TKLFCPR\ython e228faabf5 feat(itsm): G-1~G-12 확장 기능 + 하네스/봇/설치스크립트 구현
G-1: 메신저 Webhook Relay + _send_to_room 실제 httpx 호출 구현
G-2: POST /api/tasks/bulk SR 대량작업 엔드포인트 (최대 100건)
G-3: 라이선스 만료 알림 스케줄러 (매일 09:00 KST)
G-4: 체험판 upgrade_banner 필드 + license.py 배너 로직
G-5: core/auto_rca.py + incidents/problem auto-rca 엔드포인트
G-6: core/deploy_impact.py + vibe impact-analysis 엔드포인트
G-7: core/ticket_classifier.py + SR 생성 시 AI 분류 + ai-suggestion API
G-8: VulnPatchRecord 모델 + vuln_scan 패치추적 4개 엔드포인트
G-9: core/jira_sync.py + gateway Jira/Confluence 연동 엔드포인트
G-10: core/push_notify.py + routers/push.py + PushSubscription 모델
G-11: approvals 다중승인 (위임/서명/기한초과/마감연장)
G-12: alembic.ini + migrations/ + cicd/migrate_to_postgres.sh

하네스: guardia-orchestrator 확장기능 Phase 반영
봇명령어: /sr /status /license /bulk 슬래시 명령어 추가
설치스크립트: setup/ (Ubuntu, CentOS, RHEL, Windows) --test 옵션 포함

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 18:18:52 +09:00

237 lines
8.3 KiB
Bash

#!/bin/bash
# =============================================================
# GUARDiA ITSM 설치 스크립트 — Ubuntu 20.04 / 22.04 / 24.04
# =============================================================
# 전제조건: 순수 Ubuntu OS (최소 설치)
# 실행 방법: sudo bash setup_ubuntu.sh
# 설치 테스트: bash setup_ubuntu.sh --test
# =============================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
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} $*"; }
fail() { echo -e "${RED}[FAIL]${NC} $*"; exit 1; }
info() { echo -e " $*"; }
exec > >(tee -a "$LOG_FILE") 2>&1
echo "=================================================="
echo " GUARDiA ITSM 설치 — Ubuntu"
echo " 시작: $(date)"
echo "=================================================="
# ── root 권한 확인 ───────────────────────────────────────────
[[ $EUID -eq 0 ]] || fail "root 권한으로 실행하세요: sudo bash $0"
# ── 테스트 모드 ──────────────────────────────────────────────
if [[ "$TEST_MODE" == "--test" ]]; then
echo "=== 설치 검증 모드 ==="
PASS=0; FAIL=0
check() {
local desc="$1"; shift
if "$@" &>/dev/null; then
ok "$desc"; ((PASS++))
else
fail_cnt "$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 포트 8001" bash -c 'curl -sf http://localhost:8001/api/dashboard/overview -o /dev/null'
check "Nginx 실행" nginx -t
check "systemd 서비스" systemctl is-active guardia-itsm
echo ""
echo "검증 결과: 성공 $PASS / 실패 $FAIL"
[[ $FAIL -eq 0 ]] && ok "모든 검사 통과 — GUARDiA ITSM 정상 설치됨" || fail "일부 검사 실패 — 로그를 확인하세요: $LOG_FILE"
exit 0
fi
# ── 1. 시스템 패키지 업데이트 ────────────────────────────────
echo ""
echo "[1/8] 시스템 패키지 업데이트..."
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 \
postgresql postgresql-contrib \
redis-server \
nginx \
supervisor \
unzip jq
ok "시스템 패키지 설치 완료"
# ── 2. Python 가상환경 ──────────────────────────────────────
echo ""
echo "[2/8] Python 가상환경 설정..."
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 설정 ─────────────────────────────────────
echo ""
echo "[3/8] 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. 환경 설정 파일 ─────────────────────────────────────
echo ""
echo "[4/8] 환경 설정 파일 생성..."
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=...
ENVEOF
warn ".env 파일 생성됨 — 운영 환경에서는 SECRET_KEY를 반드시 변경하세요: $ENV_FILE"
else
info ".env 파일 이미 존재 — 건너뜀"
fi
# ── 5. DB 초기화 ──────────────────────────────────────────
echo ""
echo "[5/8] DB 초기화..."
cd "$GUARDIA_ROOT/itsm"
source /opt/guardia/venv/bin/activate
python -c "
import asyncio, os, sys
sys.path.insert(0, '.')
from dotenv import load_dotenv
load_dotenv('.env')
from database import init_db
asyncio.run(init_db())
print('DB 초기화 완료')
" && ok "DB 초기화 완료"
# ── 6. systemd 서비스 등록 ───────────────────────────────
echo ""
echo "[6/8] systemd 서비스 등록..."
cat > /etc/systemd/system/guardia-itsm.service << SVCEOF
[Unit]
Description=GUARDiA ITSM Server
After=network.target postgresql.service redis.service
[Service]
Type=exec
User=www-data
WorkingDirectory=$GUARDIA_ROOT/itsm
Environment="PATH=/opt/guardia/venv/bin"
EnvironmentFile=$GUARDIA_ROOT/itsm/.env
ExecStart=/opt/guardia/venv/bin/uvicorn main:app --host 0.0.0.0 --port 8001 --workers 4
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
SVCEOF
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 서비스 등록 완료"
# ── 7. Nginx 리버스 프록시 ───────────────────────────────
echo ""
echo "[7/8] Nginx 리버스 프록시 설정..."
cat > /etc/nginx/sites-available/guardia << 'NGXEOF'
server {
listen 80;
server_name _;
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:8001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 300s;
}
location /static/ {
alias /opt/guardia/static/;
expires 1d;
}
}
NGXEOF
ln -sf /etc/nginx/sites-available/guardia /etc/nginx/sites-enabled/guardia
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx
ok "Nginx 설정 완료"
# ── 8. 방화벽 ────────────────────────────────────────────
echo ""
echo "[8/8] 방화벽 설정..."
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
ufw --force enable 2>/dev/null || true
ok "UFW 방화벽 설정 완료"
fi
echo ""
echo "=================================================="
ok "GUARDiA ITSM 설치 완료!"
echo ""
info "접속 URL: http://$(hostname -I | awk '{print $1}')"
info "설치 로그: $LOG_FILE"
info "서비스 상태: systemctl status guardia-itsm"
echo ""
warn "보안 필수 조치:"
warn " 1. $ENV_FILE 의 SECRET_KEY 변경"
warn " 2. PostgreSQL 비밀번호 변경"
warn " 3. HTTPS(Let's Encrypt) 설정 권장"
echo ""
info "설치 검증: sudo bash $0 --test"
echo "=================================================="