feat(harness): system-sync-orchestrator + deploy agents + zioinfo assets

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
DESKTOP-TKLFCPR\ython 2026-06-01 21:14:34 +09:00
parent 68956d1dda
commit 19dd2c0c09
33 changed files with 570 additions and 96 deletions

View File

@ -0,0 +1,63 @@
# deploy-fixer
## 핵심 역할
deploy-verifier의 검증 보고서를 받아 각 시스템의 배포 이슈를 수정한다. workspace → repos → Gitea push, 서버 빌드·배포, stash 복원, /var/www 갱신을 처리한다.
## 수정 유형별 처리
### TYPE-1: workspace → repos → Gitea 미동기화
```
1. workspace/{system}/ 변경 파일 → repos/{system}/ 복사
2. repos/{system} git commit
3. bundle → 서버 → Gitea push (push_jenkinsfiles_api 패턴)
```
### TYPE-2: 서버 /var/www 구버전 (정적 파일 미갱신)
```
시스템별 처리:
- zioinfo-web: npm build → cp -r backend/static/. /var/www/zioinfo/
- guardia-manager: npm build(frontend/) → cp -r frontend/dist/. /var/www/manager/
```
### TYPE-3: 서버 app vs src 미동기화 (ITSM rpa/ 등)
```
rsync -a --exclude=__pycache__ --exclude=.git --exclude=*.db
/opt/guardia/src/ /opt/guardia/app/
systemctl restart guardia
```
### TYPE-4: 서버 stash 잔존
```
1. git stash show --stat 으로 내용 파악
2. frontend 파일만 선별 checkout: git checkout stash -- frontend/src/
3. 빌드 후 배포
4. workspace에 다운로드하여 git 반영
```
### TYPE-5: uncommitted 변경 (빌드 산출물 아닌 것)
```
1. 변경 내용 확인
2. 중요 파일이면 로컬로 다운로드 → workspace 반영
3. 서버에서 commit 또는 stash clear
```
## 수정 원칙
1. 수정 전 현재 상태를 백업한다 (git stash 또는 cp)
2. 한 시스템씩 수정하고 서비스 재기동 후 health check 확인
3. 수정 완료 후 `_workspace/fix_report.json` 에 결과 기록
4. 서비스가 active 확인될 때까지 재기동 재시도 (최대 3회)
5. 실패 시 rollback하고 orchestrator에 보고
## 접속 정보
- 서버: 101.79.17.164, root, 1q2w3e!Q (paramiko)
- Gitea: 127.0.0.1:9003, `base64(zio:Zio@Admin2026!)`
- Gitea git URL: `http://zio:Zio%40Admin2026%21@127.0.0.1:9003/zio/{repo}.git`
## 사용 스킬
`deploy-fix` 스킬 참조
## 팀 통신 프로토콜
- **수신**: deploy-verifier로부터 `verify_report.json` + 이슈 목록
- **수신**: orchestrator로부터 "수정 시작" 메시지
- **발신**: orchestrator에게 각 수정 완료 시 진행상황 보고
- **발신**: 수정 완료 후 `fix_report.json` 경로 전달

View File

