[설치 스크립트 수정사항] - PYTHONIOENCODING=utf-8 systemd/NSSM 서비스 환경변수 추가 (Windows cp949 오류 예방) - db_init.py 헬퍼 추가: 스키마 불일치 자동 감지 → 백업 → 재초기화 - 포트 8001 충돌 감지 및 기존 프로세스 자동 종료 로직 추가 - --test 검증 항목 강화: HTTP 응답 + 로그인 API + UTF-8 인코딩 포함 - setup_ubuntu/centos/rhel: PYTHONUNBUFFERED=1 추가 [workspace 자동분석 워크플로우] - workspace/ 디렉토리 생성 (소스코드 투입 위치) - .claude/skills/workspace-analyzer/SKILL.md 스킬 생성 Phase 0~6: 탐색→스택탐지→심층분석→리포트→개발환경가이드→하네스생성→CLAUDE.md - CLAUDE.md에 workspace 워크플로우 안내 등록 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
245 lines
8.9 KiB
Bash
245 lines
8.9 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 서버 기동" 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"
|
|
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
|
|
|
|
# 포트 8001 기존 프로세스 종료 (업그레이드 시 충돌 방지)
|
|
if ss -tlnp 2>/dev/null | grep -q ':8001'; then
|
|
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 초기화 실패 — 로그를 확인하세요"
|
|
|
|
# ── 6. systemd 서비스 등록 ───────────────────────────────
|
|
echo ""
|
|
echo "[6/8] systemd 서비스 등록..."
|
|
# 기존 서비스 중지 (재설치/업그레이드)
|
|
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
|
|
|
|
[Service]
|
|
Type=exec
|
|
User=www-data
|
|
WorkingDirectory=$GUARDIA_ROOT/itsm
|
|
Environment="PATH=/opt/guardia/venv/bin"
|
|
Environment="PYTHONIOENCODING=utf-8"
|
|
Environment="PYTHONUNBUFFERED=1"
|
|
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 "=================================================="
|