Simplest deploy stack ever: nixos + nix-copy-closure and running an activation script. 30 or so lines of code to setup, less if you use morph[1] or something like that, and there you go. Everything just works, systemd takes care of starting and restarting, rollbacks are fairly easy to do, takes less than 30 seconds after build to run.
[1]: