I am aware of Capistrano but it is a bit too heavyweight for me. Personally I set up two Mercurial repositories, one on the production server and another on my local dev machine. Regularly, when a new feature is ready, I push changes from repository on my local machine to repository on the server, then update on the server. This is pretty simple and quick way to keep files in sync on several computers, but does not help to update database.
What is your solution to the problem?