My approach is to have the following directory layout:
/corion/App/ -> /corion/App-0.03 # a symlink
Then, when I'm staging App v0.04, I will copy all the files from 0.03 (plus the changes that make 0.04 0.04), stop the server for App v0.03, copy its database (most often, SQLite) to 0.04, and then move the symlink to point to 0.04 and start the (0.04) server again.
That way, I can easily fall back to using 0.03, should my testing have gone wrong or the database migration have gone wrong in some way. I also have now written me a shell script that shows me a diff between the new version directory and the current symlink before it copies the database, so I can do a final review of what changes go live.