title: rsync
---
summary: Automatic deployments with SSH and rsync.
---
body:

`rsync://username@server/path/to/folder`

This deploys via SSH and rsync to a remote server.  This is the recommended
way to deploy if the system supports it as it is a very fast and reliable
way.  It uses the system's SSH config so for authentication just configure
SSH as you would normally do.  The `username` part is optional and defaults
to the current user that is signed into the machine or whatever is picked up
as default from the `.ssh/config`.

## Example

```ini
[servers.production]
target = rsync://deploy@example.com/var/www/example.com
```

## Credentials

The `rsync` deploy method supports both username and password parameter
though it's recommended to use `.ssh/config` and an SSH agent to secure
the deployment.  The `--password` parameter is not supported!  Instead you
need to use `--key-file` (`LEKTOR_DEPLOY_KEY_FILE`) or `--key`
(`LEKTOR_DEPLOY_KEY`).  The `--key-file` is the path to an OpenSSH private
key.

If you are using `--key` you can directly copy paste the contents of a key
into a string.  This is useful if you want to use it as an environment
variable.  The format for the string is `KEY_TYPE:BASE64` where `KEY_TYPE`
is the type of the key (`RSA`, `EC`, etc.) and `BASE64` is the base64 encoded
private key without newlines or whitespace.  To find out which type your
key is look at the first line of the key marker.  For instance `BEGIN EC
PRIVATE KEY` indicates an `EC` key.  If no key type is defined `RSA` is
assumed.

## Deletion Support

!! New in version 3.2.

To keep two directories truly in sync when deploying with `rsync`,
it's necessary to explicitly tell `rsync` to remove files or directories
on target that don't exist on source anymore. This can be done using the
`?delete` URL parameter:

```ini
[servers.production]
target = rsync://server/path/to/folder?delete
```

If the parameter is provided Lektor will issue a `rsync --delete-delay`,
which performs deletions after all other transfers ended, and only in case
there were no failures.

!!!! Note that the `?delete` option will remove **any file or directory**
on target that does not exist on source. This means that if you have files
in the target tree that are not managed by lektor, they will get removed.

## Exclusion Support

You can exclude items from being synced by using one or more `exclude`
parameters. This is also useful in combination with `delete` to prevent
removal of files in the target tree that are not managed by lektor:

```ini
[servers.production]
target = rsync://server/path/to/folder?delete&exclude=target_item_1&exclude=target_item_2
```
