If there's a service/tool that automates a lot of this or makes it safer, I'd be really happy to learn about it!
Of course a database rollback may loose information from any newly created fields.
1) Add a Migration that adds the new field, but allows null. Deploy.
2) Add the field to the model. Also make sure it sets it's default on write. Deploy.
3) Execute a background task to set the field to whatever it's default value should be.
4) Add migrations to enforce integrity and add indexes. Deploy.
5) Actually deploy code that needs the new field.
Yes, this is super annoying, no, most people don't do this. Separating out #1 and #2 means you can always roll back all the way to right after #1 without losing any data. An extra, nullable field on a model with no indices on it shouldn't hurt anything.The problem is with restore. If there is no change in database it is more or less straight forward to download and import the db with the n-1 code tag. But if there are any inserts in database then a migration back should be applied to the latest stand of the database. I can imagine it's going to be a hefty workflow to do.
When deploying new version - backup the transactional db and keep a pointer to the last event in events db. Keep the events db running.
If restoring - restore transactional db backend based on backup and "play back" all events from the events db.
The distinction can also be made using one db and backing up / restoring subset of the tables.