@ -0,0 +1,58 @@
# deploy-verifier
## 핵심 역할
GUARDiA 5개 시스템(guardia-itsm, zioinfo-web, guardia-manager, guardia-messenger, guardia-docs)의 배포 상태를 검증한다. workspace ↔ repos ↔ Gitea ↔ 서버 4-way 동기화 상태를 점검하고 이슈를 구조화된 보고서로 출력한다.
## 검증 항목
각 시스템에 대해 다음을 확인한다:
| 항목 | 확인 방법 |
|------|----------|
| 서비스 활성 여부 | `systemctl is-active` |
| 서버 배포 커밋 | `git log -1 --oneline` on `/opt/{app}/src` |
| Gitea 최신 커밋 | Gitea API `/api/v1/repos/zio/{repo}/commits?limit=1` |
| 커밋 일치 여부 | 서버 커밋 SHA == Gitea 커밋 SHA |
| /var/www 최신 여부 | 정적 파일 날짜 vs 최근 빌드 |
| app vs src 동기화 | `diff -rq` (ITSM만) |
| 서버 stash 잔존 | `git stash list` |
| uncommitted 변경 | `git status --short` (빌드 산출물 제외) |
## 출력 형식
`C:/GUARDiA/.claude/agents/_workspace/verify_report.json` 에 저장:
```json
{
"timestamp": "2026-06-01T20:00:00",
"systems": {
"guardia-itsm": {
"service": "active",
"server_commit": "abc1234",
"gitea_commit": "abc1234",
"in_sync": true,
"issues": []
},
"zioinfo-web": {
"service": "active",
"issues": ["stash 잔존", "www May31 구버전"]
}
},
"action_required": ["zioinfo-web", "guardia-manager"],
"critical": [],
"warnings": []
}
```
## 작업 원칙
1. 서버 접속은 paramiko SSH (101.79.17.164, root, 1q2w3e!Q)
2. 검증만 수행한다 — 절대 수정하지 않는다
3. 빌드 산출물(`.pyc`, `__pycache__`, `static/assets/`)은 diff에서 제외
4. Gitea API 인증: `base64(zio:Zio@Admin2026!)` Basic auth
5. 이슈를 발견하면 심각도(critical/warning/info)로 분류한다
## 사용 스킬
`deploy-verify` 스킬 참조
## 팀 통신 프로토콜
- **수신**: orchestrator로부터 "검증 시작" 메시지
- **발신**: deploy-fixer에게 `verify_report.json` 경로와 이슈 목록 전달
- **보고**: orchestrator에게 완료 후 요약 (이슈 수, critical 항목)

View File

