I cannot really comment on XCP-ng. I do not know anyone on this forum other than Wendell who used it a bit more extensively. Or maybe I do not remember.
In my own homelab, because I have the knowledge, I just moved to virt-manager and libvirt, because libvirt is a standard. OpenStack, OpenNebula, oVirt, virt-manager, everything uses libvirt and calls virsh
commands through their APIs. Proxmox is the only weird child that uses qm
, their own tooling for controlling qemu/kvm. For lxc, proxmox uses pct
. Not sure how libvirt integrates with lxc-* commands though. I prefer LXD for containers.
Of course, this is not to stop you from doing your own thing. Both Proxmox and XCP-ng should do the job. And although Proxmox uses its own tooling, that doesn’t mean they are incompatible. It is pretty easy to migrate between one another (I moved from OpenNebula to Proxmox 3 years ago at my old workplace and this week I moved from Proxmox to virt-manager in my own homelab).
I would say that you should stick to what you know best, unless you feel like distro-hopping hypervisor-hopping. For just 3 to 10 VMs and especially for just 1 hypervisor, I’d stick to whats simpler, as in, not too complex, which is why I chose virt-manager, but that’s just me. I’m using it from my main PC to connect to my hypervisor box. I know exactly what things I need to run, in this case, libvirtd and lxd and I need nothing else. K.I.S.S.
Now, the question comes whether you want those containers to be LXC or OCI containers (docker / podman / k8s / k3s / microk8s / k0s). For the former, I’d say Proxmox has the advantage with LXC as long as you don’t mind sticking to what images Proxmox provides (arch, centos, alpine, debian, devuan, ubuntu, fedora, alma, rocky, opensuse and all kinds of turnkey images). If you want to go outside of these, good luck, they will probably not boot, because Proxmox won’t recognize them. But the list is pretty extensive. So unless you want something nicher, like void or nixos, then Proxmox should do.
If you want OCI containers, then either will do. If you want a GUI and don’t mind having different management interfaces for OCI containers, use portainer, you can install it on your host OS, a la TrueNAS, or in a VM like people normally do with Proxmox and XCP-ng (because migrating it makes it a lot easier). While I have not used XCP-ng, I’m biased towards RHEL family, even though I used Debian / Ubuntu extensively too. I like Proxmox, but I’m not using it in my homelab anymore. I would probably use XCP-ng and lxd, because lxd has such a sane CLI, I’m kinda sad that more projects are not using lxd. And even sadder that there is no lxd GUI. Well, I would not use it, because lxd is so easy to use via the CLI, but it would boost its popularity if it had at least a cockpit plugin or something.
I don’t like doing this, but the choice is yours to make. As mentioned, if I were you, I’d stick to what you know better or prefer and like using. For me, this was also the case, I moved to virt-manager because I knew it and I highly prefer using my distro of choice. I knew my requirements, I was not planning to necessarily use my homelab in my resume, and I prefer having a portable base OS, libvirt translates to everything. If I want to ditch my distro and jump to something else, I can do it by just copying a few config files, some VM templates and installing libvirt and whateer else I’m using, like nfs or zfs. But it is highly unlikely I will distro-hop any time soon. Which is why I would say you stick to what you prefer and what you want to manage.