Running and Verification
Operate the self-hosted VM console as a privileged component of the KVM host. Container health alone is insufficient: verify the path from browser to API to libvirt to the guest.
Startup Check
docker compose -f docker-compose.self-hosted.yml ps
docker compose -f docker-compose.self-hosted.yml logs --tail=200 backend frontend
virsh -c qemu:///system list --allThen confirm the UI loads and the backend mode response reports self-hosted mode. Review its feature map rather than assuming a hosted feature is present.
End-to-End Smoke Test
Use a disposable, licensed test ISO:
- upload the ISO and verify its displayed size and name;
- create a small VM with explicit CPU, memory, disk, and network choices;
- start it and open the VNC console;
- confirm boot progress is visible and keyboard input reaches the guest;
- stop the VM;
- delete it and confirm its domain, overlays, and temporary NVRAM are cleaned;
- restart the backend and confirm no stale replacement launch is blocked.
Do not interpret a successful boot as hardware certification, application correctness, patch compliance, or proof that an installer completed.
Operational Signals
Monitor at least:
- frontend and API reachability;
- backend libvirt connectivity;
- free host memory and disk space;
- failed uploads and guest-launch errors;
- guest domains, overlays, NVRAM, and network inventory;
- the persistent cleanup journal under
TEST_STORAGE_DIR; - container restart loops and backend exceptions.
The evaluation Compose file does not configure an external alerting system.
Common Failures
| Symptom | Check |
|---|---|
/dev/kvm permission denied | Host group membership and device mapping; do not make the device world-writable |
| Cannot connect to libvirt | Daemon status, socket path, KVM_URI, and container mount |
| Upload rejected | File type, free space, image-directory permissions, and the configured size limit |
| Guest cannot open source image | Host/container absolute-path identity and read permission |
| VNC disconnects | Guest state, libvirt graphics endpoint, proxy path, and browser console diagnostics |
| Replacement launch remains blocked | Persisted cleanup journal, stale domain/overlay/NVRAM resources, and backend logs |
Shutdown
Stop or delete disposable guests in the UI before stopping the stack. Then run:
docker compose -f docker-compose.self-hosted.yml downInventory libvirt domains, images, networks, and the named volume afterward. Stopping containers does not automatically remove every host-owned resource.