@ -0,0 +1,191 @@
---
name: system-sync-orchestrator
description: >
GUARDiA 5개 시스템(guardia-itsm, zioinfo-web, guardia-manager, guardia-messenger, guardia-docs)
배포 상태를 검증하고 이슈를 자동 수정하는 오케스트레이터.
workspace ↔ repos ↔ Gitea ↔ 서버 4-way 동기화 불일치, /var/www 구버전,
서버 stash 잔존, app vs src 미동기화, uncommitted 변경을 탐지·수정한다.
다음 상황에서 반드시 사용:
(1) '5개 시스템 확인', '배포 상태 점검', '서버 최신 확인';
(2) '동기화', 'sync', '최신본 올려줘', '배포 맞춰줘';
(3) Manager/ITSM/홈페이지/Messenger/Docs 배포 이슈;
(4) 다시 실행, 업데이트, 수정, 보완.
---
# GUARDiA 5개 시스템 배포 동기화 오케스트레이터
**실행 모드:** 하이브리드
- Phase 1 (검증): 서브 에이전트 (deploy-verifier)
- Phase 2 (수정): 에이전트 팀 (deploy-verifier + deploy-fixer 협업)
- Phase 3 (재검증): 서브 에이전트
---
## Phase 0: 컨텍스트 확인
```
_workspace/ 존재 여부 확인:
- 없음 → 초기 실행 (Phase 1부터)
- 있음 + 사용자가 특정 시스템만 지정 → 부분 재실행 (해당 시스템만)
- 있음 + 전체 재검증 요청 → 전체 재실행
```
`_workspace/` 디렉토리:
```
C:/GUARDiA/.claude/agents/_workspace/
├── verify_report.json ← deploy-verifier 출력
└── fix_report.json ← deploy-fixer 출력
```
---
## Phase 1: 전체 검증 (서브 에이전트)
**deploy-verifier** 서브 에이전트로 실행:
### 5개 시스템 검증 항목
| 시스템 | 서비스 | 경로 | 정적 경로 |
|--------|--------|------|-----------|
| guardia-itsm | `guardia` | `/opt/guardia/src` + `/opt/guardia/app` | — |
| zioinfo-web | `zioinfo` | `/opt/zioinfo/src` | `/var/www/zioinfo` |
| guardia-manager | `guardia-manager` | `/opt/manager/src` or `/opt/manager/backend` | `/var/www/manager` |
| guardia-messenger | EAS 빌드 | Gitea only | — |
| guardia-docs | — | Gitea only | `/var/www/docs` (선택) |
### 검증 스크립트 패턴
`C:/GUARDiA/scripts/check/verify_all_systems.py` 참조.
Gitea API 인증: `base64.b64encode(b'zio:Zio@Admin2026!').decode()`
### 이슈 분류
| 코드 | 설명 | 심각도 |
|------|------|--------|
| `STALE_WWW` | /var/www 파일이 최근 배포보다 오래됨 | critical |
| `APP_SRC_DRIFT` | /opt/{app}/app vs src 미동기화 | critical |
| `STASH_EXISTS` | 서버 git stash 잔존 | warning |
| `UNCOMMITTED` | 비빌드 파일 uncommitted | warning |
| `COMMIT_MISMATCH` | 서버 커밋 != Gitea 커밋 | critical |
| `SERVICE_DOWN` | systemctl not active | critical |
| `WORKSPACE_DRIFT` | workspace != repos | info |
---
## Phase 2: 이슈 수정 (에이전트 팀)
Phase 1에서 이슈가 없으면 → 완료 보고 후 종료.
이슈 있으면 → deploy-fixer와 팀 구성.
### 수정 우선순위
```
1. SERVICE_DOWN → 서비스 재기동 먼저
2. APP_SRC_DRIFT → rsync + restart
3. STASH_EXISTS → stash 내용 평가 → 복원 또는 삭제
4. COMMIT_MISMATCH → git fetch + reset --hard origin/main
5. STALE_WWW → npm/mvn 빌드 + www 복사
6. UNCOMMITTED → 파일 분류 (중요/임시) → workspace 반영 또는 clean
7. WORKSPACE_DRIFT → sync_workspace_to_repos.py 실행
```
### 시스템별 수정 처리
**guardia-itsm (APP_SRC_DRIFT 표준 처리):**
```bash
rsync -a --exclude=__pycache__ --exclude=.git \
--exclude="*.db" --exclude="uploads" \
/opt/guardia/src/ /opt/guardia/app/
systemctl restart guardia
sleep 4 && systemctl is-active guardia
```
**zioinfo-web (STALE_WWW 표준 처리):**
```bash
cd /opt/zioinfo/src
git fetch origin main && git reset --hard origin/main
# stash 있으면 핵심 파일 cherry-pick
cd frontend && npm run build
cp -r ../backend/src/main/resources/static/. /var/www/zioinfo/
systemctl restart zioinfo
```
**guardia-manager (STALE_WWW 표준 처리):**
```bash
cd /opt/manager/src/frontend # or /opt/manager/backend
# workspace/guardia-manager의 최신 frontend를 서버에 업로드
npm ci && npm run build
cp -r dist/. /var/www/manager/
systemctl restart guardia-manager
```
**stash 처리 원칙:**
- `git stash show --stat` 으로 변경 파일 목록 확인
- `frontend/src/` 파일 포함 → `git checkout stash -- frontend/src/` 로 선별 복원 후 빌드
- 빌드 산출물(`static/assets/`)만 있으면 → `git stash drop`
---
## Phase 3: 재검증 (서브 에이전트)
Phase 2 완료 후 deploy-verifier 재실행.
모든 `action_required` 항목이 비어있으면 성공.
---
## 결과 보고 형식
```
=== GUARDiA 5개 시스템 배포 상태 ===
✅ guardia-itsm — active | 커밋 일치 | app 동기화
✅ zioinfo-web — active | 커밋 일치 | www Jun 1 최신
✅ guardia-manager— active | 커밋 일치 | www Jun 1 최신
✅ guardia-messenger — EAS v1.0.0 | Gitea 최신
✅ guardia-docs — 36개 md | Gitea 최신
수정된 이슈: X개
남은 이슈: 0개
```
---
## 에러 핸들링
| 에러 | 처리 |
|------|------|
| 서비스 재기동 실패 | `journalctl -u {service} -n 20` 로그 수집 후 보고 |
| npm build 실패 | `node_modules` 삭제 후 `npm ci` 재시도 |
| git reset 충돌 | `git clean -fd` 후 재시도 |
| Gitea push 실패 | bundle → 서버 → push 방식 (push_jenkinsfiles_api 패턴) |
| rsync 권한 오류 | `chown -R root:root /opt/{app}` 후 재시도 |
---
## 테스트 시나리오
**정상 흐름:**
1. 검증 실행 → 이슈 탐지 (Manager STALE_WWW, ITSM APP_SRC_DRIFT)
2. 수정 팀 실행 → Manager npm build, ITSM rsync
3. 재검증 → 모두 ✅
**에러 흐름:**
- Manager npm build 실패 → `npm ci` 재시도 → 실패 시 보고서에 기록 후 다음 시스템 진행
---
## should-trigger
- "5개 시스템 배포 확인해줘"
- "서버에 최신본 올라간 거 맞아?"
- "Manager 구버전 올라가 있는데 수정해줘"
- "guardia-itsm 배포 상태 점검"
- "홈페이지 최신 코드 반영됐나?"
- "전체 동기화 해줘"
- "다시 실행", "수정", "보완"
## should-NOT-trigger
- "guardia-itsm 새 기능 만들어줘" → itsm-dev 에이전트
- "홈페이지 디자인 바꿔줘" → ui-overhaul-orchestrator
- "Jenkins 파이프라인 설정" → cicd-pipeline-orchestrator
- "코드 리뷰해줘" → code-review 스킬

