Il server in locale ha accesso ftp? Il server remoto che tipo è? Dedicato o condiviso?

Io solitamente faccio così:

Creo un repo git con 2 branch, puoi chiamarle master e stable, oppure dev e master... cambia poco, su una ci sviluppi e sull'altra ci passi solo il codice che deve andare in produzione (puoi farlo anche con un solo branch e utilizzando i tag ma non mettiamo troppa carne al fuoco).

Sviluppo la versione "dev" in locale utilizzando docker
In questo passaggio carico i file su docker tramite ftp utilizzando l'estensione per il sync automatico presente nel mio IDE (sono diverse, ma ogni ide ne ha almeno una). Queste modifiche le salvo nel branch di sviluppo. Al commit, tramite un sistema di ci/cd carico le modifiche sul server di test (puoi usare rsync per caricare solo i file modificati).

Se va tutto bene faccio il merge del branch dev sul branch stable, a quel punto sempre tramite il sistema di ci/cd carico le modifiche sul server in produzione.

Così a primo impatto può sembrare complicato (devi conoscere git e i sistemi ci/cd, se poi ti servono info chiedi pure) ma una volta che hai capito come configurare il sistema di ci/cd hai fatto il 90% del lavoro, e poi la configurazione ti rimane la stessa per tutti i progetti, quindi ci perdi solo un po' di tempo all'inizio.