All of my services run on LXC containers. Some files and configs are backed up to NAS and offsite. The containers are snapshotted in their entirety before I do any work on them. A snapshot takes 5 seconds to make and causes no downtime. If I regret a change or mess it up, I can restore the snapshot in under a minute at the cost of some seconds of downtime.
My only non-container machines are my desktop (doesn't count), my NAS and the Hypervisor. The Hypervisor is very clean and wouldn't be much fuss to reinstall and the NAS is literally just Debian with NFS. All of these have a regular rsync which runs to backup the important files.
The container is reproducible. Container configuration is in version control. That leaves you with the volumes mounted into the container, which you back up like any other disk.
Dunno why ppl are down voting you, this is 100% the way.
Architecture as code is amazing, being able to completely wipe your server, re-install fresh, and turn it on and it goes right back to how it was is awesome.
GitOps version controlled architecture is easy to maintain, easy to rollback, and easy to modify.
I use k8s for my entire homelab, it has some initial learning curve but once you "get it" and have working configs on github, it becomes so trivial to add more stuff to it, scale it up, etc.