DiskPushDiskPush

Direct server-to-server transfers

DiskPush orchestrates the job. The file payload goes directly from Server A to Server B. DiskPush does not proxy, relay, stage, or store the transferred files, and neither does your desktop.

What actually happens

┌──────────────────┐
│ DiskPush         │
│ orchestration    │
└────────┬─────────┘
         │ SSH control only
         ▼
┌──────────────────┐      rsync over SSH       ┌──────────────────┐
│ Server A         │ ========================> │ Server B         │
│ source           │       file payload        │ destination      │
└──────────────────┘                           └──────────────────┘

A single rsync process cannot have two remote endpoints. So DiskPush connects to the source host and starts rsync there, with the destination as its remote:

ssh media-01 'rsync --archive --partial-dir=.rsync-partial \
  --human-readable --itemize-changes --info=progress2 \
  /srv/media/ backup-02:/data/media/'

The rsync process on Server A opens its own SSH connection to Server B. The bytes go over that connection. DiskPush holds the control session, reads progress and log output from it, and nothing else.

diskpush --print-args shows both halves separately:

rsync --archive --partial-dir=.rsync-partial ... /srv/media/ backup-02:/data/media/
# control session: ssh -o BatchMode=yes -o StrictHostKeyChecking=accept-new media-01

What crosses your machine

Data Crosses the desktop
Directory listings, for the panes Yes
Progress counters, file names, rsync output, errors Yes
File contents No

Listings and progress are control-plane data: the desktop must render the panes and the progress bar. File payload is not, and does not.

Quoting

ssh host command... always runs the command through the remote user's login shell; it joins its remaining arguments with spaces and hands the result over. There is no way to avoid that shell, so DiskPush quotes for it explicitly: every token of the remote rsync command is POSIX single-quoted, and the whole thing is passed as one argv element.

This is the only shell anywhere in DiskPush, and it is tested with paths containing $(...), backticks, semicolons, spaces and embedded single quotes. Everything else spawns with shell: false and an argument array.

Authentication

Server A has to be able to reach Server B. Three ways, in order of preference:

A key on Server A, authorised on Server B

The straightforward option, and the only one that works unattended. Best done with a key dedicated to this transfer rather than a general-purpose personal key, so its reach is bounded.

A dedicated transfer key

Same as above, but scoped: a key that exists only to move this directory. On Server B, restrict it in authorized_keys:

command="rrsync -wo /data/media",restrict ssh-ed25519 AAAA... diskpush-transfer

Agent forwarding

Opt-in, per connection, and off by default. DiskPush connects to Server A with ssh -A, and the rsync process there authenticates to Server B using your agent, without your private key ever being copied to Server A.

The reason it is off by default: while the job runs, anyone with root on Server A can use your forwarded agent to authenticate as you, anywhere. That is a real cost, and it should be a decision rather than a default.

Preflight

Before a server-to-server job starts, DiskPush checks, in order:

DiskPush → Server A       ok
rsync on Server A         ok 3.2.7
Server A → Server B       ok
rsync on Server B         ok 3.2.7
Destination writable      ok
Direct transfer available ok

Each check runs from the place that matters. "Server A → Server B" is tested by executing ssh -o BatchMode=yes SERVER_B true on Server A, so it reflects Server A's actual network position and credentials rather than yours. BatchMode=yes matters: without it a missing key produces a password prompt into a session nobody is watching, and the check hangs instead of failing.

When it cannot work

If Server A cannot reach or authenticate to Server B, DiskPush says so and stops:

Direct server-to-server transfer is unavailable.
Server A cannot currently connect or authenticate to Server B.

It does not fall back to pulling the files down and pushing them back up. That would be slower, would consume your bandwidth, and would quietly break the guarantee at the top of this page. A desktop-relay mode could exist one day as a feature someone explicitly chooses. It will never be an automatic fallback.

Limits today

If DiskPush exits, the controlling SSH session closes and the remote rsync stops with it. A later version will support a small remote job wrapper so a long transfer survives the desktop disconnecting.

That wrapper stays control-plane only. The payload path remains Server A to Server B; no DiskPush-hosted relay is introduced by it.