#!/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 "=================================================="