- 37개 파일 IP → zioinfo.co.kr 치환 (소스/매뉴얼/설정/하네스) - Manager DrConsole/NetworkConsole/CsapConsole 빌드 + /var/www/manager/ 배포 - 테스트: Manager HTTP 200, ITSM 신규 API 7개 전체 200 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
117 lines
3.9 KiB
PowerShell
117 lines
3.9 KiB
PowerShell
# ============================================================
|
|
# GUARDiA ITSM 배포 스크립트 (Windows PowerShell)
|
|
# 실행: .\deploy\08_deploy_guardia.ps1 -ServerIP "xxx.xxx.xxx.xxx"
|
|
# ============================================================
|
|
|
|
param(
|
|
[Parameter(Mandatory=$true)] [string]$ServerIP,
|
|
[string]$KeyPath = "$env:USERPROFILE\.ssh\zio-server",
|
|
[string]$User = "ubuntu"
|
|
)
|
|
|
|
$GUARDIA = "C:\GUARDiA\itsm"
|
|
$SSH = "ssh -i `"$KeyPath`" -o StrictHostKeyChecking=no ${User}@${ServerIP}"
|
|
$SCP = "scp -i `"$KeyPath`" -o StrictHostKeyChecking=no -r"
|
|
|
|
function Log-Section { param($msg) Write-Host "`n`e[36m=== $msg ===`e[0m" }
|
|
function Log-Info { param($msg) Write-Host "`e[32m[OK]`e[0m $msg" }
|
|
|
|
Log-Section "1. GUARDiA 소스 압축"
|
|
$zipPath = "$env:TEMP\guardia_deploy.zip"
|
|
if (Test-Path $zipPath) { Remove-Item $zipPath }
|
|
|
|
# 배포 대상 파일만 포함 (node_modules, __pycache__ 제외)
|
|
Add-Type -Assembly System.IO.Compression.FileSystem
|
|
$zip = [System.IO.Compression.ZipFile]::Open($zipPath, 'Create')
|
|
|
|
$exclude = @('__pycache__', '.pyc', 'node_modules', '.git', '*.db', 'uploads', '.env')
|
|
Get-ChildItem $GUARDIA -Recurse -File | Where-Object {
|
|
$path = $_.FullName
|
|
-not ($exclude | Where-Object { $path -like "*$_*" })
|
|
} | ForEach-Object {
|
|
$entryName = $_.FullName.Replace("$GUARDIA\", "").Replace("\", "/")
|
|
try {
|
|
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile(
|
|
$zip, $_.FullName, $entryName) | Out-Null
|
|
} catch {}
|
|
}
|
|
$zip.Dispose()
|
|
Log-Info "소스 압축 완료: $zipPath"
|
|
|
|
Log-Section "2. 서버로 업로드"
|
|
Invoke-Expression "$SCP `"$zipPath`" ${User}@${ServerIP}:/tmp/guardia_deploy.zip"
|
|
Log-Info "업로드 완료"
|
|
|
|
Log-Section "3. 서버에서 압축 해제 및 설치"
|
|
$deployScript = @'
|
|
set -e
|
|
echo "[1] 압축 해제"
|
|
mkdir -p /tmp/guardia_src
|
|
cd /tmp/guardia_src && unzip -qo /tmp/guardia_deploy.zip
|
|
|
|
echo "[2] 파일 복사"
|
|
cp -r /tmp/guardia_src/* /opt/guardia/app/
|
|
chown -R ubuntu:ubuntu /opt/guardia/app
|
|
|
|
echo "[3] DB 초기화"
|
|
source /opt/guardia/venv/bin/activate
|
|
cd /opt/guardia/app
|
|
|
|
# .env 파일이 없으면 기본값으로 생성
|
|
if [ ! -f .env ]; then
|
|
cp /opt/guardia/app/.env.example .env 2>/dev/null || true
|
|
fi
|
|
|
|
# DB 마이그레이션
|
|
python3 db_init.py --force 2>/dev/null || python3 -c "
|
|
from database import engine, Base
|
|
from models import *
|
|
import asyncio
|
|
async def init():
|
|
async with engine.begin() as conn:
|
|
await conn.run_sync(Base.metadata.create_all)
|
|
asyncio.run(init())
|
|
print('DB 초기화 완료')
|
|
" 2>/dev/null || echo "DB 초기화 스킵 (이미 존재)"
|
|
|
|
echo "[4] 서비스 재시작"
|
|
sudo systemctl restart guardia
|
|
sleep 3
|
|
sudo systemctl is-active guardia && echo "GUARDiA 서비스 실행 중" || echo "서비스 시작 실패 — 로그 확인 필요"
|
|
|
|
echo "[5] 정리"
|
|
rm -rf /tmp/guardia_src /tmp/guardia_deploy.zip
|
|
echo "배포 완료!"
|
|
'@
|
|
|
|
Invoke-Expression "$SSH 'bash -s'" | bash -s <<< "$deployScript"
|
|
|
|
Log-Section "4. 접속 확인"
|
|
$checkScript = @"
|
|
echo '--- GUARDiA 서비스 상태 ---'
|
|
sudo systemctl status guardia --no-pager -l | head -20
|
|
echo ''
|
|
echo '--- 포트 확인 ---'
|
|
ss -tlnp | grep -E ':8001|:8080|:80'
|
|
echo ''
|
|
echo '--- 메모리 사용량 ---'
|
|
free -h
|
|
echo ''
|
|
echo '--- GUARDiA API 헬스체크 ---'
|
|
sleep 2
|
|
curl -s http://localhost:8001/api/admin/health | python3 -m json.tool 2>/dev/null || echo 'API 응답 대기 중...'
|
|
"@
|
|
Invoke-Expression "$SSH '$checkScript'"
|
|
|
|
Write-Host ""
|
|
Write-Host "`e[32m✅ GUARDiA ITSM 배포 완료!`e[0m"
|
|
Write-Host ""
|
|
Write-Host " 홈페이지: http://$ServerIP"
|
|
Write-Host " GUARDiA ITSM: http://$ServerIP`:8001"
|
|
Write-Host " 관리자 로그인: admin / admin (최초 접속 후 변경 필수)"
|
|
Write-Host ""
|
|
Write-Host "`e[33m보안 권고:`e[0m"
|
|
Write-Host " 1. 최초 로그인 후 즉시 비밀번호 변경"
|
|
Write-Host " 2. MFA 활성화: POST /api/auth/mfa/setup"
|
|
Write-Host " 3. 포트 8001 → Nginx 뒤로 숨기기 (07_nginx_all.sh 실행)"
|