When you need to FTP, but don't want to.
unFTP is an FTP(S) server written in Rust and built on top of libunftp and the Tokio asynchronous run-time. It is unlike your normal FTP server in that it provides:
- Configurable Authentication (e.g. Anonymous, PAM, a JSON file or HTTP).
- Configurable storage back-ends (e.g. GCS or filesystem)
- Configurable notifications (e.g. events over Google Pub/Sub)
- An HTTP server with health endpoints for use for example in Kubernetes for readiness and liveness probes.
- Integration with Prometheus for monitoring.
- A proxy protocol mode for use behind proxies like HA Proxy and Nginx.
- Structured logging and the ability to ship logs to Google Cloud Logging or a Redis instance.
With unFTP, you can present RFC compliant FTP(S) to the outside world while freeing yourself to use modern APIs and techniques on the inside of your perimeter.
unFTP is maintained under the CloudInvoke project by Hannes de Jager and Rob klein Gunnewiek.
User documentation are available on our website unftp.rs
The project contains templated Dockerfiles . To get a list of available commands to create them, run:
make helpWe offer 3 different options for building an unFTP docker image:
scratch: builds the binary in rust:slim and deploys in aFROM scratchimage. The unFTP binary is statically linked using musl libc.alpine(default): builds in rust:slim and deploy in alpine. This image is built with musl instead of a full-blown libc. The unFTP binary is statically linked using musl libc.alpine-debug: same images asalpinebut using the debug build of unftp and adds tools like lftp and CurlFtpFS while also running as root.
To build the alpine docker image:
make docker-image-alpineStarting with v0.16.0, pre-made images will be published to
Docker Hub as cloudinvoke/unftp
and to GitHub Container Registry as ghcr.io/cloudinvoke/unftp.
Older images remain available from the former
Docker Hub repository.
See the Docker section on the unftp.rs website.
The unFTP Cargo.toml file lists features that allows enabling or disabling storage and authentication back-ends.
These are the default ones: "auth_rest", "sbe_gcs", "auth_jsonfile", "sbe_opendal".
The binary called unftp_x86_64-unknown-linux-gnu that we provide via the unFTP GitHub releases also enables
auth_pam.
| Feature | Description |
|---|---|
sbe_azblob |
Enables Azure Blob Storage support via unftp-sbe-opendal. |
sbe_gcs |
Enables Google Cloud Storage support via unftp-sbe-gcs. |
sbe_iso |
Enables serving ISO 9660 images as FTP storage backends via unftp-sbe-iso. |
sbe_opendal |
Enables generic cloud storage support using unftp-sbe-opendal. |
| Feature | Description |
|---|---|
auth_jsonfile |
Enables authentication from a local JSON file via unftp-auth-jsonfile. |
auth_pam |
Enables authentication via PAM using unftp-auth-pam. |
auth_rest |
Enables HTTP-based authentication using unftp-auth-rest. |
Support is given on a best effort basis. You are welcome to engage us on the discussions page or create a Github issue.
You can also follow news and talk to us on Telegram
Make your edits in docs/
If you want to preview the docs:
- Install Doctave as explained in the README at https://github.com/Doctave/doctave
- Run
make site-preview
To publish the documentation, merge your changes, update your local
master, and ensure it has no uncommitted tracked changes. Then run
make site.
This requires Doctave and permission to push to the netlify branch. The
publishing script builds the site, commits the generated files on that
branch, and pushes it; Netlify then deploys unftp.rs.
The script keeps your master checkout and its untracked files intact. If it
fails after building, it leaves site/ for inspection; move or remove that
directory before retrying.
You're free to use, modify and distribute this software under the terms of the Apache-2.0 license.
- libunftp, the primary crate unFTP server is based on.
- libunftp back-ends/extensions on crates.io
