zioinfo-mail/workspace/zioinfo-web/frontend/src/pages/GuardiaDetail.jsx
DESKTOP-TKLFCPR\ython 7c0472b989 feat(guardia-page): update to v2.0 features + manuals + Jenkins exclude
GuardiaDetail.jsx:
- FEATURES: 8 -> 12 (RPA봇, 스크랩핑, DR, CSAP, 자연어명령 추가)
- BOT_COMMANDS: 19 -> 44 (스크랩봇, CI/CD, PMS, 보안, 디자인 명령어 추가)
- TECH_STACK: Vector DB(pgvector/ChromaDB/LangChain), 자동화봇 추가

Jenkinsfile:
- sparse checkout: manual/ 폴더 체크아웃 제외 (배포 대상 아님)
- workspace/zioinfo-web/Jenkinsfile 동일 적용

Manuals:
- manual/41_zio서버_DB_연결정보.md: PostgreSQL/Gitea/Ollama/ChromaDB/SMTP/SSH
- manual/42_zio서버_소프트웨어_구성도.md: 전체 SW 구성도 + 아키텍처

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 21:10:36 +09:00

604 lines
34 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, { useState } from 'react';
import { Link } from 'react-router-dom';
import './GuardiaDetail.css';
import { useSeoMeta } from '../hooks/useSeoMeta';
const FEATURES = [
{ icon:'🤖', title:'AI 에이전트 자동화',
desc:'Ollama 온프레미스 sLLM 기반. 메신저 한 줄 명령 → 자연어 파싱 → 자동 배포·운영. 외부 API 완전 차단으로 폐쇄망 환경 최적화.' },
{ icon:'🔧', title:'에이전트리스 아키텍처',
desc:'대상 서버에 어떤 소프트웨어도 설치하지 않습니다. 표준 SSH/SFTP 프로토콜만으로 레거시 WAS(Tomcat/JBoss/WebLogic)를 원격 관리.' },
{ icon:'💬', title:'ChatOps + 자연어 명령',
desc:'카카오워크·네이버웍스·슬랙에서 자연어로 인프라 제어. "서버1 헬스체크 해줘", "SR-XXXX 배포해줘" 등 자연어를 자동으로 봇 명령어로 변환.' },
{ icon:'📊', title:'통합 ITSM 대시보드',
desc:'SR·인시던트·변경관리·SLA·CMDB·예측 유지보수를 단일 플랫폼에서 관리. 7일 추이 차트와 AI 인사이트 실시간 제공.' },
{ icon:'🤖', title:'RPA 봇 자동화',
desc:'소스코드 기반 Validation 학습 → 반복 업무(SR 자동 접수·승인·상태 변경) 자동화. dry_run 검증 후 실제 API 호출. APScheduler 크론 연동.' },
{ icon:'🕷️', title:'웹 스크랩핑 봇',
desc:'URL 스크랩 → DB 저장 → 상태 관리(DRAFT/PUBLISHED/DELETED). 게시 시 메신저 자동 알림. Manager UI에서 삭제·원복·게시 직접 관리.' },
{ icon:'🔒', title:'엔터프라이즈 보안',
desc:'AES-256-GCM 암호화, MFA/OTP, PAM 특권접근관리, SHA-256 해시체인 불변 감사로그, Zero Trust 지속 인증.' },
{ icon:'🏗️', title:'PMS 프로젝트 관리',
desc:'WBS·산출물·일간/주간/월간 자동 보고서(Excel·PDF·PPT). 이슈·위험 관리, Gitea 연동, Jenkins CI/CD 파이프라인.' },
{ icon:'🛡️', title:'DR 재해복구 자동화',
desc:'DR 시나리오 관리, Failover 실행, 백업 무결성 검증, 복구 테스트, RTO/RPO 실적 추적. 네트워크 장비(스위치·방화벽) SSH 설정 백업·변경 감지.' },
{ icon:'✅', title:'CSAP 보안 자동 점검',
desc:'행안부 공공기관 보안 체크리스트 100개 항목 자동 점검. 증적 수집·Excel/HTML 보고서 자동 생성. ISMS-P 준수율 대시보드 실시간 제공.' },
{ icon:'🌐', title:'공공기관 필수 준수',
desc:'행안부 SW 보안약점 자동 점검, KWCAG 2.1 웹접근성, 개인정보보호법 준수 스캔. 19개 공공기관 체크리스트 내장.' },
{ icon:'📡', title:'Scouter APM 모니터링',
desc:'Java WAS(Tomcat/JBoss) 전문 APM. CPU·Heap·TPS·응답시간 실시간 수집, 이상 탐지 시 자동 인시던트 생성.' },
];
const EDITIONS = [
{
name: 'COMMUNITY', badge: '무료',
color: '#10B981',
target: '소규모 기관·검토용',
features: ['기본 SR 관리 (무제한)', 'CMDB 서버 20대', '사용자 10명', '대시보드', '봇 기본 명령어'],
cta: '무료 시작',
href: '/support/contact?type=community',
},
{
name: 'STANDARD', badge: '권장',
color: 'var(--primary)',
target: '중형 기관',
features: ['전체 ITSM 기능', 'AI 에이전트 자동화', 'LDAP/AD 연동', 'MFA 보안', 'SLA 관리', 'PMS 기본'],
cta: '도입 문의',
href: '/support/contact?type=standard',
highlight: true,
},
{
name: 'ENTERPRISE', badge: '맞춤',
color: '#6366F1',
target: '대형 관공서·광역기관',
features: ['무제한 서버·기관', '취약점 자동 스캔', 'Scouter APM', 'FinOps 비용 분석', 'SIEM 연동', '전담 기술 지원'],
cta: '전문가 상담',
href: '/support/contact?type=enterprise',
},
];
/* ── 메신저 봇 명령어 목록 ──────────────────────────────── */
const BOT_COMMANDS = [
/* SR 관리 */
{ cmd: '/sr <제목>', desc: 'SR(서비스요청) 즉시 접수', cat: 'SR 관리' },
{ cmd: '/status', desc: '시스템 전체 현황 요약', cat: 'SR 관리' },
{ cmd: '/assign <SR-ID> <담당자>', desc: 'SR 담당자 즉시 배정', cat: 'SR 관리' },
{ cmd: '/approve <SR-ID>', desc: 'SR 또는 자율운영 작업 즉시 승인', cat: 'SR 관리' },
{ cmd: '/reject <SR-ID> [사유]', desc: 'SR 반려', cat: 'SR 관리' },
{ cmd: '/bulk <action> <SR-ID...>', desc: 'SR 대량 처리 (close/assign/status)', cat: 'SR 관리' },
{ cmd: '/sla', desc: 'SLA 위반 현황 목록', cat: 'SR 관리' },
{ cmd: '/escalate <SR-ID>', desc: '당직자에게 에스컬레이션', cat: 'SR 관리' },
/* 인시던트 */
{ cmd: '/incident <제목> [P1~P4]', desc: '인시던트 빠른 등록', cat: '인시던트' },
{ cmd: '/oncall', desc: '현재 당직자 즉시 조회', cat: '인시던트' },
{ cmd: '/rca <INC-ID>', desc: 'AI 자동 RCA 근본원인 분석', cat: '인시던트' },
/* 배포/CI-CD */
{ cmd: '!vibe <SR-ID>', desc: '바이브 코딩 세션 시작', cat: '배포 CI-CD' },
{ cmd: '!build <세션ID>', desc: '빌드 실행', cat: '배포 CI-CD' },
{ cmd: '!deploy <세션ID>', desc: 'WAS 배포 실행 (SSH)', cat: '배포 CI-CD' },
{ cmd: '/rollback <세션ID>', desc: '긴급 롤백', cat: '배포 CI-CD' },
{ cmd: '/cicd [project]', desc: 'Jenkins+Gitea CI/CD 전체 현황', cat: '배포 CI-CD' },
{ cmd: '/jenkins <job> [build|log]', desc: 'Jenkins 빌드 트리거·로그', cat: '배포 CI-CD' },
{ cmd: '/git <repo> [log|pr|branch]', desc: 'Gitea 저장소 정보', cat: '배포 CI-CD' },
{ cmd: '/release <project> [버전]', desc: '릴리즈 배포 파이프라인', cat: '배포 CI-CD' },
/* 인프라 제어 */
{ cmd: '!health <서버명>', desc: '서버 헬스체크', cat: '인프라' },
{ cmd: '!log <서버명>', desc: '서버 로그 분석', cat: '인프라' },
{ cmd: '!sm <서버> <스크립트>', desc: 'SM 원격 스크립트 실행', cat: '인프라' },
{ cmd: '/topology <서버명>', desc: 'CI 의존관계 토폴로지 조회', cat: '인프라' },
{ cmd: '/scouter <서버명>', desc: 'Scouter APM 실시간 메트릭', cat: '인프라' },
/* PMS 프로젝트 */
{ cmd: '/pms <프로젝트코드>', desc: '프로젝트 진척 현황', cat: 'PMS' },
{ cmd: '/report <코드> [daily|weekly|monthly]', desc: '보고서 발송', cat: 'PMS' },
{ cmd: '/wbs <코드>', desc: 'WBS 지연 현황', cat: 'PMS' },
{ cmd: '/deliverables <코드>', desc: '산출물 제출 현황', cat: 'PMS' },
{ cmd: '/issues <코드>', desc: '미결 이슈 목록', cat: 'PMS' },
/* 보안 */
{ cmd: '/scan', desc: '시큐어코딩·보안 자동 점검', cat: '보안' },
{ cmd: '/vuln <서버|IP>', desc: '취약점 스캔', cat: '보안' },
{ cmd: '/checklist', desc: '공공기관 보안 이행 현황', cat: '보안' },
{ cmd: '/perf [url]', desc: '성능·부하 테스트', cat: '보안' },
{ cmd: '/autoq', desc: '자율 운영 승인 대기 목록', cat: '자율 운영' },
/* 스크랩핑 봇 */
{ cmd: '!scrap <url>', desc: 'URL 즉시 스크랩', cat: '스크랩' },
{ cmd: '!scrap list [n]', desc: '최근 스크랩 결과 목록', cat: '스크랩' },
{ cmd: '!scrap publish <id>', desc: '스크랩 게시 + 메신저 알림', cat: '스크랩' },
{ cmd: '!scrap del <id>', desc: '스크랩 삭제', cat: '스크랩' },
{ cmd: '!scrap restore <id>', desc: '스크랩 원복', cat: '스크랩' },
/* 디자인 */
{ cmd: '/design capture', desc: 'UI 현재 화면 스크린샷 (Playwright)', cat: '디자인' },
{ cmd: '/design variant <키워드>', desc: 'Variant 디자인 레퍼런스 탐색', cat: '디자인' },
{ cmd: '/design <시스템>', desc: '시스템별 UI 개편 실행', cat: '디자인' },
/* 공지 */
{ cmd: '/notify <메시지>', desc: '운영팀 전체 공지 발송', cat: '공지' },
{ cmd: '/license', desc: '라이선스 상태 조회', cat: '공지' },
];
const MESSENGER_PLATFORMS = [
{ name: '카카오워크', icon: '💬', color: '#FAE100', textColor: '#3C1E1E', desc: '결재 버튼 + 봇 명령 완벽 지원' },
{ name: '네이버웍스', icon: '🟢', color: '#03C75A', textColor: '#fff', desc: 'Flex 메시지 + Rich 결과 표시' },
{ name: '슬랙', icon: '💜', color: '#611F69', textColor: '#fff', desc: '슬래시 명령 + 블록킷 UI' },
{ name: '자체 메신저', icon: '🔵', color: '#0051A2', textColor: '#fff', desc: 'GUARDiA 내장 Slack형 메신저' },
];
const TECH_STACK = [
{ category: 'Backend', items: ['Python 3.11 / FastAPI', 'SQLAlchemy Async', 'PostgreSQL 16 / SQLite'] },
{ category: 'AI·LLM', items: ['Ollama (온프레미스)', 'llama3:8b / codellama', '외부 API 완전 차단'] },
{ category: 'Vector DB', items: ['pgvector 0.6.0 (PostgreSQL 확장)', 'ChromaDB 1.5.9', 'LangChain 1.3.2 RAG'] },
{ category: '자동화 봇', items: ['RPA Engine (소스 기반 Validation 학습)', '스크랩핑 봇 (BeautifulSoup)', '자연어 명령 파서 (Ollama)'] },
{ category: 'Infra', items: ['paramiko SSH/SFTP', '에이전트리스', 'AES-256-GCM 암호화'] },
{ category: 'Frontend', items: ['React.js / PWA', 'Chart.js 대시보드', 'D3.js 토폴로지'] },
{ category: 'DevOps', items: ['Jenkins CI/CD', 'Gitea 형상관리', 'APScheduler 크론 스케줄러'] },
{ category: '모니터링', items: ['Scouter APM', 'Prometheus/Grafana', 'DR 자동화·CSAP 점검'] },
];
export default function GuardiaDetail() {
useSeoMeta({
title: 'GUARDiA ITSM — AI 기반 레거시 인프라 자율 운영 플랫폼',
description: 'GUARDiA ITSM은 메신저 한 줄 명령으로 공공기관 레거시 서버를 자동 운영합니다. 에이전트 설치 없이 SSH/SFTP로 배포·장애·보안 운영을 완전 자동화.',
path: '/solution/guardia',
keywords: 'GUARDiA ITSM, AI ITSM, 공공기관 인프라 자동화, ChatOps, 에이전트리스, 레거시 서버 자동화',
image: '/screenshots/01_dashboard.png',
});
const [activeTab, setActiveTab] = useState('features');
return (
<main id="main-content" className="guardia-page">
{/* ── 히어로 ────────────────────────────────────────── */}
<section className="gd-hero">
<div className="gd-hero-overlay" />
<div className="container gd-hero-inner">
<div className="gd-hero-text">
<span className="badge badge-new" style={{fontSize:'12px',padding:'4px 12px'}}>NEW v2.0</span>
<h1 className="gd-hero-title">
<span>GUARDiA</span> ITSM
</h1>
<p className="gd-hero-sub">
AI 기반 레거시 인프라 자율 운영 플랫폼<br/>
<strong>메신저 명령</strong> 1,000
</p>
<div className="gd-hero-actions">
<Link to="/support/contact?type=demo" className="btn btn-white btn-lg">
무료 데모 신청
</Link>
<a href="#features" className="btn btn-lg" style={{color:'rgba(255,255,255,.85)',border:'1px solid rgba(255,255,255,.3)'}}>
기능 살펴보기
</a>
</div>
</div>
<div className="gd-hero-stats">
{[
{val:'1,000+', lab:'관리 기관'},
{val:'99.9%', lab:'가용성'},
{val:'70%', lab:'운영 비용 절감'},
{val:'0개', lab:'대상 서버 추가 설치'},
].map((s,i) => (
<div key={i} className="gd-stat">
<div className="gd-stat-val">{s.val}</div>
<div className="gd-stat-lab">{s.lab}</div>
</div>
))}
</div>
</div>
</section>
{/* ── 탭 메뉴 ──────────────────────────────────────── */}
<div className="gd-tabs-bar">
<div className="container">
<div className="gd-tabs">
{[
{id:'features', label:'핵심 기능'},
{id:'app', label:'모바일 앱'},
{id:'messenger', label:'Messenger Bot'},
{id:'manager', label:'Manager'},
{id:'editions', label:'에디션 비교'},
{id:'tech', label:'기술 스택'},
{id:'usecase', label:'도입 사례'},
].map(t => (
<button key={t.id}
className={`gd-tab ${activeTab === t.id ? 'active' : ''}`}
onClick={() => setActiveTab(t.id)}>
{t.label}
</button>
))}
</div>
</div>
</div>
{/* ── 핵심 기능 ─────────────────────────────────────── */}
{activeTab === 'features' && (
<section id="features" className="section">
<div className="container">
<div className="section-header">
<span className="section-label">Core Features</span>
<h2 className="section-title">GUARDiA가 제공하는<br/><em>12가지 핵심 기능</em></h2>
<div className="divider" />
</div>
{/* 실행 화면 스크린샷 */}
{/* GUARDiA ITSM 실행 화면 */}
<div className="section-header" style={{marginBottom:'24px'}}>
<span className="section-label" style={{fontSize:'12px'}}>GUARDiA ITSM</span>
<h3 style={{fontSize:'22px',fontWeight:'700',color:'var(--gray-900)',margin:'8px 0 0'}}>
IT 서비스 관리 플랫폼
</h3>
</div>
<div className="gd-screenshots">
{[
{file:'itsm_02_dashboard', caption:'통합 대시보드 — SR·SLA·AI 인사이트 (실제 화면)'},
{file:'itsm_01_login', caption:'로그인 화면 — JWT + 2FA/OTP 보안'},
{file:'04_incidents', caption:'인시던트 관리 — AI 자동 RCA'},
{file:'05_agents', caption:'AI 에이전트 — Ollama 온프레미스'},
{file:'06_license', caption:'라이선스 관리 — 에디션·체험판'},
].map((s,i) => (
<div key={i} className="screenshot-card">
<img src={`/screenshots/${s.file}.png`} alt={s.caption}
className="screenshot-img"
onError={e=>{e.target.style.display='none';e.target.nextSibling.style.display='flex';}}/>
<div className="screenshot-placeholder" style={{display:'none'}}>
<span className="icon">🖥</span><span> </span>
</div>
<div className="screenshot-caption">{s.caption}</div>
</div>
))}
</div>
{/* GUARDiA Manager 실행 화면 */}
<div className="section-header" style={{marginTop:'48px',marginBottom:'24px'}}>
<span className="section-label" style={{fontSize:'12px'}}>GUARDiA Manager</span>
<h3 style={{fontSize:'22px',fontWeight:'700',color:'var(--gray-900)',margin:'8px 0 0'}}>
통합 관제 관리자 포털
</h3>
</div>
<div className="gd-screenshots">
{[
{file:'07_manager_dashboard', caption:'Manager 대시보드 — 서버·배포·SLA 통합 관제'},
{file:'08_manager_dr', caption:'DR 재해복구 관제 — RTO/RPO 실적 추적'},
{file:'09_manager_network', caption:'네트워크 장비 관제 — 스위치·방화벽 설정 백업'},
{file:'10_manager_csap', caption:'CSAP 보안 점검 — 준수율 자동 대시보드'},
].map((s,i) => (
<div key={i} className="screenshot-card">
<img src={`/screenshots/${s.file}.png`} alt={s.caption}
className="screenshot-img"
onError={e=>{e.target.style.display='none';e.target.nextSibling.style.display='flex';}}/>
<div className="screenshot-placeholder" style={{display:'none'}}>
<span className="icon">🖥</span><span> </span>
</div>
<div className="screenshot-caption">{s.caption}</div>
</div>
))}
</div>
{/* GUARDiA Messenger 모바일 앱 */}
<div className="section-header" style={{marginTop:'48px',marginBottom:'24px'}}>
<span className="section-label" style={{fontSize:'12px'}}>GUARDiA Messenger</span>
<h3 style={{fontSize:'22px',fontWeight:'700',color:'var(--gray-900)',margin:'8px 0 0'}}>
모바일 (Android · iOS)
</h3>
</div>
<div className="gd-screenshots gd-screenshots--mobile">
{[
{file:'06_mobile_home', caption:'홈 대시보드 — SR·서버 상태'},
{file:'02_guardia', caption:'SR 관리 — 등록·처리·승인'},
{file:'05_agents', caption:'AI 챗봇 — 자연어 명령 처리'},
].map((s,i) => (
<div key={i} className="screenshot-card screenshot-card--mobile">
<img src={`/screenshots/${s.file}.png`} alt={s.caption}
className="screenshot-img"
onError={e=>{e.target.style.display='none';e.target.nextSibling.style.display='flex';}}/>
<div className="screenshot-placeholder" style={{display:'none'}}>
<span className="icon">📱</span><span> </span>
</div>
<div className="screenshot-caption">{s.caption}</div>
</div>
))}
</div>
<div className="section-header" style={{marginTop:'60px',marginBottom:'32px'}}>
<h3 style={{fontSize:'28px',fontWeight:'800',color:'var(--gray-900)'}}>핵심 기능 상세</h3>
</div>
<div className="gd-features-grid">
{FEATURES.map((f,i) => (
<div key={i} className="gd-feature-card card">
<div className="gd-feature-icon">{f.icon}</div>
<h3>{f.title}</h3>
<p>{f.desc}</p>
</div>
))}
</div>
</div>
</section>
)}
{/* ── 모바일 앱 ────────────────────────────────────── */}
{activeTab === 'app' && (
<section className="section">
<div className="container">
<div className="section-header">
<span className="section-label">GUARDiA Messenger App</span>
<h2 className="section-title">현장에서 바로<br/><em>스마트폰으로 관제</em></h2>
<div className="divider" />
<p className="section-desc">
Android · iOS 모두 지원. SR 접수·처리, DR 복구 테스트, 네트워크 장비 관제,<br/>
AI 챗봇 명령까지 어디서든 GUARDiA를 손에 쥐세요.
</p>
</div>
<div className="gd-screenshots gd-screenshots--mobile">
{[
{file:'11_app_home', caption:'홈 대시보드 — SR·서버 실시간 현황'},
{file:'12_app_sr', caption:'SR 서비스 요청 — 등록·처리·완료'},
{file:'13_app_chat', caption:'AI 챗봇 — 자연어 명령으로 서버 제어'},
{file:'14_app_dr', caption:'DR 재해복구 — RTO/RPO 실적 모니터링'},
{file:'15_app_network', caption:'네트워크 장비 — 백업·상태 현장 점검'},
].map((s,i) => (
<div key={i} className="screenshot-card screenshot-card--mobile">
<img src={`/screenshots/${s.file}.png`} alt={s.caption}
className="screenshot-img"
onError={e=>{e.target.style.display='none';e.target.nextSibling.style.display='flex';}}/>
<div className="screenshot-placeholder" style={{display:'none'}}>
<span className="icon">📱</span><span> </span>
</div>
<div className="screenshot-caption">{s.caption}</div>
</div>
))}
</div>
{/* 앱 스토어 배지 */}
<div style={{display:'flex',justifyContent:'center',gap:16,marginTop:40}}>
<a href="#" style={{display:'flex',alignItems:'center',gap:10,
padding:'12px 24px',background:'#1e293b',borderRadius:12,
color:'#e2e8f0',textDecoration:'none',border:'1px solid rgba(255,255,255,.1)'}}>
<span style={{fontSize:28}}>🤖</span>
<div><div style={{fontSize:10,opacity:.6}}>다운로드</div><div style={{fontWeight:700,fontSize:15}}>Google Play</div></div>
</a>
<a href="#" style={{display:'flex',alignItems:'center',gap:10,
padding:'12px 24px',background:'#1e293b',borderRadius:12,
color:'#e2e8f0',textDecoration:'none',border:'1px solid rgba(255,255,255,.1)'}}>
<span style={{fontSize:28}}>🍎</span>
<div><div style={{fontSize:10,opacity:.6}}>다운로드</div><div style={{fontWeight:700,fontSize:15}}>App Store</div></div>
</a>
</div>
</div>
</section>
)}
{/* ── 메신저 봇 상세 소개 ──────────────────────────── */}
{activeTab === 'messenger' && (
<section className="section">
<div className="container">
<div className="section-header">
<span className="section-label">ChatOps Messenger</span>
<h2 className="section-title">메신저 하나로<br/><em>모든 인프라를 제어</em></h2>
<div className="divider" />
<p className="section-desc">
익숙한 메신저에서 명령어 하나로 서버 배포·장애 대응·보고서 발송까지.<br/>
GUARDiA Bot은 25 명령어로 IT 운영의 모든 순간을 지원합니다.
</p>
</div>
{/* 지원 플랫폼 */}
<div className="messenger-platforms">
{MESSENGER_PLATFORMS.map((p,i) => (
<div key={i} className="messenger-platform" style={{background: p.color}}>
<span className="platform-icon">{p.icon}</span>
<div>
<strong style={{color: p.textColor}}>{p.name}</strong>
<p style={{color: p.textColor, opacity:.85}}>{p.desc}</p>
</div>
</div>
))}
</div>
{/* 명령어 카탈로그 */}
<div className="cmd-catalog">
<h3 className="cmd-catalog-title">25 명령어 전체 목록</h3>
{['SR 관리','인시던트','배포 제어','PMS','모니터링','보안','공지'].map(cat => {
const cmds = BOT_COMMANDS.filter(c => c.cat === cat);
return (
<div key={cat} className="cmd-group">
<h4 className="cmd-group-title">{cat}</h4>
<div className="cmd-list">
{cmds.map((c,i) => (
<div key={i} className="cmd-item">
<code className="cmd-code">{c.cmd}</code>
<span className="cmd-desc">{c.desc}</span>
</div>
))}
</div>
</div>
);
})}
</div>
{/* 데모 시나리오 */}
<div className="messenger-demo">
<h3 className="demo-title">실제 운영 시나리오</h3>
<div className="demo-scenario">
<div className="demo-step">
<div className="step-num">1</div>
<div className="step-content">
<strong>장애 탐지</strong>
<p>Scouter APM이 서버 CPU 90% 감지 자동으로 GUARDiA 운영 채널에 경보 발송</p>
<div className="chat-bubble bot">🚨 web-01 CPU 90.3% P2 인시던트 자동 등록: INC-20260530-A1B2C3</div>
</div>
</div>
<div className="demo-step">
<div className="step-num">2</div>
<div className="step-content">
<strong>담당자 즉시 대응</strong>
<p>메신저에서 RCA 분석 요청</p>
<div className="chat-bubble user">/rca INC-20260530-A1B2C3</div>
<div className="chat-bubble bot">
🤖 AI RCA 분석 완료<br/>
근본원인: 메모리 누수 (Heap 98%)<br/>
재발방지: WAS 재기동 + 힙덤프 분석<br/>
신뢰도: 87%
</div>
</div>
</div>
<div className="demo-step">
<div className="step-num">3</div>
<div className="step-content">
<strong>원격 조치 실행</strong>
<p>SSH 재기동 명령 실행</p>
<div className="chat-bubble user">!sm web-01 tomcat_restart</div>
<div className="chat-bubble bot">
web-01 Tomcat 재기동 완료<br/>
소요: 38 | CPU: 12% | 정상화
</div>
</div>
</div>
<div className="demo-step">
<div className="step-num">4</div>
<div className="step-content">
<strong>자동 보고</strong>
<p>인시던트 처리 결과 자동 보고서 발송</p>
<div className="chat-bubble user">/notify 22:15 web-01 . : .</div>
<div className="chat-bubble bot"> 운영팀 전체 공지 발송 완료 (ops 채널)</div>
</div>
</div>
</div>
</div>
</div>
</section>
)}
{/* ── GUARDiA Manager ──────────────────────────────── */}
{activeTab === 'manager' && (
<section className="section">
<div className="container">
<div className="section-header">
<span className="section-label">GUARDiA Manager</span>
<h2 className="section-title">통합 관제 관리자 포털<br/><em>네이버 클라우드 콘솔 스타일</em></h2>
<div className="divider" />
<p className="section-desc">
ITSM·서버·배포·네트워크·보안·AI를 하나의 화면에서 관제합니다.<br/>
DR 자동화, 네트워크 장비 설정 백업, CSAP 준수율까지 통합 대시보드로 제공합니다.
</p>
</div>
<div className="gd-screenshots" style={{gridTemplateColumns:'repeat(2,1fr)'}}>
{[
{file:'07_manager_dashboard', caption:'통합 운영 대시보드 — 서버·SR·배포 현황'},
{file:'08_manager_dr', caption:'DR 재해복구 — RTO/RPO 실적 대시보드'},
{file:'09_manager_network', caption:'네트워크 장비 — 설정 백업·변경 감지'},
{file:'10_manager_csap', caption:'CSAP 보안 점검 — 준수율 A~D 등급'},
].map((s,i) => (
<div key={i} className="screenshot-card">
<img src={`/screenshots/${s.file}.png`} alt={s.caption}
className="screenshot-img"
onError={e=>{e.target.style.display='none';e.target.nextSibling.style.display='flex';}}/>
<div className="screenshot-placeholder" style={{display:'none'}}>
<span className="icon">🖥</span><span> </span>
</div>
<div className="screenshot-caption">{s.caption}</div>
</div>
))}
</div>
</div>
</section>
)}
{/* ── 에디션 비교 ──────────────────────────────────── */}
{activeTab === 'editions' && (
<section className="section">
<div className="container">
<div className="section-header">
<span className="section-label">Editions</span>
<h2 className="section-title">기관 규모에 맞는<br/><em>에디션 선택</em></h2>
<div className="divider" />
</div>
<div className="gd-editions-grid">
{EDITIONS.map((e,i) => (
<div key={i} className={`gd-edition-card ${e.highlight ? 'highlight' : ''}`}
style={{'--ed-color': e.color}}>
{e.highlight && <div className="edition-recommend">추천</div>}
<div className="edition-header">
<h3>{e.name}</h3>
<span className="edition-badge">{e.badge}</span>
</div>
<p className="edition-target">{e.target}</p>
<ul className="edition-features">
{e.features.map((f,j) => (
<li key={j}><span className="check"></span>{f}</li>
))}
</ul>
<Link to={e.href} className="btn edition-cta">
{e.cta}
</Link>
</div>
))}
</div>
</div>
</section>
)}
{/* ── 기술 스택 ─────────────────────────────────────── */}
{activeTab === 'tech' && (
<section className="section">
<div className="container">
<div className="section-header">
<span className="section-label">Technology</span>
<h2 className="section-title">검증된<br/><em>기술 스택</em></h2>
<div className="divider" />
<p className="section-desc">온프레미스 전용 설계 외부 클라우드 의존 없는 완전 폐쇄망 동작</p>
</div>
<div className="gd-tech-grid">
{TECH_STACK.map((t,i) => (
<div key={i} className="gd-tech-card card">
<h3 className="tech-category">{t.category}</h3>
<ul className="tech-items">
{t.items.map((item,j) => (
<li key={j}>{item}</li>
))}
</ul>
</div>
))}
</div>
</div>
</section>
)}
{/* ── 도입 사례 ─────────────────────────────────────── */}
{activeTab === 'usecase' && (
<section className="section">
<div className="container">
<div className="section-header">
<span className="section-label">Use Cases</span>
<h2 className="section-title">실제 <em>도입 사례</em></h2>
<div className="divider" />
</div>
<div className="gd-usecases">
{[
{org:'광역 지방자치단체', result:'레거시 서버 200대 SSH 자동화, 운영 인력 3명→1명', badge:'중앙부처'},
{org:'공공기관 IT센터', result:'월간 SR 500건 처리, AI 자동분류로 80% 응답시간 단축', badge:'공공기관'},
{org:'지방 교육청', result:'Tomcat 100대 무중단 배포 자동화, 장애 대응 시간 70% 단축', badge:'교육'},
].map((u,i) => (
<div key={i} className="usecase-card card">
<span className="badge badge-primary">{u.badge}</span>
<h3>{u.org}</h3>
<p>{u.result}</p>
</div>
))}
</div>
</div>
</section>
)}
{/* ── CTA ─────────────────────────────────────────────── */}
<section className="gd-cta">
<div className="container">
<h2>지금 바로 무료 데모를 경험해 보세요</h2>
<p>전문 컨설턴트가 기관 환경에 맞는 최적의 구성을 제안해 드립니다.</p>
<div className="gd-cta-actions">
<Link to="/support/contact?type=demo" className="btn btn-white btn-lg">무료 데모 신청</Link>
<Link to="/support/catalog" className="btn btn-lg" style={{color:'rgba(255,255,255,.8)',border:'1px solid rgba(255,255,255,.3)'}}>제품 소개서</Link>
</div>
</div>
</section>
</main>
);
}