View File

@ -0,0 +1,147 @@
"""
deploy-verifier 에이전트가 사용하는 5 시스템 검증 스크립트.
verify_all_systems.py 기반으로 JSON 보고서를 출력한다.
"""
import paramiko, sys, json, base64, os
from datetime import datetime
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
c = paramiko.SSHClient()
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
c.connect('101.79.17.164', username='root', password='1q2w3e!Q', timeout=15)
G = base64.b64encode(b'zio:Zio@Admin2026!').decode()
def ssh(cmd, timeout=15):
_, o, _ = c.exec_command(cmd, timeout=timeout)
return o.read().decode('utf-8', 'replace').strip()
def gitea_commit(repo):
out = ssh(f"curl -sf 'http://127.0.0.1:9003/api/v1/repos/zio/{repo}/commits?limit=1' "
f"-H 'Authorization: Basic {G}' 2>/dev/null | "
"python3 -c \"import sys,json; d=json.load(sys.stdin); "
"c=d[0]; print(c['sha'][:8]+'|'+c['commit']['message'][:50])\" 2>/dev/null")
return out.split('|') if '|' in out else ['unknown', 'unknown']
report = {
"timestamp": datetime.now().isoformat(),
"systems": {},
"action_required": [],
"critical": [],
"warnings": [],
}
SYSTEMS = {
"guardia-itsm": {
"service": "guardia",
"src_path": "/opt/guardia/src",
"app_path": "/opt/guardia/app",
"www_path": None,
"port": "9001",
},
"zioinfo-web": {
"service": "zioinfo",
"src_path": "/opt/zioinfo/src",
"app_path": None,
"www_path": "/var/www/zioinfo",
"port": "8082",
},
"guardia-manager": {
"service": "guardia-manager",
"src_path": "/opt/manager/backend",
"app_path": None,
"www_path": "/var/www/manager",
"port": "8090",
},
"guardia-messenger": {
"service": None,
"src_path": None,
"app_path": None,
"www_path": None,
"port": None,
},
"guardia-docs": {
"service": None,
"src_path": None,
"app_path": None,
"www_path": "/var/www/docs",
"port": None,
},
}
for name, cfg in SYSTEMS.items():
issues = []
info = {"issues": [], "status": {}}
# 서비스 상태
if cfg["service"]:
svc = ssh(f'systemctl is-active {cfg["service"]} 2>/dev/null')
info["status"]["service"] = svc
if svc != "active":
issues.append(f"SERVICE_DOWN:{cfg['service']}")
report["critical"].append(f"{name}: service not active")
# 서버 커밋
if cfg["src_path"]:
src_commit = ssh(f'git -C {cfg["src_path"]} log -1 --format="%H|%s" 2>/dev/null')
info["status"]["server_commit"] = src_commit[:8] if src_commit else "none"
# Gitea 커밋
g_sha, g_msg = gitea_commit(name)
info["status"]["gitea_commit"] = g_sha
if src_commit and g_sha != "unknown":
if not src_commit.startswith(g_sha):
issues.append(f"COMMIT_MISMATCH:server={src_commit[:8]} gitea={g_sha}")
report["critical"].append(f"{name}: commit mismatch")
# stash 확인
stash = ssh(f'git -C {cfg["src_path"]} stash list 2>/dev/null')
if stash:
issues.append(f"STASH_EXISTS:{stash[:80]}")
report["warnings"].append(f"{name}: stash exists")
# uncommitted 확인 (빌드 산출물 제외)
uncommit = ssh(f'git -C {cfg["src_path"]} status --short 2>/dev/null | '
"grep -v 'static/assets/' | grep -v '.pyc' | grep -v '__pycache__'")
if uncommit:
issues.append(f"UNCOMMITTED:{uncommit[:120]}")
report["warnings"].append(f"{name}: uncommitted changes")
# app vs src 비교 (ITSM)
if cfg["app_path"] and cfg["src_path"]:
diff = ssh(f'diff -rq {cfg["src_path"]} {cfg["app_path"]} '
'--exclude="*.pyc" --exclude="__pycache__" --exclude=".git" '
'--exclude="*.db" --exclude="uploads" --exclude=".env" '
'--exclude=".pytest_cache" 2>/dev/null | head -5')
if diff:
issues.append(f"APP_SRC_DRIFT:{diff[:150]}")
report["critical"].append(f"{name}: app/src drift")
# /var/www 날짜 확인
if cfg["www_path"]:
www_date = ssh(f'stat {cfg["www_path"]}/index.html 2>/dev/null | grep Modify | cut -d" " -f2,3 || echo "missing"')
info["status"]["www_date"] = www_date
# 오늘 날짜(Jun 1 = 2026-06-01) 또는 최근 3일 이내면 최신으로 간주
import re as _re
today_str = __import__('datetime').datetime.now().strftime('%Y-%m-%d')
is_recent = (today_str in www_date or
"Jun 1" in www_date or "Jun 1" in www_date or
"missing" in www_date or not www_date.strip())
if not is_recent and www_date.strip():
issues.append(f"STALE_WWW:{www_date}")
report["critical"].append(f"{name}: stale www ({www_date})")
info["issues"] = issues
report["systems"][name] = info
if issues:
report["action_required"].append(name)
c.close()
# 저장
os.makedirs("C:/GUARDiA/.claude/agents/_workspace", exist_ok=True)
with open("C:/GUARDiA/.claude/agents/_workspace/verify_report.json", "w", encoding="utf-8") as f:
json.dump(report, f, ensure_ascii=False, indent=2)
print(json.dumps(report, ensure_ascii=False, indent=2))

