Have a production and development branch and let your server periodically update from the production one. Eg. at 0200 in the morning, via cron. Develop on the master and once you’ve tested your work enough, push the changes to the production branch. Then either wait for it to get picked up or run the cron task manually.
Via whatever cron tab the server is using. For example, cpanel has something exposed with standard syntax. If you don’t have good enough access to set that up, you could trigger it from a microservice of your own (also, most CMSes implement their own cron in software), running on your own computers if needed.