The old server is a folder until the day you unmount it
The droplet has four years of uploads, a cron folder nobody documented, and an nginx config with the real routes in it. Migrations die in the copying.
You don't copy first. POST /api/v1/backends/sftp on your container's files service registers the old box as a backend: host and credentials: and POST /api/v1/mounts with its backend_id surfaces it under /hoody/mounts/. The mount is a persistent FUSE filesystem; it survives restarts. The old server is now a directory inside the new one.
From the terminal you rsync what matters into /hoody/storage, in passes, while the droplet keeps serving. Every file in the new tree answers ?sha256 at its URL, so the check against the source is a script, not a feeling. When the CNAME moves, you unmount and cancel the droplet.
The migration was a mount, an rsync, and a hash list.