Ben,
I minimize downtime as much as possible by doing things in
advance like copying all of the new files to a staging area on
the PROD system, automatically inserting PROD passwords,
running collectstatic, dumping the DB in case of problems,
etc. Then, I put up the maintenance page, quickly rsync the
new files into place, run migrations, and hide the maintenance
page.
We used to shoot for releases with no downtime by copying
the *.py files into place, and letting Django notice and re-load
the *.pyc files automatically, but we ran onto some strange
issues sometimes. Seems like Django continued to use some
of the cached *.pyc files for a while.
It's worked out better to always delete all *.pyc files before
rsyncing the *.py files into place, and to always restart the
Apache server just before hiding the maintenance page, so
we're sure everything gets reloaded cleanly.
This has also been a good idea as we've added more caching:
- Template files
- Fully assembled pages
- DB data
- etc.
Hope this helps,