콘텐츠로 이동

REST API

JWT Bearer 인증과 RBAC를 사용해 Single Edge의 VM, 컨테이너, 스토리지, 네트워크를 자동화한다.
먼저 인증 계약을 확인한 뒤 필요한 예제를 복사해 시작한다.

항목값
Base URLhttp://HOST/api/v1
포트HTTP 80 / HTTPS 443
REST 엔드포인트229+
JSON-RPC 메서드304 (POST /api/v1/rpc)
WebSocket/api/v1/ws/events
인증Authorization: Bearer {JWT} · JWT HS256
CSRF쿠키 세션 미사용. X-CSRF-Token 헤더 없음
Content-Typeapplication/json
압축gzip (Accept-Encoding: gzip)
CORS화이트리스트 기반
성공 응답{"data": ...}
오류 응답{"error": {code, message}}
캐시ETag + max-age=5 (GET) / no-store (POST)
페이지네이션X-Total-Count + Link rel="next/prev"
Correlation ID요청/응답 UUID (X-Correlation-Id)

REST와 JSON-RPC passthrough, WebSocket은 같은 인증 경계를 사용한다.
HOST는 현재 Single Edge 노드 주소로 바꿔 사용한다.

PureCVisor REST API는 쿠키 세션 대신 Authorization header의 Bearer token을 사용한다.

설정된 관리자 계정으로 access token을 발급한다.

Terminal window
curl -X POST /api/v1/auth/token \
-d '{"username":"admin","password":"<configured-admin-password>"}'

모든 보호된 요청에 Bearer token을 전달한다.

Terminal window
curl -H "Authorization: Bearer eyJ..." \
/api/v1/vms

POST 작업도 같은 Authorization header와 역할 검사를 사용한다.

Terminal window
curl -X POST \
-H "Authorization: Bearer eyJ..." \
/api/v1/vms/web-prod/start

access token 만료 후에는 POST /api/v1/auth/refresh에 {"refresh_token":"eyJ..."}를 전송해 갱신한다.

역할레벨권한
VIEWER0읽기 전용(GET). 자신의 브라우저 Push 구독 등록·해지·조회 허용
OPERATOR1VM/컨테이너 운영. VM action은 생성자 범위
ADMIN2전체 관리자

내장 기본 비밀번호가 없다.
첫 로그인 전 daemon.conf 또는 PURECVISOR_ADMIN_PASSWORD로 bootstrap 비밀번호를 설정한다.

OPERATOR는 libvirt domain metadata의 owner가 본인인 VM에만 시작, 중지, 삭제, 스냅샷, VNC, 일괄 작업을 수행할 수 있다.

항목계약
속도 제한600 IP / 1200 유저 / 60 인증
JWT 알고리즘HS256
JWT 만료900s (15min) + refresh 7d
CORS화이트리스트
ETagGET 응답 조건부 캐싱(304)
JWT IP 바인딩선택적 클라이언트 IP 검증
테넌트 오버레이 암호화per-VM WireGuard netns (fail-closed)
hidepid/proc hidepid=2 하드닝(ADR-0028)
SuricataIDS/IPS 심층 패킷 검사(D13)
엔드포인트제한
POST /auth/token60/분
GET /metrics3,600/시간
GET /vms600/분
POST /vms60/분
기타600/분(IP 기본)
유형타임아웃
읽기(GET)8초
쓰기(POST/PUT)30초
장기 작업(migrate, backup)60초
영역경로용도·응답
인증POST /auth/token, POST /auth/refreshaccess/refresh token 발급과 갱신
VMGET/POST /vms, /vms/{name}/start, /stop, DELETE /vms/{name}목록·생성·수명주기. 삭제 상태는 GET /vms/{name}/delete-status
컨테이너GET/POST /containers, /containers/{name}/exec목록·생성·명령 실행
모니터링GET /host/metrics, /processes, /alerts호스트 메트릭·프로세스·알림 히스토리
PrometheusGET /metrics인증 없는 Prometheus 메트릭
HealthGET /health인증 없는 심층 프로브. status와 libvirt, etcd, disk, audit_db, tls, capabilities 하위 상태 반환

Single Edge 공개판은 클러스터 상태, 클러스터 전체 VM, 라이브 마이그레이션 REST 절차를 운영 표면으로 제공하지 않는다.
관련 역사 기록은 docs/adr/와 Multi 범위 문서에서만 확인한다.

