--- name: manager-deploy description: > GUARDiA Manager 자체를 서버에 배포하고 CI/CD 파이프라인을 구성하는 스킬. Nginx 설정, systemd 서비스 등록, Gitea 저장소 생성, Jenkinsfile 작성을 포함한다. 트리거: Manager 배포 설정, Nginx 구성, systemd 서비스 등록, CI/CD 파이프라인, Gitea 저장소 생성, Jenkinsfile 작성 요청 시. --- # GUARDiA Manager 배포 스킬 ## 포트 계획 | 서비스 | 포트 | 설명 | |--------|------|------| | GUARDiA ITSM | 8001 | 기존 (변경 금지) | | Spring Boot (홈페이지) | 8082 | 기존 (변경 금지) | | Jenkins | 8080 | 기존 (변경 금지) | | **Manager Frontend** | **8090** | Nginx 신규 | | **Manager Backend** | **8002** | FastAPI 신규 | ## Nginx 설정 (/etc/nginx/sites-available/guardia-manager) ```nginx server { listen 8090; server_name _; # React SPA root /var/www/manager; index index.html; location / { try_files $uri $uri/ /index.html; add_header Cache-Control no-cache; } # Manager Backend API 프록시 location /api/ { proxy_pass http://127.0.0.1:8002; proxy_http_version 1.1; 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 60s; } # GUARDiA ITSM API 프록시 (CORS 우회) location /guardia-api/ { proxy_pass http://127.0.0.1:8001/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 정적 파일 캐시 location ~* \.(js|css|png|jpg|ico|svg|woff2)$ { expires 7d; add_header Cache-Control "public, immutable"; } gzip on; gzip_types text/plain text/css application/javascript application/json; } ``` ## systemd 서비스 (Manager Backend) ```ini # /etc/systemd/system/guardia-manager.service [Unit] Description=GUARDiA Manager API Backend After=network.target guardia.service [Service] User=root WorkingDirectory=/opt/manager/backend EnvironmentFile=-/opt/manager/backend/.env ExecStart=/opt/manager/venv/bin/uvicorn main:app --host 127.0.0.1 --port 8002 --workers 1 Restart=on-failure RestartSec=5 StandardOutput=append:/var/log/guardia-manager/backend.log StandardError=append:/var/log/guardia-manager/backend.log [Install] WantedBy=multi-user.target ``` ## 배포 디렉터리 구조 (서버) ``` /opt/manager/ ├── backend/ ← FastAPI 소스 │ ├── main.py │ ├── .env │ └── routers/ └── venv/ ← Python 가상환경 /var/www/manager/ ← React 빌드 결과물 /var/log/guardia-manager/ └── backend.log ``` ## Jenkinsfile ```groovy pipeline { agent any environment { DEPLOY_FRONTEND = '/var/www/manager' DEPLOY_BACKEND = '/opt/manager/backend' VENV = '/opt/manager/venv' } stages { stage('Checkout') { steps { checkout scm } } stage('Frontend Build') { steps { dir('frontend') { sh 'npm ci --prefer-offline 2>/dev/null || npm install' sh 'npm run build' sh "cp -r dist/. ${DEPLOY_FRONTEND}/" } } } stage('Backend Deploy') { steps { sh """ cp -r backend/. ${DEPLOY_BACKEND}/ ${VENV}/bin/pip install -r ${DEPLOY_BACKEND}/requirements.txt -q systemctl restart guardia-manager sleep 3 systemctl is-active guardia-manager """ } } stage('Health Check') { steps { sh 'curl -sf http://localhost:8002/health | grep ok' sh 'curl -sf http://localhost:8090/ -o /dev/null -w "HTTP %{http_code}"' } } } post { success { echo "Manager 배포 완료" } failure { echo "배포 실패 — 로그 확인" } } } ``` ## 서버 초기 설정 스크립트 ```bash #!/bin/bash # deploy/init_server.sh — 최초 1회 실행 # 디렉터리 생성 mkdir -p /opt/manager/backend /var/www/manager /var/log/guardia-manager # Python 가상환경 python3 -m venv /opt/manager/venv /opt/manager/venv/bin/pip install -r /opt/manager/backend/requirements.txt -q # Nginx 설정 ln -sf /etc/nginx/sites-available/guardia-manager /etc/nginx/sites-enabled/ nginx -t && systemctl reload nginx # systemd 등록 systemctl daemon-reload systemctl enable guardia-manager systemctl start guardia-manager # UFW 포트 오픈 ufw allow 8090/tcp comment 'GUARDiA Manager' ufw allow 8002/tcp comment 'Manager Backend' echo "Manager 초기 설정 완료" echo "접속: http://zioinfo.co.kr:8090" ``` ## Gitea 저장소 생성 ```bash # 서버에서 실행 curl -s -X POST http://localhost:3000/api/v1/user/repos \ -H "Content-Type: application/json" \ -u "zio:Zio@Admin2026!" \ -d '{"name":"guardia-manager","description":"GUARDiA 관리자 시스템","private":false,"auto_init":true}' ```