zioinfo-mail/deploy/03_deploy.ps1
2026-05-30 18:41:49 +09:00

111 lines
3.6 KiB
PowerShell

# ============================================================
# zio-server 홈페이지 배포 스크립트 (Windows PowerShell)
# 실행: .\deploy\03_deploy.ps1 -ServerIP "140.238.xxx.xxx"
# ============================================================
param(
[Parameter(Mandatory=$true)]
[string]$ServerIP,
[string]$KeyPath = "$env:USERPROFILE\.ssh\zio-server",
[string]$User = "ubuntu"
)
$GREEN = "`e[32m"
$YELLOW = "`e[33m"
$CYAN = "`e[36m"
$NC = "`e[0m"
function Log-Info { param($msg) Write-Host "${GREEN}[OK]${NC} $msg" }
function Log-Section { param($msg) Write-Host "`n${CYAN}=== $msg ===${NC}" }
function Log-Warn { param($msg) Write-Host "${YELLOW}[!]${NC} $msg" }
$SSH = "ssh -i `"$KeyPath`" -o StrictHostKeyChecking=no ${User}@${ServerIP}"
$SCP = "scp -i `"$KeyPath`" -o StrictHostKeyChecking=no"
$ROOT = "C:\GUARDiA\workspace\zioinfo-web"
Log-Section "1. React 프론트엔드 빌드"
Set-Location "$ROOT\frontend"
# vite.config.js 빌드 경로를 임시 dist로 변경
$viteCfg = Get-Content "vite.config.js" -Raw
$buildCfg = $viteCfg -replace "outDir: '.*?'", "outDir: 'dist'"
$buildCfg | Set-Content "vite.config.js" -Encoding utf8
npm run build
if ($LASTEXITCODE -ne 0) { Write-Error "빌드 실패"; exit 1 }
Log-Info "React 빌드 완료 → frontend/dist/"
Log-Section "2. 빌드 파일 서버 업로드"
Invoke-Expression "$SSH 'rm -rf /var/www/zioinfo/* && mkdir -p /var/www/zioinfo'"
Invoke-Expression "$SCP -r `"$ROOT\frontend\dist\*`" ${User}@${ServerIP}:/var/www/zioinfo/"
Log-Info "정적 파일 업로드 완료"
Log-Section "3. Spring Boot JAR 빌드"
Set-Location "$ROOT"
if (Test-Path "pom.xml") {
# Maven 빌드 (Spring Boot 백엔드)
$mvnw = if (Test-Path "mvnw.cmd") { ".\mvnw.cmd" } else { "mvn" }
& $mvnw clean package -DskipTests -q
$jar = Get-ChildItem "target\*.jar" -Exclude "*sources*" | Select-Object -First 1
if ($jar) {
Log-Info "JAR 빌드 완료: $($jar.Name)"
Invoke-Expression "$SCP `"$($jar.FullName)`" ${User}@${ServerIP}:/opt/zioinfo/app/zioinfo.jar"
Log-Info "JAR 업로드 완료"
}
} else {
Log-Warn "pom.xml 없음 — Spring Boot 배포 스킵 (정적 파일만 배포)"
}
Log-Section "4. systemd 서비스 등록 (Spring Boot)"
$serviceScript = @'
# Spring Boot 서비스 설정
sudo tee /etc/systemd/system/zioinfo.service > /dev/null <<SERVICE
[Unit]
Description=Zioinfo Spring Boot Application
After=network.target
[Service]
User=ubuntu
WorkingDirectory=/opt/zioinfo/app
ExecStart=/usr/bin/java -jar -Xms256m -Xmx512m /opt/zioinfo/app/zioinfo.jar
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
SERVICE
sudo systemctl daemon-reload
sudo systemctl enable zioinfo
sudo systemctl restart zioinfo 2>/dev/null || echo "서비스 시작 대기 중..."
'@
if (Test-Path "$ROOT\target\*.jar") {
Invoke-Expression "$SSH '$serviceScript'"
Log-Info "Spring Boot 서비스 등록 완료"
}
Log-Section "5. Nginx 재시작 및 최종 확인"
$checkScript = @"
sudo systemctl reload nginx
echo '--- Nginx ---'
sudo systemctl is-active nginx
echo '--- ---'
ss -tlnp | grep -E ':80|:443|:8080'
echo '--- ---'
df -h /
echo '--- ---'
free -h
"@
Invoke-Expression "$SSH '$checkScript'"
Log-Section "✅ 배포 완료!"
Write-Host ""
Write-Host "${GREEN}홈페이지 주소:${NC} http://$ServerIP"
Write-Host "${GREEN}SSH 접속:${NC} ssh -i `"$KeyPath`" ubuntu@$ServerIP"
Write-Host ""
Write-Host "${YELLOW}브라우저에서 확인:${NC}"
Start-Process "http://$ServerIP"