HOST와 TOKEN을 현재 Single Edge 환경의 값으로 바꿔 실행한다.

Terminal window
curl -s -H "Authorization: Bearer $TOKEN" \
http://HOST/api/v1/vms | jq
Terminal window
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"web","vcpu":2,"memory_mb":2048,"disk_size_gb":20}' \
http://HOST/api/v1/vms
Terminal window
curl -X POST -H "Authorization: Bearer $TOKEN" \
-d '{"snap_name":"backup-1"}' \
http://HOST/api/v1/vms/web/snapshot/create
Terminal window
curl -X POST -H "Authorization: Bearer $TOKEN" \
-d '{"command":"hostname -I"}' \
http://HOST/api/v1/containers/app-ctr/exec
Terminal window
curl -H "Authorization: Bearer $TOKEN" http://HOST/api/v1/jobs
Terminal window
wscat -c "ws://HOST/api/v1/ws/events?token=$TOKEN"

구독은 3단계다.
GET /push/vapid로 서버 공개키를 받고, 브라우저가 만든 PushSubscription.toJSON()을 POST /push/subscribe로 올리고, POST /push/unsubscribe로 해지한다.
내 구독은 GET /push/mine으로 확인한다.

소유자는 호출자 신원으로 고정된다.
VIEWER도 자기 구독은 등록·해지·조회할 수 있지만 전체 명단, VAPID 회전, 테스트 발송은 ADMIN 전용이다.
발송은 daemon.conf [webpush]의 enabled, min_severity(warn|crit), contact가 결정한다.

iOS Safari는 이 화면을 홈 화면에 PWA로 설치한 경우에만 푸시를 받는다.

요청:

Terminal window
curl -s -H "Authorization: Bearer $TOKEN" \
http://HOST/api/v1/push/vapid

응답:

{"data":{"key":"BN1nZq...(base64url)"}}

요청:

Terminal window
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"endpoint":"https://fcm.googleapis.com/fcm/send/cXY..",
"keys":{"p256dh":"BN1n..","auth":"k9Xz.."}}' \
http://HOST/api/v1/push/subscribe

응답:

{"data":{"status":"subscribed"}}

요청:

Terminal window
curl -X POST -H "Authorization: Bearer $TOKEN" \
-d '{"endpoint":"https://fcm.googleapis.com/fcm/send/cXY.."}' \
http://HOST/api/v1/push/unsubscribe

응답:

{"data":{"status":"unsubscribed"}}

요청:

Terminal window
curl -s -H "Authorization: Bearer $TOKEN" \
http://HOST/api/v1/push/subscriptions

응답:

{"data":{"subscriptions":[
{"username":"admin","endpoint":"https://fcm.googleapis.com/…",
"created_at":1785000000,"last_ok_at":1785003600,"fail_count":0}]}}

14.7.5 VAPID 회전 (ADMIN — 전 구독 폐기)

섹션 제목: “14.7.5 VAPID 회전 (ADMIN — 전 구독 폐기)”

요청:

Terminal window
curl -X POST -H "Authorization: Bearer $TOKEN" \
http://HOST/api/v1/push/vapid/rotate

응답:

{"data":{"revoked":3,"key":"BJ7pQw...(new)"}}

요청:

Terminal window
curl -X POST -H "Authorization: Bearer $TOKEN" \
-d '{"username":"admin"}' \
http://HOST/api/v1/push/test

응답:

{"data":{"status":"queued"}}

테넌트 오버레이, QoS, Suricata, 트레이스 네임스페이스는 RPC 전용이다.
전용 REST 경로, CLI, UI 페이지가 없으며 POST /api/v1/rpc JSON-RPC passthrough로만 호출한다.

14.8.1 테넌트 암호화 오버레이 생성

섹션 제목: “14.8.1 테넌트 암호화 오버레이 생성”
Terminal window
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tenant_overlay.create","params":{"tenant":"acme"},"id":"1"}' \
http://HOST/api/v1/rpc
Terminal window
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"qos.tenant.set","params":{"tenant":"acme","min_mbps":100,"max_mbps":1000},"id":"1"}' \
http://HOST/api/v1/rpc
Terminal window
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"suricata.ips.enable","params":{},"id":"1"}' \
http://HOST/api/v1/rpc
Terminal window
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"debug.trace.start","params":{"timebox_sec":30,"tenant":"acme"},"id":"1"}' \
http://HOST/api/v1/rpc