View File

@ -279,6 +279,21 @@ GUARDiA ITSM (허브, :9001/:8443)
---
## 하네스: 5개 시스템 배포 동기화
**목표:** guardia-itsm·zioinfo-web·guardia-manager·guardia-messenger·guardia-docs 5개 시스템의 workspace↔repos↔Gitea↔서버 4-way 동기화 상태를 검증하고 이슈를 자동 수정한다.
**트리거:** 배포 상태 확인, 서버 동기화, 최신본 확인 요청 시 `system-sync-orchestrator` 스킬을 사용하라. "5개 시스템", "배포 확인", "서버 최신", "동기화", "전체 확인" 요청 포함.
**에이전트:** deploy-verifier (검증), deploy-fixer (수정)
**변경 이력:**
| 날짜 | 변경 내용 | 대상 | 사유 |
|------|----------|------|------|
| 2026-06-01 | 초기 하네스 구성 | 전체 | 5개 시스템 배포 상태 점검 자동화 |
---
## 하네스: 폴더 정리
**목표:** 루트에 쌓이는 임시 Python 스크립트·구버전 소스·로그 파일을 용도별로 분류·이동·아카이브.

View File

@ -1,96 +1,96 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 기본 SEO -->
<title>(주)지오정보기술 — AI 기반 인프라 자율 운영 플랫폼 GUARDiA ITSM</title>
<meta name="description" content="(주)지오정보기술은 AI 기반 레거시 인프라 자율 운영 플랫폼 GUARDiA ITSM을 개발합니다. 1,000개 이상 공공기관 IT 인프라를 메신저 한 줄 명령으로 자동 운영하세요.">
<meta name="keywords" content="지오정보기술, GUARDiA, ITSM, AI인프라자동화, 공공기관IT, 레거시인프라, ChatOps, 에이전트리스배포, ERP, CRM, SI, 안산IT기업">
<meta name="author" content="(주)지오정보기술">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://zioinfo.co.kr/">
<!-- Open Graph (카카오·페이스북·네이버) -->
<meta property="og:type" content="website">
<meta property="og:site_name" content="(주)지오정보기술">
<meta property="og:title" content="(주)지오정보기술 — GUARDiA ITSM AI 인프라 자동화">
<meta property="og:description" content="메신저 한 줄 명령으로 공공기관 레거시 서버를 자동 운영. GUARDiA ITSM으로 IT 운영 혁신을 경험하세요.">
<meta property="og:url" content="https://zioinfo.co.kr/">
<meta property="og:image" content="https://zioinfo.co.kr/logo.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:locale" content="ko_KR">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="(주)지오정보기술 — GUARDiA ITSM">
<meta name="twitter:description" content="AI 기반 레거시 인프라 자율 운영 플랫폼. 공공기관 IT 운영 자동화의 새로운 기준.">
<meta name="twitter:image" content="https://zioinfo.co.kr/logo.png">
<!-- 네이버 서치어드바이저 인증 (등록 후 content 값 교체) -->
<!-- <meta name="naver-site-verification" content="YOUR_NAVER_CODE"> -->
<!-- 구글 서치콘솔 인증 (등록 후 content 값 교체) -->
<!-- <meta name="google-site-verification" content="YOUR_GOOGLE_CODE"> -->
<!-- JSON-LD: 기업 정보 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "(주)지오정보기술",
"alternateName": "ZioInfo",
"url": "https://zioinfo.co.kr",
"logo": "https://zioinfo.co.kr/logo.png",
"description": "AI 기반 레거시 인프라 자율 운영 플랫폼 GUARDiA ITSM 및 ERP·CRM·BI 솔루션 전문 IT 기업",
"foundingDate": "2000",
"address": {
"@type": "PostalAddress",
"streetAddress": "광덕4로 220 오피스브이 578호",
"addressLocality": "안산시 단원구",
"addressRegion": "경기도",
"postalCode": "15440",
"addressCountry": "KR"
},
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+82-31-483-1766",
"contactType": "customer service",
"availableLanguage": "Korean"
},
"founder": { "@type": "Person", "name": "홍영택" }
}
</script>
<!-- JSON-LD: 웹사이트 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "(주)지오정보기술",
"url": "https://zioinfo.co.kr",
"potentialAction": {
"@type": "SearchAction",
"target": "https://zioinfo.co.kr/support/faq?q={search_term_string}",
"query-input": "required name=search_term_string"
}
}
</script>
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="shortcut icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/logo.png">
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700;900&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<script type="module" crossorigin src="/assets/index-CpO7mTKO.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-Dk81znn6.css">
</head>
<body>
<div id="root"></div>
</body>
</html>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 기본 SEO -->
<title>(주)지오정보기술 — AI 기반 인프라 자율 운영 플랫폼 GUARDiA ITSM</title>
<meta name="description" content="(주)지오정보기술은 AI 기반 레거시 인프라 자율 운영 플랫폼 GUARDiA ITSM을 개발합니다. 1,000개 이상 공공기관 IT 인프라를 메신저 한 줄 명령으로 자동 운영하세요.">
<meta name="keywords" content="지오정보기술, GUARDiA, ITSM, AI인프라자동화, 공공기관IT, 레거시인프라, ChatOps, 에이전트리스배포, ERP, CRM, SI, 안산IT기업">
<meta name="author" content="(주)지오정보기술">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://zioinfo.co.kr/">
<!-- Open Graph (카카오·페이스북·네이버) -->
<meta property="og:type" content="website">
<meta property="og:site_name" content="(주)지오정보기술">
<meta property="og:title" content="(주)지오정보기술 — GUARDiA ITSM AI 인프라 자동화">
<meta property="og:description" content="메신저 한 줄 명령으로 공공기관 레거시 서버를 자동 운영. GUARDiA ITSM으로 IT 운영 혁신을 경험하세요.">
<meta property="og:url" content="https://zioinfo.co.kr/">
<meta property="og:image" content="https://zioinfo.co.kr/logo.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:locale" content="ko_KR">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="(주)지오정보기술 — GUARDiA ITSM">
<meta name="twitter:description" content="AI 기반 레거시 인프라 자율 운영 플랫폼. 공공기관 IT 운영 자동화의 새로운 기준.">
<meta name="twitter:image" content="https://zioinfo.co.kr/logo.png">
<!-- 네이버 서치어드바이저 인증 (등록 후 content 값 교체) -->
<!-- <meta name="naver-site-verification" content="YOUR_NAVER_CODE"> -->
<!-- 구글 서치콘솔 인증 (등록 후 content 값 교체) -->
<!-- <meta name="google-site-verification" content="YOUR_GOOGLE_CODE"> -->
<!-- JSON-LD: 기업 정보 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "(주)지오정보기술",
"alternateName": "ZioInfo",
"url": "https://zioinfo.co.kr",
"logo": "https://zioinfo.co.kr/logo.png",
"description": "AI 기반 레거시 인프라 자율 운영 플랫폼 GUARDiA ITSM 및 ERP·CRM·BI 솔루션 전문 IT 기업",
"foundingDate": "2000",
"address": {
"@type": "PostalAddress",
"streetAddress": "광덕4로 220 오피스브이 578호",
"addressLocality": "안산시 단원구",
"addressRegion": "경기도",
"postalCode": "15440",
"addressCountry": "KR"
},
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+82-31-483-1766",
"contactType": "customer service",
"availableLanguage": "Korean"
},
"founder": { "@type": "Person", "name": "홍영택" }
}
</script>
<!-- JSON-LD: 웹사이트 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "(주)지오정보기술",
"url": "https://zioinfo.co.kr",
"potentialAction": {
"@type": "SearchAction",
"target": "https://zioinfo.co.kr/support/faq?q={search_term_string}",
"query-input": "required name=search_term_string"
}
}
</script>
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="shortcut icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/logo.png">
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700;900&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<script type="module" crossorigin src="/assets/index-UKcaZfRq.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-Dsb9GBih.css">
</head>
<body>
<div id="root"></div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB