My .de domain is hosted on Hetzner, a German hosting company. I have the cheapest web hosting package they offer, called ‘level1’. It doesn’t give you full ssh access, so how can you deploy your (in my case static) page automatically? I came up with the following instructions that worked with my .de domain - no idea where it may differ for other domain endings.
Per default, anything in your
/public_html directory on the Hetzner account is served automatically.
The horribly sluggish konsoleh interface offers a ‘graphical’ WebFTP client under
It is not exactly a modern UI experience.
Copying from local to remote
In short: rsync does not work with ‘level1’ web hosting on Hetzner - probably, because it doesn’t allow proper SSH sessions.
But scp and sftp seem to “work”.
Assuming your local directory is called
scp -r public_html <domain-name-without-.de>@www132.your-server.de:/
Problem: it seems that if a subdirectory does not exist yet on the remote, files in subdirectories cannot be copied.
Alternatively, you can also use OpenSSH’s
sftp drops you in an interactive shell.
sftp has a current local and remote directory.
ls act on the remote directory, while the equivalent
lls acts on the local one.
To copy a local directory to the remote from the
sftp interactive shell:
sftp> put -r public_html /
Make sure the directory name (here
public_html) exists on the remote target, or you’ll get an error message (
Couldn't canonicalize: No such file or directory).
In that case you’d first have to create the remote directory with
Deleting old content
That’s all nice, but I want to have an exact copy of my local directory on the remote - again,
rsync is not an option with my hosting package.
The easiest way to guarantee this, is to simply delete everything under
/public_html on the remote and then re-upload the whole folder.
Currently, this site is so small that this is good enough.
sftp doesn’t seem to offer a feature to recursively delete a directory that is not empty.
There are alternative sftp command line clients that seem to offer such a feature, but at this point I decided to write a Python script instead.
Deployment with a Python script
I use the
paramiko sftp library together with Python.
The code can be found here - it is currently not a great achievement of software architecture, but it works for me.
It first deletes the deployment directory on the remote and then copies everything to the remote server. The script can be run like this:
python3 -m venv venv source venv/bin/activate pip install paramiko python deploy.py LOCAL_DIR_NAME [REMOTE_DIR_NAME]
Maybe I could have just asked Hetzner support for some guidance, but I had fun figuring this out by myself.
If there is an easier way, I’d be glad to hear about it.
Just drop me an email at