It even has nice use-package integration, so if you're already using that you likely won't have to change all your config.
That's one solution.
I've got mine under Git. It's a bit more "work" in that when I upgrade packages (which I don't do all the time) I need to commit what's been deleted/added but I can at any time go back to any past working setup.
Then I just use Git across user accounts / machines to synch my Emacs setup.
Others are using Nix.
> Each time I update all packages something new breaks...
Don't know what's the "proper" way to do it but I upgrade packages manually and never all at once. That is: I never start from an empty Emacs. There are some tradeoffs I guess but I never have to track down which package is problematic and reverting is basically checking out the last commit.
I'm not saying it's the best way to do it but it just works.