Proper way to backup / restore sync gateway?

I think the approach to use cbrestore is the right one.
Can you try using the resync command on the admin port:

curl -vX POST http://localhost:4985/{db}/_resync

This should make SG aware of all the documents again and put the documents back in the right channels. Giving users access through a resync operation might be a bit more complicated (see note below). Are you are using access in your Sync Function?

Note: When running a resync operation, the context in the Sync Function is the admin user. For that reason, calling the requireUser, requireAccess and requireRole methods will always succeed. It is very likely that you are using those functions in production to govern write operations. But in a resync operation, all the documents are already written to the database. For that reason, it is recommended to use resync for changing the assignment to channels only (i.e. reads). Keep in mind that it’s perfectly fine if the Sync Function in a resync operation does not ressemble the Sync Function you expect to use in production. The former is only an intermediary function used in the resync operation and the latter is used to process reads and writes in a production environment.

James