The summary.
DEPLOY IN THE SAME ORDER, EVERY TIME
Back up, deploy code, install dependencies, migrate, rebuild caches, restart workers, verify.
Automate it as one command, and document it so it can be performed by hand.
MAKE SCHEMA CHANGES COMPATIBLE WITH BOTH VERSIONS
Add columns before using them, remove them a release later. Never rename in one step.
At no point should the schema be incompatible with running code.
TEST YOUR ROLLBACK
A procedure never exercised will fail when you need it.
Decide in advance the time limit after which you revert rather than continue investigating — under pressure people persist too long.
A COMPLETED DEPLOYMENT IS NOT A WORKING ONE
Verify the paths that matter, not the homepage, and watch error rates for an hour. Problems appear under real traffic.
REBUILD CACHES AS PART OF DEPLOYMENT, ALWAYS
Cached configuration does not re-read its source, which is why changes appear not to take effect.
FEATURE TOGGLES LET YOU DISABLE SOMETHING IN SECONDS
Faster and safer than an emergency deployment. Remove them once the feature is permanent.
A FAILING CHECK IS INFORMATION
Overriding it is how incidents begin.