Another vote for rsync + simple wrapper script + cron + ssh keys. rsync is brilliant at coping with interruptions, it can guarantee that files match on client and server with checksums. It's fast, it's simple, supports restricting the amount of bandwidth it uses and it's easily scriptable. Wrap it in a shell script to detect failure and retry a certain number of times before informing the user (you). Make sure you setup ssh keys so it can run unattended. Feed the script to cron and tell it to attempt the transfer at some time in the middle of the night.
Bonus points for the wrapper script:
- Have your script detect available bandwidth and only use ~70% of it if you're actively using the computer at the time
- Setup a simple lockfile so that if you it's still running when it tries to run again it will give a useful error
- Maybe have it try once every 2 hours between 2AM and 6AM until it succeeds? (see point above about locking)
I'd be curious if other people are already doing similar things with the above tools.