| 데몬 시작 실패 | 소켓 경로 디렉터리 없음 | sudo mkdir -p /var/run/purecvisor |
| REST API 503 | 서킷 브레이커 OPEN | journalctl -u purecvisorsd -f로 libvirt 상태 확인 |
| VM 생성 실패 | 스토리지 풀 미존재 | zfs list 확인, daemon.conf [storage] 검증 |
| 인증 토큰 만료 | 15분 초과 | refresh token으로 갱신 |
| Rate Limit 429 | 요청 빈도 초과 | Retry-After 헤더 참조 |
| WebSocket 끊김 | 300초 유휴 | 클라이언트 ping 구현 |
| VM 삭제 지연 | ZFS 스냅샷 의존성 | vm delete-status 확인 후 스냅샷 정리 |
| VM 삭제 후 ISO가 사라짐 | vm.delete가 CD-ROM ISO <source file>을 파일 디스크로 오인한 회귀 | ADR-0017 기준으로 device='disk' source만 삭제 대상인지 확인하고 최신 데몬 배포 |
| 메모리 누수 의심 | 알 수 없음 | make memcheck-daemon (Valgrind 5초) |
| 빌드 경고 | 헤더 누락/타입 불일치 | make clean && make single 후 경고 확인 |
| /health 느림 | libvirt 장애 (degraded) | virsh list 확인, libvirt 재시작 |
| 컨테이너 IP 없음 | lxc-info 지연 | 시작 후 10초 대기 (IP 할당 폴백) |
Permissions-Policy의 ambient-light-sensor 경고 | 브라우저가 더 이상 인식하지 않는 feature 토큰 | nginx/데몬 보안 헤더에서 해당 토큰 제거 |
| CSP가 Iconify API 접속을 차단 | 외부 아이콘 런타임이 JSON API를 fetch | Iconify 런타임 제거, inline SVG 또는 로컬 아이콘 사용 |
| CSP가 Chart.js sourcemap 접속을 차단 | CDN JS 끝의 sourceMappingURL을 devtools가 요청 | Chart.js를 ui/vendor/에 self-host하고 sourcemap 주석 제거 |
| VNC 화면 진입 시 CSP가 noVNC import를 차단 | noVNC ESM을 jsDelivr에서 동적 import | noVNC를 ui/vendor/novnc/에 self-host하고 로컬 import 사용 |
https://도메인/ui 접근 시 CSS/JS가 401 application/json MIME 오류로 차단됨 | trailing slash 없는 /ui에서 상대 자산이 /style.css, /app.bundle.js처럼 루트 경로로 해석됨 | index.html의 <base href="/ui/">가 배포됐는지 확인하고 /ui/style.css, /ui/app.bundle.js, /ui/manifest.json MIME을 확인 |
#ops-triage 직접 링크가 빈 화면을 보임 | 오래된 라우터가 #/ops-triage만 처리함 | 최신 ui/modules/uxlib.js, app.bundle.js, sw.js를 배포하고 /ui#ops-triage와 /ui#/ops-triage를 모두 확인 |
| 로컬 UI 검사는 통과했지만 공개 사이트 번들에 CDN import가 남음 | 개발 호스트와 공개 운영 서버가 다르거나 공개 서버의 정적 파일이 stale 상태 | 공개 URL의 app.bundle.js 해시를 로컬 산출물과 비교하고 운영 서버 /usr/local/share/purecvisor/ui/app.bundle.js, sw.js를 같은 릴리스로 갱신 |
| Pretendard CSS sourcemap JSON이 표시됨 | jsDelivr가 생성한 외부 CSS sourcemap을 devtools가 요청 | Pretendard CSS/woff2를 ui/vendor/pretendard/로 self-host |
| manifest 아이콘 404 또는 invalid image | icon-192.png 미배포 또는 text/html MIME 응답 | 아이콘 파일 배포, nginx/static MIME을 image/png로 고정 |
WebSocket send on CONNECTING | 전역 소켓 교체 중 이전 onopen이 새 소켓에 send | local WebSocket 인스턴스에만 인증 메시지 전송 |
/api/v1/metrics 401 반복 | UI의 raw metrics fetch에 JWT 누락 | Authorization: Bearer 헤더를 붙이고 non-OK 응답은 조용히 무시 |
| noVNC 새 창의 Reconnect 버튼 무응답 | about:blank 팝업에 document.write()로 만든 문서를 location.reload()로 재연결하려는 회귀 | 팝업 내부 RFB 객체를 disconnect() 후 새 RFB(container, wsUrl)로 재생성 |
| CD/DVD ISO PATH가 비어 보이거나 빈 Mount가 성공 표시됨 | 설정 UI가 cdrom_path를 input에 반영하지 않고 vm.mount_iso가 빈 경로를 거부하지 않음 | cdrom_path를 현재 ISO로 표시하고 빈/상대/없는 ISO path는 RPC에서 거부 |
VM Export OVA 확인창에 <br> 또는 <b> 태그가 그대로 보임 | 오래된 UI 번들 또는 customConfirm() 호출부가 HTML 조각을 메시지로 전달한 회귀 | 최신 UI 번들을 배포하고 공개 URL의 app.bundle.js 해시를 확인한다. 호출부는 plain text와 \n만 넘긴다 |
대시보드 > 요약 > VM에서 디스크 사용량 버튼이 보이지 않음 | 공개 도메인이 오래된 UI 번들을 서빙하거나 표준/호환 도메인이 서로 다른 서버를 바라봄 | purecvisor.example.com와 purecvisor-compat.example.com의 app.bundle.js, sw.js 해시를 로컬 산출물과 비교하고 두 운영 서버를 같은 릴리스로 재배포한다 |
vm.clone accepted 후 clone VM이 생성되지 않음 | 오래된 배포본이 실제 libvirt disk source 대신 daemon.conf [storage].zvol_pool 기본값으로 target zvol을 추정 | 최신 데몬으로 재배포하고 accepted 응답의 source_disk/target_disk가 실제 XML disk source와 일치하는지 확인 |
vm.clone 후 worker CPU가 높게 유지됨 | 오래된 MAC 치환 루프가 새로 생성한 <mac address='...'>를 다시 매칭해 무한 반복 | one-pass g_regex_replace_eval() 기반 수정본을 배포하고 orphan zvol/snapshot을 정리한 뒤 재시도 |
일반 VM vm.clone이 libguestfs 도구 없음으로 거부됨 | host에 libguestfs-tools가 설치되지 않아 virt-sysprep, virt-customize, virt-filesystems, guestfish를 실행할 수 없음 | libguestfs-tools 설치 후 재시도하거나, 운영자가 이미 정리한 템플릿이면 template_prepared=true로 호출 |
vm.clone이 source power on으로 거부됨 | 실행 중인 VM의 디스크와 guest identity를 복제하면 일관성을 보장할 수 없음 | source VM을 종료한 뒤 재시도. qcow2/raw는 mode=full 사용 |