guardia-docs/06_설치가이드_윈도우서버.md
DESKTOP-TKLFCPRython 938b25f286 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

874 lines
23 KiB
Markdown

# GUARDiA ITSM + Messenger — 설치 가이드 (Windows Server)
**문서 버전**: 1.0
**작성일**: 2026-05-25
**지원 OS**: Windows Server 2019, Windows Server 2022
---
## 목차
1. [설치 전 요구사항 확인](#1-설치-전-요구사항-확인)
2. [사전 소프트웨어 설치](#2-사전-소프트웨어-설치)
3. [GUARDiA ITSM 설치](#3-guardia-itsm-설치)
4. [GUARDiA Messenger 설치](#4-guardia-messenger-설치)
5. [Windows 서비스 등록 (NSSM)](#5-windows-서비스-등록-nssm)
6. [방화벽 설정](#6-방화벽-설정)
7. [IIS 리버스 프록시 설정 (선택)](#7-iis-리버스-프록시-설정-선택)
8. [설치 검증](#8-설치-검증)
9. [보안 강화 설정](#9-보안-강화-설정)
10. [자동 백업 설정](#10-자동-백업-설정)
11. [문제 해결](#11-문제-해결)
---
## 1. 설치 전 요구사항 확인
### 1.1 하드웨어 최소 요구사항
| 항목 | 최소 | 권장 |
|------|------|------|
| CPU | 2코어 | 4코어 이상 |
| RAM | 4GB | 8GB 이상 |
| 디스크 | 30GB | 60GB 이상 |
| 네트워크 | 100Mbps | 1Gbps |
### 1.2 소프트웨어 요구사항
```
OS: Windows Server 2022 (권장) 또는 Windows Server 2019
Python: 3.11 이상
OpenSSL: Win64 OpenSSL v3.x (SSL 점검 기능 사용 시)
NSSM: 서비스 등록 도구 (선택, Windows Service로 등록 시 필요)
```
### 1.3 설치 전 확인 (PowerShell)
PowerShell을 **관리자 권한**으로 실행하여 확인합니다.
```powershell
# OS 버전 확인
[System.Environment]::OSVersion.Version
Get-ComputerInfo | Select-Object WindowsProductName, WindowsVersion
# PowerShell 버전 확인
$PSVersionTable.PSVersion
# → Major 5 이상
# 디스크 여유 공간 확인
Get-PSDrive C | Select-Object Used, Free
# → Free 30GB 이상 확인
# 포트 사용 여부 확인
netstat -an | findstr ":8000"
netstat -an | findstr ":8001"
# → 아무것도 출력되지 않아야 함
```
---
## 2. 사전 소프트웨어 설치
### 2.1 Python 3.11 설치
1. 웹브라우저에서 `python.org/downloads` 접속
2. **Python 3.11.x** (Windows installer 64-bit) 다운로드
3. 설치 시 반드시 체크: **"Add Python to PATH"**
```powershell
# 설치 후 확인
python --version
# → Python 3.11.x
python -m pip --version
# → pip 24.x from ...
```
> 설치 후 PowerShell을 새로 열어야 PATH가 반영됩니다.
### 2.2 Git 설치 (선택)
내부 Git 서버에서 코드를 받는 경우 필요합니다.
1. `git-scm.com/download/win` 에서 설치 파일 다운로드
2. 기본 설정으로 설치
3. 확인: `git --version`
### 2.3 OpenSSL 설치 (SSL 점검 기능 사용 시)
```
1. 웹에서 "Win64 OpenSSL" 검색 → slproweb.com 또는 공식 배포처에서 다운로드
(Win64 OpenSSL v3.x.x Light 권장)
2. 기본 경로 C:\Program Files\OpenSSL-Win64 에 설치
3. 시스템 환경변수 PATH에 추가: C:\Program Files\OpenSSL-Win64\bin
```
```powershell
# 설치 확인
openssl version
# → OpenSSL 3.x.x
```
### 2.4 NSSM 설치 (서비스 등록용)
NSSM은 Python 앱을 Windows Service로 등록하는 도구입니다.
```
1. nssm.cc/download 에서 최신 버전 다운로드
2. 압축 해제 후 nssm.exe (win64 폴더)를 C:\Windows\System32\ 에 복사
```
```powershell
# 확인
nssm version
```
---
## 3. GUARDiA ITSM 설치
### 3.1 설치 디렉토리 생성
PowerShell을 **관리자 권한**으로 실행합니다.
```powershell
# 디렉토리 생성
New-Item -ItemType Directory -Force -Path "C:\GUARDiA\itsm"
New-Item -ItemType Directory -Force -Path "C:\GUARDiA\messenger"
New-Item -ItemType Directory -Force -Path "C:\GUARDiA\logs"
New-Item -ItemType Directory -Force -Path "C:\GUARDiA\backup"
New-Item -ItemType Directory -Force -Path "C:\GUARDiA\scripts\ssl"
New-Item -ItemType Directory -Force -Path "C:\GUARDiA\itsm\uploads\sr_files"
New-Item -ItemType Directory -Force -Path "C:\GUARDiA\itsm\uploads\workspaces"
Write-Host "디렉토리 생성 완료"
```
### 3.2 소스 코드 배포
```powershell
# 방법 1: 파일 복사 (zip 파일로 배포 시)
Expand-Archive -Path "C:\temp\guardia_itsm_v1.0.zip" -DestinationPath "C:\GUARDiA\itsm" -Force
# 방법 2: Git clone (내부 Git 서버)
cd C:\GUARDiA
git clone http://내부git서버/guardia/itsm.git itsm
# 배포 확인
Get-ChildItem C:\GUARDiA\itsm\
# → main.py database.py models.py schemas.py 등 표시
```
### 3.3 가상환경 생성 및 의존성 설치
```powershell
# C:\GUARDiA\itsm 으로 이동
cd C:\GUARDiA\itsm
# 가상환경 생성
python -m venv C:\GUARDiA\.venv
# 가상환경 활성화
C:\GUARDiA\.venv\Scripts\Activate.ps1
# 활성화 오류 시 실행 정책 변경
# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# pip 업그레이드
python -m pip install --upgrade pip
# 의존성 설치
pip install -r requirements.txt
# 설치 확인
pip show fastapi uvicorn sqlalchemy apscheduler
# → Name, Version 정보 출력 확인
# 가상환경 비활성화
deactivate
```
**설치 중 오류 발생 시**:
```powershell
# Visual C++ 빌드 도구가 필요한 패키지 오류 시
# Microsoft C++ Build Tools 설치 필요
# visualstudio.microsoft.com/visual-cpp-build-tools/ 에서 다운로드 후 설치
```
### 3.4 환경 변수 파일 (.env) 생성
메모장 또는 VS Code로 `C:\GUARDiA\itsm\.env` 파일을 생성합니다.
```powershell
# PowerShell로 .env 파일 생성
$envContent = @"
SECRET_KEY=여기에_64자이상의_랜덤문자열_반드시_변경하세요
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=480
DB_URL=sqlite+aiosqlite:///C:/GUARDiA/itsm/guardia_itsm.db
ENCRYPTION_KEY=0000000000000000000000000000000000000000000000000000000000000000
# 라이선스 마스터 키 (64자리 hex = 32바이트)
# 생성: python -c "import secrets; print(secrets.token_hex(32))"
# 분실 시 기발급 라이선스 전부 무효화 — 안전하게 별도 보관 필수
GUARDIA_LICENSE_KEY=0000000000000000000000000000000000000000000000000000000000000000
MESSENGER_BASE_URL=http://localhost:8001
MESSENGER_BOT_TOKEN=변경하세요
SSH_TIMEOUT=30
UPLOAD_ROOT=C:/GUARDiA/itsm/uploads
MAX_FILE_SIZE_MB=10
"@
$envContent | Out-File -FilePath "C:\GUARDiA\itsm\.env" -Encoding utf8
Write-Host ".env 파일 생성 완료"
```
> **중요**: `SECRET_KEY`, `ENCRYPTION_KEY`, `GUARDIA_LICENSE_KEY`를 반드시 강력한 랜덤 값으로 변경하세요!
```powershell
# GUARDIA_LICENSE_KEY 생성
python -c "import secrets; print(secrets.token_hex(32))"
# → 출력된 64자리 hex를 GUARDIA_LICENSE_KEY에 복사
```
```powershell
# 랜덤 키 생성
python -c "import secrets; print(secrets.token_hex(32))"
# → 출력된 값을 SECRET_KEY에 복사
python -c "import secrets; print(secrets.token_hex(32))"
# → 출력된 값을 ENCRYPTION_KEY에 복사
```
### 3.5 초기 실행 및 DB 초기화 테스트
```powershell
# 가상환경 활성화
C:\GUARDiA\.venv\Scripts\Activate.ps1
# 디렉토리 이동
cd C:\GUARDiA\itsm
# 임시 실행 (초기 DB 생성 확인)
$process = Start-Process -FilePath "C:\GUARDiA\.venv\Scripts\uvicorn.exe" `
-ArgumentList "main:app --host 127.0.0.1 --port 8000" `
-PassThru -NoNewWindow
Start-Sleep -Seconds 8
# 정상 동작 확인
$response = Invoke-WebRequest -Uri "http://127.0.0.1:8000/" -ErrorAction SilentlyContinue
Write-Host "HTTP 응답 코드: $($response.StatusCode)"
# → 200이면 정상
# 로그인 테스트
$body = '{"username":"admin","password":"admin1234!"}'
$result = Invoke-RestMethod -Uri "http://127.0.0.1:8000/auth/login" `
-Method Post -Body $body -ContentType "application/json"
Write-Host "토큰: $($result.access_token.Substring(0,20))..."
# → 토큰 앞부분 출력 확인
# 프로세스 종료
Stop-Process -Id $process.Id
deactivate
```
---
## 4. GUARDiA Messenger 설치
### 4.1 소스 코드 배포
```powershell
# 파일 복사
Expand-Archive -Path "C:\temp\guardia_messenger_v1.0.zip" `
-DestinationPath "C:\GUARDiA\messenger" -Force
# 또는 git clone
cd C:\GUARDiA
git clone http://내부git서버/guardia/messenger.git messenger
```
### 4.2 의존성 설치
```powershell
C:\GUARDiA\.venv\Scripts\Activate.ps1
cd C:\GUARDiA\messenger
pip install -r requirements.txt
deactivate
```
### 4.3 환경 변수 설정
```powershell
$envContent = @"
SECRET_KEY=ITSM과_동일한_키_또는_별도_키
ALGORITHM=HS256
DB_URL=sqlite+aiosqlite:///C:/GUARDiA/messenger/guardia_messenger.db
ITSM_BASE_URL=http://localhost:8000
PORT=8001
"@
$envContent | Out-File -FilePath "C:\GUARDiA\messenger\.env" -Encoding utf8
```
---
## 5. Windows 서비스 등록 (NSSM)
NSSM을 사용하여 GUARDiA를 Windows Service로 등록합니다.
### 5.1 ITSM 서비스 등록
PowerShell을 **관리자 권한**으로 실행합니다.
```powershell
# ITSM 서비스 등록
nssm install GUARDiA-ITSM C:\GUARDiA\.venv\Scripts\uvicorn.exe
# 서비스 파라미터 설정
nssm set GUARDiA-ITSM Application C:\GUARDiA\.venv\Scripts\uvicorn.exe
nssm set GUARDiA-ITSM AppParameters "main:app --host 0.0.0.0 --port 8000 --workers 2"
nssm set GUARDiA-ITSM AppDirectory "C:\GUARDiA\itsm"
# 로그 설정
nssm set GUARDiA-ITSM AppStdout "C:\GUARDiA\logs\itsm.log"
nssm set GUARDiA-ITSM AppStderr "C:\GUARDiA\logs\itsm_error.log"
nssm set GUARDiA-ITSM AppRotateFiles 1
nssm set GUARDiA-ITSM AppRotateBytes 10485760
# 서비스 설명
nssm set GUARDiA-ITSM Description "GUARDiA ITSM IT Service Management"
nssm set GUARDiA-ITSM DisplayName "GUARDiA ITSM"
# 환경 변수 설정 (경로 구분은 \t 탭 문자 사용)
nssm set GUARDiA-ITSM AppEnvironmentExtra "PYTHONDONTWRITEBYTECODE=1"
# 자동 시작 설정
nssm set GUARDiA-ITSM Start SERVICE_AUTO_START
```
### 5.2 Messenger 서비스 등록
```powershell
nssm install GUARDiA-Messenger C:\GUARDiA\.venv\Scripts\uvicorn.exe
nssm set GUARDiA-Messenger Application C:\GUARDiA\.venv\Scripts\uvicorn.exe
nssm set GUARDiA-Messenger AppParameters "main:app --host 0.0.0.0 --port 8001 --workers 1"
nssm set GUARDiA-Messenger AppDirectory "C:\GUARDiA\messenger"
nssm set GUARDiA-Messenger AppStdout "C:\GUARDiA\logs\messenger.log"
nssm set GUARDiA-Messenger AppStderr "C:\GUARDiA\logs\messenger_error.log"
nssm set GUARDiA-Messenger AppRotateFiles 1
nssm set GUARDiA-Messenger Description "GUARDiA Messenger Service"
nssm set GUARDiA-Messenger Start SERVICE_AUTO_START
```
### 5.3 서비스 시작
```powershell
# 서비스 시작
Start-Service GUARDiA-ITSM
Start-Service GUARDiA-Messenger
# 상태 확인
Get-Service GUARDiA-ITSM, GUARDiA-Messenger
# 기대 출력:
# Status Name DisplayName
# ------ ---- -----------
# Running GUARDiA-ITSM GUARDiA ITSM
# Running GUARDiA-Messenger GUARDiA Messenger
```
### 5.4 서비스 관리 명령어
```powershell
# 시작
Start-Service GUARDiA-ITSM
# 중지
Stop-Service GUARDiA-ITSM
# 재시작
Restart-Service GUARDiA-ITSM
# 상태 확인
Get-Service GUARDiA-ITSM | Select-Object Name, Status, StartType
# 로그 확인 (최근 50줄)
Get-Content "C:\GUARDiA\logs\itsm.log" -Tail 50
# 실시간 로그 확인
Get-Content "C:\GUARDiA\logs\itsm.log" -Wait -Tail 20
```
### 5.5 서비스 제거 (재설치 시)
```powershell
# 서비스 제거
nssm remove GUARDiA-ITSM confirm
nssm remove GUARDiA-Messenger confirm
```
---
## 6. 방화벽 설정
### 6.1 Windows Defender 방화벽 규칙 추가
```powershell
# ITSM 포트 허용
New-NetFirewallRule `
-DisplayName "GUARDiA ITSM" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 8000 `
-Action Allow `
-Profile Domain, Private
# Messenger 포트 허용
New-NetFirewallRule `
-DisplayName "GUARDiA Messenger" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 8001 `
-Action Allow `
-Profile Domain, Private
# 규칙 확인
Get-NetFirewallRule -DisplayName "GUARDiA*" | Select-Object DisplayName, Enabled, Action
```
### 6.2 특정 IP 대역만 허용 (보안 강화)
```powershell
# 내부 네트워크 192.168.1.0/24 에서만 접근 허용
New-NetFirewallRule `
-DisplayName "GUARDiA ITSM (내부망)" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 8000 `
-RemoteAddress "192.168.1.0/24" `
-Action Allow
# 기존 전체 허용 규칙 비활성화
Disable-NetFirewallRule -DisplayName "GUARDiA ITSM"
```
---
## 7. IIS 리버스 프록시 설정 (선택)
HTTPS를 적용하거나 80/443 포트를 사용하려면 IIS를 앞단에 배치합니다.
### 7.1 IIS 및 ARR 설치
```powershell
# IIS 설치
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerRole -All
Install-WindowsFeature -Name Web-Server -IncludeManagementTools
# ARR (Application Request Routing) 설치
# Web Platform Installer에서 "Application Request Routing 3.0" 설치
# 또는: https://www.iis.net/downloads/microsoft/application-request-routing
```
### 7.2 IIS 역방향 프록시 설정
IIS 관리자를 열어 다음을 설정합니다:
```
1. IIS 관리자 → 서버 노드 → Application Request Routing Cache
→ "Enable proxy" 체크
2. 웹사이트 → "URL 재작성" → 규칙 추가
→ 역방향 프록시 → 서버: localhost:8000
3. 바인딩 추가:
- 포트 80 (HTTP)
- 포트 443 (HTTPS, SSL 인증서 선택)
```
**web.config 예시**:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="GUARDiA ITSM" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://localhost:8000/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
```
---
## 8. 설치 검증
### 8.1 서비스 상태 확인
```powershell
# 서비스 상태
Get-Service GUARDiA-ITSM, GUARDiA-Messenger
# 포트 리스닝 확인
netstat -an | findstr ":8000"
netstat -an | findstr ":8001"
# → TCP 0.0.0.0:8000 ... LISTENING
```
### 8.2 API 기능 테스트
```powershell
# 1. 홈페이지 응답 확인
$response = Invoke-WebRequest -Uri "http://localhost:8000/"
Write-Host "HTTP 상태: $($response.StatusCode)"
# → 200
# 2. 로그인 테스트
$loginBody = '{"username":"admin","password":"admin1234!"}'
$loginResult = Invoke-RestMethod -Uri "http://localhost:8000/auth/login" `
-Method Post -Body $loginBody -ContentType "application/json"
$token = $loginResult.access_token
Write-Host "로그인 성공: 토큰 앞 20자 = $($token.Substring(0,20))..."
# 3. 대시보드 API 호출
$headers = @{ Authorization = "Bearer $token" }
$dashboard = Invoke-RestMethod -Uri "http://localhost:8000/dashboard/summary" `
-Headers $headers
Write-Host "대시보드 응답:"
$dashboard | ConvertTo-Json
# 4. Messenger 확인
$msgResponse = Invoke-WebRequest -Uri "http://localhost:8001/"
Write-Host "Messenger HTTP 상태: $($msgResponse.StatusCode)"
```
### 8.3 설치 검증 스크립트
```powershell
# C:\GUARDiA\verify_install.ps1 생성
$script = @'
Write-Host "=== GUARDiA 설치 검증 ===" -ForegroundColor Cyan
function Check-Item($condition, $label) {
if ($condition) {
Write-Host " [ok] $label" -ForegroundColor Green
} else {
Write-Host " [FAIL] $label" -ForegroundColor Red
}
}
# 서비스 상태
$itsmSvc = Get-Service GUARDiA-ITSM -ErrorAction SilentlyContinue
Check-Item ($itsmSvc -and $itsmSvc.Status -eq "Running") "ITSM 서비스 실행 중"
$msgSvc = Get-Service GUARDiA-Messenger -ErrorAction SilentlyContinue
Check-Item ($msgSvc -and $msgSvc.Status -eq "Running") "Messenger 서비스 실행 중"
# 포트 확인
$itsm8000 = netstat -an | findstr ":8000" | findstr "LISTENING"
Check-Item ($itsm8000 -ne $null) "ITSM 포트 8000 리스닝"
$msg8001 = netstat -an | findstr ":8001" | findstr "LISTENING"
Check-Item ($msg8001 -ne $null) "Messenger 포트 8001 리스닝"
# API 응답
try {
$r = Invoke-WebRequest "http://localhost:8000/" -TimeoutSec 5
Check-Item ($r.StatusCode -eq 200) "ITSM API 응답 (200)"
} catch {
Check-Item $false "ITSM API 응답 (오류: $_)"
}
# DB 파일
Check-Item (Test-Path "C:\GUARDiA\itsm\guardia_itsm.db") "ITSM DB 파일 존재"
# 로그 파일
Check-Item (Test-Path "C:\GUARDiA\logs\itsm.log") "ITSM 로그 파일 존재"
Write-Host "=== 검증 완료 ===" -ForegroundColor Cyan
'@
$script | Out-File -FilePath "C:\GUARDiA\verify_install.ps1" -Encoding utf8
# 검증 실행
PowerShell -ExecutionPolicy Bypass -File "C:\GUARDiA\verify_install.ps1"
```
---
## 9. 보안 강화 설정
### 9.1 초기 관리자 비밀번호 변경
```powershell
# 로그인
$loginBody = '{"username":"admin","password":"admin1234!"}'
$loginResult = Invoke-RestMethod -Uri "http://localhost:8000/auth/login" `
-Method Post -Body $loginBody -ContentType "application/json"
$token = $loginResult.access_token
# 비밀번호 변경
$pwBody = @{
current_password = "admin1234!"
new_password = "새로운강력한비밀번호!@#456"
} | ConvertTo-Json
Invoke-RestMethod -Uri "http://localhost:8000/auth/change-password" `
-Method Post -Body $pwBody -ContentType "application/json" `
-Headers @{ Authorization = "Bearer $token" }
Write-Host "비밀번호 변경 완료"
```
### 9.2 .env 파일 접근 권한 제한
```powershell
# .env 파일 소유자 확인
Get-Acl "C:\GUARDiA\itsm\.env"
# 서비스 계정(또는 시스템)만 읽기 가능하도록 권한 설정
$acl = Get-Acl "C:\GUARDiA\itsm\.env"
$acl.SetAccessRuleProtection($true, $false) # 상속 차단
# 현재 사용자 전체 제어
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
$env:USERNAME, "FullControl", "Allow"
)
$acl.AddAccessRule($rule)
Set-Acl "C:\GUARDiA\itsm\.env" $acl
Write-Host "파일 권한 설정 완료"
```
### 9.3 이벤트 로그 설정
```powershell
# 이벤트 소스 등록 (최초 1회)
New-EventLog -LogName Application -Source "GUARDiA-ITSM" -ErrorAction SilentlyContinue
# 이벤트 로그 크기 설정
Limit-EventLog -LogName Application -MaximumSize 50MB
```
### 9.4 보안 정책 확인
```powershell
# TLS 1.2 이상만 허용 (Windows Server 2019+는 기본 설정)
# 레지스트리 확인
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" -ErrorAction SilentlyContinue
# DisabledByDefault = 1 이면 비활성화
```
---
## 10. 자동 백업 설정
### 10.1 백업 스크립트 생성
```powershell
# C:\GUARDiA\scripts\backup.ps1 생성
$backupScript = @'
$date = Get-Date -Format "yyyyMMdd_HHmm"
$backupDir = "C:\GUARDiA\backup"
# 백업 디렉토리 생성
if (-not (Test-Path $backupDir)) {
New-Item -ItemType Directory -Path $backupDir -Force
}
# ITSM DB 백업
$itsmDb = "C:\GUARDiA\itsm\guardia_itsm.db"
if (Test-Path $itsmDb) {
Copy-Item $itsmDb "$backupDir\itsm_$date.db"
Write-Host "$date - ITSM DB 백업 완료"
}
# Messenger DB 백업
$msgDb = "C:\GUARDiA\messenger\guardia_messenger.db"
if (Test-Path $msgDb) {
Copy-Item $msgDb "$backupDir\messenger_$date.db"
Write-Host "$date - Messenger DB 백업 완료"
}
# 업로드 파일 백업 (선택)
# Compress-Archive -Path "C:\GUARDiA\itsm\uploads" -DestinationPath "$backupDir\uploads_$date.zip"
# 30일 이전 백업 삭제
Get-ChildItem $backupDir -Filter "*.db" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item -Force
Write-Host "$date - 백업 작업 완료"
"@
New-Item -ItemType Directory -Force -Path "C:\GUARDiA\scripts"
$backupScript | Out-File -FilePath "C:\GUARDiA\scripts\backup.ps1" -Encoding utf8
```
### 10.2 작업 스케줄러 등록
```powershell
# 매일 새벽 3시 자동 실행
$action = New-ScheduledTaskAction `
-Execute "PowerShell.exe" `
-Argument "-NonInteractive -ExecutionPolicy Bypass -File C:\GUARDiA\scripts\backup.ps1 >> C:\GUARDiA\logs\backup.log 2>&1"
$trigger = New-ScheduledTaskTrigger -Daily -At "03:00"
$settings = New-ScheduledTaskSettingsSet `
-ExecutionTimeLimit (New-TimeSpan -Hours 1) `
-RunOnlyIfNetworkAvailable $false
Register-ScheduledTask `
-TaskName "GUARDiA-Backup" `
-Action $action `
-Trigger $trigger `
-Settings $settings `
-RunLevel Highest `
-Force
Write-Host "백업 작업 스케줄 등록 완료"
# 즉시 실행으로 테스트
Start-ScheduledTask -TaskName "GUARDiA-Backup"
Start-Sleep -Seconds 5
Get-ChildItem "C:\GUARDiA\backup\" | Sort-Object LastWriteTime -Descending | Select-Object -First 3
```
---
## 11. 문제 해결
### 11.1 서비스 시작 실패
```powershell
# 1. 서비스 상태 확인
Get-Service GUARDiA-ITSM | Format-List *
# 2. 이벤트 로그 확인
Get-EventLog -LogName Application -Source "GUARDiA-ITSM" -Newest 10 |
Select-Object TimeGenerated, EntryType, Message
# 3. NSSM 로그 확인
Get-Content "C:\GUARDiA\logs\itsm_error.log" -Tail 30
# 4. 수동 실행으로 오류 확인
cd C:\GUARDiA\itsm
C:\GUARDiA\.venv\Scripts\uvicorn.exe main:app --host 127.0.0.1 --port 8000
# → 직접 오류 메시지 확인
```
### 11.2 Python 패키지 누락 오류
```
오류: ModuleNotFoundError: No module named 'xxx'
해결:
C:\GUARDiA\.venv\Scripts\Activate.ps1
pip install xxx
deactivate
Restart-Service GUARDiA-ITSM
```
### 11.3 포트 충돌
```powershell
# 8000 포트 사용 프로세스 확인
netstat -ano | findstr ":8000"
# → 마지막 컬럼이 PID
# 프로세스 확인
Get-Process -Id <PID>
# 프로세스 종료 (필요 시)
Stop-Process -Id <PID> -Force
```
### 11.4 PowerShell 실행 정책 오류
```
오류: running scripts is disabled on this system
해결:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine
# 또는 현재 사용자만:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
```
### 11.5 DB 파일 잠금 오류
```
오류: database is locked
해결:
1. 서비스 중지
Stop-Service GUARDiA-ITSM
2. 잠금 파일 삭제
Remove-Item "C:\GUARDiA\itsm\guardia_itsm.db-shm" -ErrorAction SilentlyContinue
Remove-Item "C:\GUARDiA\itsm\guardia_itsm.db-wal" -ErrorAction SilentlyContinue
3. 서비스 재시작
Start-Service GUARDiA-ITSM
```
### 11.6 인코딩 오류 (한글 깨짐)
```powershell
# .env 파일을 UTF-8 without BOM으로 저장
[System.IO.File]::WriteAllText(
"C:\GUARDiA\itsm\.env",
(Get-Content "C:\GUARDiA\itsm\.env" -Raw),
[System.Text.UTF8Encoding]::new($false) # $false = no BOM
)
```
---
## 부록 A: Windows 서비스 빠른 참조
```powershell
# 서비스 시작/중지/재시작
Start-Service GUARDiA-ITSM
Stop-Service GUARDiA-ITSM
Restart-Service GUARDiA-ITSM
Start-Service GUARDiA-Messenger
Stop-Service GUARDiA-Messenger
Restart-Service GUARDiA-Messenger
# 상태 확인
Get-Service GUARDiA-ITSM, GUARDiA-Messenger
# 로그 확인 (최근 50줄)
Get-Content "C:\GUARDiA\logs\itsm.log" -Tail 50
Get-Content "C:\GUARDiA\logs\itsm_error.log" -Tail 20
# 실시간 로그 모니터링
Get-Content "C:\GUARDiA\logs\itsm.log" -Wait -Tail 10
# 수동 백업
PowerShell -File "C:\GUARDiA\scripts\backup.ps1"
```
## 부록 B: 환경 변수 참조
| 변수명 | 설명 | 예시 값 |
|--------|------|---------|
| SECRET_KEY | JWT 서명 키 (필수 변경) | 랜덤 64자 이상 문자열 |
| ENCRYPTION_KEY | AES-256 암호화 키 (필수 변경) | 랜덤 64자 hex 문자열 |
| ACCESS_TOKEN_EXPIRE_MINUTES | 토큰 만료 시간(분) | 480 (8시간) |
| DB_URL | SQLite DB 경로 | sqlite+aiosqlite:///C:/... |
| MESSENGER_BASE_URL | Messenger 서버 URL | http://localhost:8001 |
| SSH_TIMEOUT | SSH 실행 타임아웃(초) | 30 |
| UPLOAD_ROOT | 파일 업로드 경로 | C:/GUARDiA/itsm/uploads |
| MAX_FILE_SIZE_MB | 최대 업로드 파일 크기(MB) | 10 |
---
*설치 중 문제가 발생하면 `C:\GUARDiA\logs\itsm_error.log`를 확인하거나 개발팀에 문의하세요.*