sync: update from workspace (latest ITSM/CICD/DR changes)

This commit is contained in:
DESKTOP-TKLFCPR\ython 2026-06-03 09:26:44 +09:00
parent d0685384d7
commit 81493e355d

View File

@ -22,6 +22,9 @@ const FEATURE_CATEGORIES = [
{ title: '멀티모달 AI (이미지 분석)', desc: 'llava 모델로 스크린샷·에러 화면 분석. 이미지 → 에러 분류 + SR 자동 생성.' }, { title: '멀티모달 AI (이미지 분석)', desc: 'llava 모델로 스크린샷·에러 화면 분석. 이미지 → 에러 분류 + SR 자동 생성.' },
{ title: 'RPA 봇 + 웹 스크랩핑', desc: '소스 기반 Validation 학습 → 반복 업무 자동화. URL 수집·게시·원복 워크플로우.' }, { title: 'RPA 봇 + 웹 스크랩핑', desc: '소스 기반 Validation 학습 → 반복 업무 자동화. URL 수집·게시·원복 워크플로우.' },
{ title: '스마트 알림 규칙 편집기', desc: '노코드 조건 편집기. SR_CREATED·KPI_BREACH 등 트리거. 무음 시간·다이제스트·AI 중요도 필터.' }, { title: '스마트 알림 규칙 편집기', desc: '노코드 조건 편집기. SR_CREATED·KPI_BREACH 등 트리거. 무음 시간·다이제스트·AI 중요도 필터.' },
{ title: '디자인 SR AI 자동화', desc: 'Ollama llava:7b 비전으로 스크린샷 분석. CSS_CHANGE·ICON_REQUEST 자동 분류. 자연어→CSS/SVG 코드 즉시 생성.' },
{ title: '음성인식 명령 실행', desc: 'expo-speech-recognition 온디바이스 한국어 STT. 폐쇄망 완전 지원. 음성→ITSM 명령 자동 매핑.' },
{ title: '다음명령 제시', desc: 'Ollama 컨텍스트 분석→추천 명령 3개 자동 표시. 사용 이력 학습. Messenger/Mobile App 통합.' },
], ],
}, },
{ {
@ -167,7 +170,13 @@ const FEATURES = [
{ icon:'💼', title:'SaaS 멀티테넌트', desc:'화이트라벨·구독·과금·셀프서비스 포털. 기관별 완전 격리. 1,000+ 기관 지원.' }, { icon:'💼', title:'SaaS 멀티테넌트', desc:'화이트라벨·구독·과금·셀프서비스 포털. 기관별 완전 격리. 1,000+ 기관 지원.' },
{ icon:'📱', title:'APK QR 직접 배포', desc:'Manager에서 APK 업로드 → QR 생성. 스캔 즉시 설치. 앱스토어 불필요. 내부망 배포 최적.' }, { icon:'📱', title:'APK QR 직접 배포', desc:'Manager에서 APK 업로드 → QR 생성. 스캔 즉시 설치. 앱스토어 불필요. 내부망 배포 최적.' },
{ icon:'⚡', title:'배치 SSH + 자산 QR', desc:'수십 서버 동시 SSH 실행·결과 수집. QR 라벨로 자산 실사 체크인 자동화.' }, { icon:'⚡', title:'배치 SSH + 자산 QR', desc:'수십 서버 동시 SSH 실행·결과 수집. QR 라벨로 자산 실사 체크인 자동화.' },
{ icon:'🚀', title:'CI/CD 파이프라인', desc:'Jenkins + Gitea. 5개 시스템 자동 빌드·배포·롤백·알림. 에이전트리스 배포.' }, { icon:'🎨', title:'디자인 AI SR 자동화', desc:'Ollama llava 비전 분석→CSS/SVG 자동 생성. 디자인 SR 90% AI 처리. 스크린샷→개선 제안.' },
{ icon:'🎤', title:'음성인식 + 다음명령 제시', desc:'expo-speech-recognition 온디바이스. 한국어 STT. Messenger 명령 칩 자동 추천.' },
{ icon:'🧠', title:'AI Brain 지능화 엔진', desc:'영구 메모리(pgvector)·자동 스킬·LoRA 파인튜닝·지식 그래프. 운영 경험 누적→자기 개선.' },
{ icon:'🔐', title:'Zero Trust + SBOM + N²SF', desc:'ZTNA 정책·디바이스 신뢰·SBOM CycloneDX·국정원 N²SF 준수. EU CRA 공공 조달 완전 지원.' },
{ icon:'🌱', title:'GreenOps + Edge/IoT', desc:'Scope 2 탄소 추적(EU CSRD)·9.21억 IoT 디바이스. Carbon-aware 스케줄링.' },
{ icon:'🏗️', title:'IDP 개발자 플랫폼', desc:'소프트웨어 카탈로그·Golden Path 템플릿·셀프서비스 포털. 30~50% 배포 단축.' },
{ icon:'🚀', title:'CI/CD 파이프라인', desc:'Jenkins + Gitea. 5개 시스템 자동 빌드·배포·롤백·알림. 서버 빌드 방식.' },
]; ];
const EDITIONS = [ const EDITIONS = [
@ -288,8 +297,8 @@ const TECH_STACK = [
export default function GuardiaDetail() { export default function GuardiaDetail() {
useSeoMeta({ useSeoMeta({
title: 'GUARDiA ITSM — AI 기반 공공기관 인프라 자율 운영 플랫폼 (110+ 기능)', title: 'GUARDiA ITSM — AI 기반 공공기관 인프라 자율 운영 플랫폼 (140+ 기능)',
description: 'GUARDiA ITSM: 810개 API, 110가지 이상 기능. APK QR 배포·배치SSH·자산QR·스마트알림·RAG·Text-to-SQL·CMDB 자동 발견·멀티클라우드·Upstage OCR·Jira·Slack 연동.', description: 'GUARDiA ITSM: 960개 API, 140가지 이상 기능. 디자인 AI SR 자동화·음성인식·영구 메모리·ZTNA·SBOM·N²SF·IDP·GreenOps·Edge IoT. 폐쇄망/개방망 설치 지원.',
path: '/solution/guardia', path: '/solution/guardia',
keywords: 'GUARDiA ITSM, AI ITSM, 공공기관 인프라 자동화, ChatOps, 에이전트리스, RAG 검색, Text-to-SQL, CMDB 자동 발견, 멀티클라우드, 나라장터, Upstage OCR, 구성 드리프트', keywords: 'GUARDiA ITSM, AI ITSM, 공공기관 인프라 자동화, ChatOps, 에이전트리스, RAG 검색, Text-to-SQL, CMDB 자동 발견, 멀티클라우드, 나라장터, Upstage OCR, 구성 드리프트',
image: '/screenshots/01_dashboard.png', image: '/screenshots/01_dashboard.png',
@ -324,8 +333,8 @@ export default function GuardiaDetail() {
<div className="gd-hero-stats"> <div className="gd-hero-stats">
{[ {[
{val:'1,000+', lab:'관리 기관'}, {val:'1,000+', lab:'관리 기관'},
{val:'810+', lab:'API 엔드포인트'}, {val:'960+', lab:'API 엔드포인트'},
{val:'110+', lab:'구현 완료 기능'}, {val:'140+', lab:'구현 완료 기능'},
{val:'0개', lab:'대상 서버 추가 설치'}, {val:'0개', lab:'대상 서버 추가 설치'},
].map((s,i) => ( ].map((s,i) => (
<div key={i} className="gd-stat"> <div key={i} className="gd-stat">
@ -343,12 +352,14 @@ export default function GuardiaDetail() {
<div className="gd-tabs"> <div className="gd-tabs">
{[ {[
{id:'features', label:'핵심 기능'}, {id:'features', label:'핵심 기능'},
{id:'screenshots', label:'화면 미리보기'},
{id:'app', label:'모바일 앱'}, {id:'app', label:'모바일 앱'},
{id:'messenger', label:'Messenger Bot'}, {id:'messenger', label:'Messenger Bot'},
{id:'manager', label:'Manager'}, {id:'manager', label:'Manager'},
{id:'install', label:'설치 가이드'},
{id:'manual', label:'매뉴얼'},
{id:'editions', label:'에디션 비교'}, {id:'editions', label:'에디션 비교'},
{id:'tech', label:'기술 스택'}, {id:'tech', label:'기술 스택'},
{id:'usecase', label:'도입 사례'},
].map(t => ( ].map(t => (
<button key={t.id} <button key={t.id}
className={`gd-tab ${activeTab === t.id ? 'active' : ''}`} className={`gd-tab ${activeTab === t.id ? 'active' : ''}`}
@ -782,6 +793,422 @@ export default function GuardiaDetail() {
</section> </section>
)} )}
{/* ── 화면 미리보기 ─────────────────────────────────────── */}
{activeTab === 'screenshots' && (
<section className="section">
<div className="container">
<div className="section-header">
<span className="section-label">Screenshots</span>
<h2 className="section-title">GUARDiA <em>화면 미리보기</em></h2>
<p className="section-sub">실제 운영 환경의 스크린샷입니다</p>
<div className="divider" />
</div>
<div style={{display:'grid',gridTemplateColumns:'repeat(auto-fit,minmax(320px,1fr))',gap:24}}>
{[
{src:'/screenshots/itsm_main.png', title:'GUARDiA ITSM 대시보드', desc:'SR 현황·서버 상태·KPI 실시간 모니터링'},
{src:'/screenshots/manager_main.png', title:'GUARDiA Manager', desc:'네이버 클라우드 콘솔 스타일 관제 포털'},
{src:'/screenshots/webmail_main.png', title:'GUARDiA Webmail', desc:'Postfix/Dovecot 연동 기업 웹메일'},
{src:'/screenshots/itsm_02_dashboard.png', title:'ITSM 운영 대시보드', desc:'AI 이상 탐지·SLA·KPI 종합 현황'},
{src:'/screenshots/manager_03_servers.png', title:'서버 자산 관리', desc:'CMDB 서버 목록·상태·배포 이력'},
{src:'/screenshots/manager_05_deployments.png', title:'배포 관리', desc:'CI/CD 파이프라인·배포 이력·롤백'},
].map((sc,i) => (
<div key={i} style={{borderRadius:12,overflow:'hidden',border:'1px solid #e2e8f0',boxShadow:'0 2px 12px rgba(0,51,102,.08)'}}>
<div style={{background:'#f1f5f9',height:8,display:'flex',gap:4,padding:'8px 12px',alignItems:'center'}}>
{['#ef4444','#f59e0b','#22c55e'].map(col=><div key={col} style={{width:10,height:10,borderRadius:'50%',background:col}}/>)}
</div>
<img src={sc.src} alt={sc.title} style={{width:'100%',display:'block',objectFit:'cover'}}
onError={e=>{e.target.parentElement.style.display='none'}} />
<div style={{padding:'12px 16px'}}>
<div style={{fontWeight:700,fontSize:14,color:'#003366'}}>{sc.title}</div>
<div style={{fontSize:12,color:'#64748b',marginTop:4}}>{sc.desc}</div>
</div>
</div>
))}
</div>
{/* 신규 기능 하이라이트 */}
<div style={{marginTop:48}}>
<h3 style={{fontSize:22,fontWeight:800,color:'#1e293b',textAlign:'center',marginBottom:24}}>
2026 신규 기능 하이라이트
</h3>
<div style={{display:'grid',gridTemplateColumns:'repeat(auto-fit,minmax(280px,1fr))',gap:16}}>
{[
{icon:'🎨',title:'디자인 AI SR 자동화',badge:'NEW',
desc:'Ollama llava 비전으로 스크린샷 분석. CSS 변경·SVG 아이콘·UI 리뷰를 AI가 자동 처리. 디자인 SR 처리 시간 90% 단축.'},
{icon:'🎤',title:'음성인식 명령 실행',badge:'NEW',
desc:'expo-speech-recognition 온디바이스. 폐쇄망 완전 지원. "서버 상태 확인해줘" → /server status 자동 매핑.'},
{icon:'💡',title:'다음명령 제시 (Smart UX)',badge:'NEW',
desc:'Ollama 대화 컨텍스트 분석→추천 명령 3개. 사용 이력 학습. Messenger Bot·Mobile App 통합.'},
{icon:'🧠',title:'AI 뇌 엔진 (Brain)',badge:'NEW',
desc:'영구 메모리(pgvector)·자동 스킬 발굴·LoRA 파인튜닝·관찰형 AI. 운영 경험 누적→스스로 진화.'},
{icon:'🔐',title:'Zero Trust + SBOM',badge:'NEW',
desc:'ZTNA 정책 엔진·디바이스 신뢰 점수. SBOM CycloneDX 1.4 생성·VEX. EU CRA/공공 조달 준수.'},
{icon:'🌱',title:'GreenOps + Edge IoT',badge:'NEW',
desc:'Scope 2 탄소 배출 추적(EU CSRD). 9.21억 IoT 디바이스 텔레메트리. Carbon-aware 스케줄링.'},
].map((f,i) => (
<div key={i} style={{background:'#fff',border:'1px solid #e2e8f0',borderRadius:12,padding:20,
borderTop:`3px solid #003366`}}>
<div style={{display:'flex',alignItems:'center',gap:8,marginBottom:10}}>
<span style={{fontSize:24}}>{f.icon}</span>
<span style={{fontWeight:700,fontSize:15,color:'#003366'}}>{f.title}</span>
<span style={{background:'#003366',color:'#fff',fontSize:10,padding:'2px 7px',
borderRadius:8,marginLeft:'auto'}}>{f.badge}</span>
</div>
<p style={{fontSize:13,color:'#475569',lineHeight:1.7,margin:0}}>{f.desc}</p>
</div>
))}
</div>
</div>
</div>
</section>
)}
{/* ── 설치 가이드 ──────────────────────────────────────── */}
{activeTab === 'install' && (
<section className="section">
<div className="container">
<div className="section-header">
<span className="section-label">Installation Guide</span>
<h2 className="section-title">GUARDiA <em>설치 가이드</em></h2>
<p className="section-sub">폐쇄망(공공기관 내부망) 개방망 환경별 단계별 설치 방법</p>
<div className="divider" />
</div>
{/* 시스템 요구사항 */}
<div style={{background:'#eff6ff',border:'1px solid #bfdbfe',borderRadius:12,padding:20,marginBottom:32}}>
<h3 style={{fontSize:16,fontWeight:700,color:'#003366',marginBottom:12}}>📋 시스템 요구사항 (공통)</h3>
<div style={{display:'grid',gridTemplateColumns:'repeat(auto-fit,minmax(200px,1fr))',gap:12,fontSize:13}}>
{[
{label:'OS', val:'Ubuntu 22.04 LTS / RHEL 8 이상'},
{label:'CPU', val:'8코어 이상 권장 (4코어 최소)'},
{label:'RAM', val:'16GB 이상 (Ollama 8GB + 서비스 8GB)'},
{label:'GPU', val:'8GB VRAM (LoRA 파인튜닝 시, 선택)'},
{label:'Storage', val:'100GB SSD 이상'},
{label:'Network', val:'내부망 포트: 8443, 8090, 8025, 9001'},
].map(r=>(
<div key={r.label} style={{background:'#fff',padding:'10px 14px',borderRadius:8,border:'1px solid #dbeafe'}}>
<div style={{fontWeight:700,color:'#003366',marginBottom:2}}>{r.label}</div>
<div style={{color:'#374151'}}>{r.val}</div>
</div>
))}
</div>
</div>
<div style={{display:'grid',gridTemplateColumns:'1fr 1fr',gap:32}}>
{/* 폐쇄망 설치 */}
<div>
<div style={{background:'#003366',color:'#fff',borderRadius:'12px 12px 0 0',padding:'16px 20px',display:'flex',alignItems:'center',gap:8}}>
<span style={{fontSize:20}}>🔒</span>
<div>
<div style={{fontSize:16,fontWeight:800}}>폐쇄망 설치</div>
<div style={{fontSize:12,opacity:.8}}>인터넷 차단 공공기관 내부망 환경</div>
</div>
</div>
<div style={{border:'1px solid #e2e8f0',borderTop:'none',borderRadius:'0 0 12px 12px',padding:20}}>
{/* 보안 경고 */}
<div style={{background:'#fef3c7',border:'1px solid #fcd34d',borderRadius:8,padding:12,marginBottom:16,fontSize:12}}>
<strong> 보안 주의사항</strong><br/>
설치 파일 무결성 검증 (SHA-256) 필수<br/>
USB/이동식 미디어 사용 바이러스 검사<br/>
설치 계정은 관리자 전용 (root 사용 비활성화)<br/>
설치 완료 기본 비밀번호 즉시 변경
</div>
{[
{step:'STEP 1', title:'오프라인 패키지 준비 (외부망 PC)',
color:'#003366',
cmds:[
'# 외부망 PC에서 실행',
'pip download -r requirements.txt -d ./packages/',
'ollama pull llama3 && ollama pull llava:7b',
'# Ollama 모델 파일 위치: ~/.ollama/models/',
'tar czf guardia-offline.tar.gz packages/ models/',
]},
{step:'STEP 2', title:'파일 이전 (보안 반입)',
color:'#005A8C',
cmds:[
'# 승인된 이동식 미디어 사용',
'# SHA-256 체크섬 검증 필수',
'sha256sum guardia-offline.tar.gz > checksum.txt',
'# 내부망 서버로 이전 후 검증',
'sha256sum -c checksum.txt',
]},
{step:'STEP 3', title:'의존성 오프라인 설치',
color:'#1d4ed8',
cmds:[
'tar xzf guardia-offline.tar.gz',
'pip install --no-index --find-links=./packages/ \\',
' fastapi sqlalchemy asyncpg pgvector',
'# PostgreSQL (오프라인 deb/rpm 패키지)',
'apt install ./postgresql_16_amd64.deb',
]},
{step:'STEP 4', title:'Ollama 오프라인 모델 설치',
color:'#7c3aed',
cmds:[
'# Ollama 바이너리 설치',
'curl -fsSL https://ollama.ai/install.sh | sh',
'# 오프라인 모델 복사',
'cp -r ./models/ ~/.ollama/',
'ollama list # 모델 확인',
]},
{step:'STEP 5', title:'GUARDiA 서비스 설정',
color:'#059669',
cmds:[
'git clone <내부망-Gitea-URL>/zio/guardia-itsm.git',
'cd guardia-itsm',
'cp .env.closed .env # 폐쇄망 설정',
'# .env 필수 설정:',
'GUARDIA_NETWORK_MODE=closed',
'DATABASE_URL=postgresql+asyncpg://...',
'OLLAMA_BASE_URL=http://localhost:11434',
]},
{step:'STEP 6', title:'서비스 시작 및 보안 강화',
color:'#dc2626',
cmds:[
'systemctl enable --now guardia',
'# 방화벽 설정 (내부망만 허용)',
'ufw allow from 192.168.0.0/16 to any port 8443',
'ufw deny 8443 # 외부 차단',
'# SSL 인증서 (내부 CA 사용)',
'openssl req -x509 -nodes -days 3650 ...',
'# 초기 admin 비밀번호 즉시 변경',
]},
].map((s,i) => (
<div key={i} style={{marginBottom:16}}>
<div style={{display:'flex',alignItems:'center',gap:8,marginBottom:6}}>
<span style={{background:s.color,color:'#fff',fontSize:11,padding:'2px 8px',borderRadius:10,fontWeight:700}}>{s.step}</span>
<span style={{fontWeight:700,fontSize:14,color:'#1e293b'}}>{s.title}</span>
</div>
<pre style={{background:'#0f172a',color:'#e2e8f0',borderRadius:8,padding:12,
fontSize:11,overflowX:'auto',margin:0,lineHeight:1.7}}>
{s.cmds.join('\n')}
</pre>
</div>
))}
</div>
</div>
{/* 개방망 설치 */}
<div>
<div style={{background:'#059669',color:'#fff',borderRadius:'12px 12px 0 0',padding:'16px 20px',display:'flex',alignItems:'center',gap:8}}>
<span style={{fontSize:20}}>🌐</span>
<div>
<div style={{fontSize:16,fontWeight:800}}>개방망 설치</div>
<div style={{fontSize:12,opacity:.8}}>인터넷 연결 가능한 일반 서버 환경</div>
</div>
</div>
<div style={{border:'1px solid #e2e8f0',borderTop:'none',borderRadius:'0 0 12px 12px',padding:20}}>
{/* 보안 경고 */}
<div style={{background:'#fef3c7',border:'1px solid #fcd34d',borderRadius:8,padding:12,marginBottom:16,fontSize:12}}>
<strong> 보안 주의사항</strong><br/>
HTTPS 반드시 적용 (Let's Encrypt 또는 공인 인증서)<br/>
관리 포트(8443, 8090) 방화벽으로 접근 제한<br/>
기본 자격증명 설치 즉시 변경<br/>
정기 보안 패치 적용 (crontab 자동화 권장)
</div>
{[
{step:'STEP 1', title:'시스템 준비 및 의존성 설치',
color:'#059669',
cmds:[
'# Ubuntu 22.04 기준',
'apt update && apt upgrade -y',
'apt install -y python3.11 python3-pip postgresql-16',
' nodejs npm git',
'# Ollama 설치 (on-premise AI)',
'curl -fsSL https://ollama.ai/install.sh | sh',
]},
{step:'STEP 2', title:'Ollama AI 모델 설치',
color:'#0891b2',
cmds:[
'# 필수 모델 (총 약 10GB)',
'ollama pull llama3 # 일반 NLP (4.7GB)',
'ollama pull llava:7b # 비전/이미지 분석',
'ollama pull nomic-embed-text # 임베딩',
'ollama pull codellama:7b # 코드 분석',
'# 서비스 자동 시작',
'systemctl enable --now ollama',
]},
{step:'STEP 3', title:'GUARDiA 소스 설치',
color:'#7c3aed',
cmds:[
'git clone https://github.com/zio/guardia-itsm.git',
'cd guardia-itsm',
'python3 -m venv venv && source venv/bin/activate',
'pip install -r requirements.txt',
'# PostgreSQL DB 초기화',
'createdb guardia_db',
'python3 -c "from database import init_db; init_db()"',
]},
{step:'STEP 4', title:'환경 설정 (.env)',
color:'#d97706',
cmds:[
'cp .env.example .env',
'# 필수 설정 변경:',
'DATABASE_URL=postgresql+asyncpg://user:pass@localhost/guardia_db',
'SECRET_KEY=$(openssl rand -hex 32)',
'AES_KEY=$(openssl rand -hex 16) # 자격증명 암호화',
'OLLAMA_BASE_URL=http://localhost:11434',
'# 보안: 외부 API 호출 완전 금지',
'GUARDIA_NETWORK_MODE=open',
]},
{step:'STEP 5', title:'HTTPS 및 방화벽 설정',
color:'#dc2626',
cmds:[
'# Let\'s Encrypt SSL (도메인 있는 경우)',
'apt install certbot',
'certbot certonly --standalone -d your-domain.go.kr',
'# 방화벽 설정 (필수)',
'ufw allow ssh',
'ufw allow from <허용-IP> to any port 8443',
'ufw allow from <허용-IP> to any port 8090',
'ufw enable',
]},
{step:'STEP 6', title:'서비스 등록 및 시작',
color:'#003366',
cmds:[
'# systemd 서비스 등록',
'cp deploy/guardia.service /etc/systemd/system/',
'systemctl daemon-reload',
'systemctl enable --now guardia',
'# 초기 관리자 계정 설정 (즉시 변경!)',
'python3 manage.py create-admin',
'# 설치 확인',
'curl -k https://localhost:8443/health',
]},
].map((s,i) => (
<div key={i} style={{marginBottom:16}}>
<div style={{display:'flex',alignItems:'center',gap:8,marginBottom:6}}>
<span style={{background:s.color,color:'#fff',fontSize:11,padding:'2px 8px',borderRadius:10,fontWeight:700}}>{s.step}</span>
<span style={{fontWeight:700,fontSize:14,color:'#1e293b'}}>{s.title}</span>
</div>
<pre style={{background:'#0f172a',color:'#e2e8f0',borderRadius:8,padding:12,
fontSize:11,overflowX:'auto',margin:0,lineHeight:1.7}}>
{s.cmds.join('\n')}
</pre>
</div>
))}
</div>
</div>
</div>
{/* 설치 후 확인 사항 */}
<div style={{marginTop:32,background:'#f0fdf4',border:'1px solid #bbf7d0',borderRadius:12,padding:20}}>
<h3 style={{fontSize:16,fontWeight:700,color:'#166534',marginBottom:12}}> 설치 완료 확인 사항</h3>
<div style={{display:'grid',gridTemplateColumns:'repeat(auto-fit,minmax(240px,1fr))',gap:10,fontSize:13}}>
{[
'기본 admin 비밀번호 변경 완료',
'HTTPS 인증서 적용 (유효기간 확인)',
'방화벽 규칙 검토 (불필요 포트 차단)',
'Ollama 모델 정상 로드 (ollama list)',
'PostgreSQL 자동 백업 설정',
'systemd 서비스 자동 시작 등록',
'로그 수집 경로 확인 (/opt/guardia/logs)',
'CSAP 보안 점검 실행 (선택)',
].map((item,i)=>(
<div key={i} style={{display:'flex',alignItems:'center',gap:6,padding:'8px 12px',
background:'#fff',borderRadius:8,border:'1px solid #dcfce7'}}>
<span style={{color:'#16a34a',fontWeight:700}}></span>
<span style={{color:'#374151'}}>{item}</span>
</div>
))}
</div>
</div>
{/* 문의 */}
<div style={{textAlign:'center',marginTop:32,padding:24,background:'#eff6ff',borderRadius:12}}>
<p style={{fontSize:15,color:'#003366',fontWeight:600,marginBottom:8}}>
설치 지원이 필요하신가요?
</p>
<p style={{fontSize:13,color:'#64748b',marginBottom:16}}>
지오정보기술 전문 엔지니어가 기관 환경에 맞는 설치를 지원합니다.
</p>
<Link to="/support/contact?type=install" className="btn btn-primary">
설치 지원 문의
</Link>
</div>
</div>
</section>
)}
{/* ── 매뉴얼 ───────────────────────────────────────────── */}
{activeTab === 'manual' && (
<section className="section">
<div className="container">
<div className="section-header">
<span className="section-label">Manual</span>
<h2 className="section-title">GUARDiA <em>운영 매뉴얼</em></h2>
<p className="section-sub">운영자·엔지니어·관리자별 상세 매뉴얼</p>
<div className="divider" />
</div>
<div style={{display:'grid',gridTemplateColumns:'repeat(auto-fit,minmax(280px,1fr))',gap:20}}>
{[
{icon:'📘', title:'운영자 지침서', no:'04', desc:'일상 운영 절차, SR 관리, 장애 대응, 보안 운영 지침. 16개 섹션 935줄.', tag:'필수'},
{icon:'🚀', title:'설치 가이드 (Linux)', no:'05', desc:'Ubuntu/CentOS/RHEL 환경 설치 절차. 폐쇄망·개방망 별도 가이드 포함.', tag:'설치'},
{icon:'🪟', title:'설치 가이드 (Windows)',no:'06', desc:'Windows Server 환경 WSL2 기반 설치. 방화벽·포트 설정 상세.', tag:'설치'},
{icon:'🔑', title:'라이선스 발급 가이드', no:'14', desc:'커뮤니티·스탠다드·엔터프라이즈 라이선스 키 발급·갱신·관리.', tag:'관리'},
{icon:'🌐', title:'API 명세서', no:'16', desc:'960개+ REST API 엔드포인트 전체 명세. Swagger/OpenAPI 3.0.', tag:'개발'},
{icon:'🛡️', title:'DR 재해복구 가이드', no:'39', desc:'DR 자동화·Failover·네트워크장비·CSAP 운영 가이드 통합본.', tag:'운영'},
{icon:'🔧', title:'CI/CD 파이프라인 가이드',no:'20',desc:'Jenkins·Gitea·deploy_server.py·Webhook 자동 배포 전체 흐름.', tag:'DevOps'},
{icon:'🎨', title:'디자인 AI SR 가이드', no:'44', desc:'디자인 수정 SR AI 자동화. Ollama llava 비전 분석·SVG·CSS 생성 방법.', tag:'NEW'},
].map((m,i)=>(
<div key={i} style={{background:'#fff',border:'1px solid #e2e8f0',borderRadius:12,padding:20,
borderLeft:`4px solid #003366`,transition:'box-shadow .2s'}}>
<div style={{display:'flex',alignItems:'flex-start',gap:10}}>
<span style={{fontSize:28}}>{m.icon}</span>
<div style={{flex:1}}>
<div style={{display:'flex',alignItems:'center',gap:6,marginBottom:4}}>
<span style={{fontWeight:700,fontSize:14,color:'#003366'}}>{m.title}</span>
<span style={{background:m.tag==='NEW'?'#003366':m.tag==='필수'?'#dc2626':'#e2e8f0',
color:m.tag==='NEW'||m.tag==='필수'?'#fff':'#64748b',
fontSize:10,padding:'1px 6px',borderRadius:8,fontWeight:600}}>
{m.tag}
</span>
</div>
<div style={{fontSize:11,color:'#94a3b8',marginBottom:6}}>문서 #{m.no}</div>
<p style={{fontSize:12,color:'#475569',lineHeight:1.6,margin:0}}>{m.desc}</p>
</div>
</div>
</div>
))}
</div>
{/* 매뉴얼 전체 목록 */}
<div style={{marginTop:32,background:'#f8fafc',borderRadius:12,padding:20}}>
<h3 style={{fontSize:15,fontWeight:700,color:'#1e293b',marginBottom:16}}>
📚 전체 매뉴얼 목록 (44 문서)
</h3>
<div style={{display:'grid',gridTemplateColumns:'repeat(auto-fill,minmax(280px,1fr))',gap:8}}>
{[
'01 분석설계서', '02 단위통합테스트계획서', '03 개발자지침서',
'04 운영자지침서 ⭐', '05 설치가이드(Linux)', '06 설치가이드(Windows)',
'07 SI프로젝트관리 분석설계서', '08 AI에이전트 Paperclip 설계서',
'09~13 확장개발 Priority 1~5', '14 라이선스키 발급가이드',
'15 UI Nifty 가이드', '16 API 명세서 ⭐', '17 홈페이지 개발가이드',
'18 zio서버 설치SW 목록', '19 zio서버 운영가이드', '20 CI/CD 가이드',
'33 Messenger 앱스토어 등록', '34 Messenger 개발·배포 가이드',
'39 DR·네트워크·CSAP 운영가이드', '40 바이브코딩 운영가이드',
'41 DB 연결정보', '42 zio서버 SW 구성도', '43 레파지토리 구조 가이드',
'44 신규기능 운영가이드 ⭐ NEW',
].map((doc,i)=>(
<div key={i} style={{fontSize:12,color:'#374151',padding:'6px 10px',
background:'#fff',borderRadius:6,border:'1px solid #e2e8f0'}}>
{doc}
</div>
))}
</div>
<p style={{fontSize:12,color:'#94a3b8',marginTop:12,textAlign:'right'}}>
필수 문서 | 자세한 매뉴얼은 도입 상담 제공됩니다.
</p>
</div>
</div>
</section>
)}
{/* ── CTA ─────────────────────────────────────────────── */} {/* ── CTA ─────────────────────────────────────────────── */}
<section className="gd-cta"> <section className="gd-cta">
<div className="container"> <div className="container">