The guys at Cloudkick wrote an an excellent solution to this. It's called Cast, http://cast-project.org/.
Install cast on your server and on your workstation. You start the cast-agent on the server and have your workstation sign with the servers cast instance. You can then create "bundles", upload them to the server, create/upgrade/destroy from them as well as start/stop the your instances. Cast will automatically restart your services when they crash. You can also tail the stdout/strerr remotely as well as get a list of running instances and PID#s and manage your instances/servers from your workstation (no SSHing required). The docs are slightly out of date, but the results are worth the little bit of extra work. All of the interactions/commands are over HTTPS and a RESTful API.
Prior to this I was doing all the upgrades by hand with SCP/SSH. We has supervise keeping things up. We haven't looked back.