{"id":20660608,"url":"https://github.com/bolcom/unftp","last_synced_at":"2025-05-15T03:06:17.531Z","repository":{"id":39565895,"uuid":"173338135","full_name":"bolcom/unFTP","owner":"bolcom","description":"A FTP(S) server with a couple of twists written in Rust. Follow and talk to us on https://t.me/unftp. Docs on https://unftp.rs","archived":false,"fork":false,"pushed_at":"2025-04-26T17:55:08.000Z","size":3273,"stargazers_count":287,"open_issues_count":16,"forks_count":23,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-05-15T03:06:09.689Z","etag":null,"topics":["ftp","hacktoberfest","rust","server"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bolcom.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"docs/support.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-03-01T16:57:43.000Z","updated_at":"2025-05-09T07:06:52.000Z","dependencies_parsed_at":"2024-05-08T21:45:27.174Z","dependency_job_id":"b416f32f-4045-4880-aa74-ef100597d80e","html_url":"https://github.com/bolcom/unFTP","commit_stats":{"total_commits":270,"total_committers":15,"mean_commits":18.0,"dds":0.3296296296296296,"last_synced_commit":"83696d180ec94e6bf37875de75af811037bf6bbf"},"previous_names":[],"tags_count":57,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bolcom%2FunFTP","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bolcom%2FunFTP/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bolcom%2FunFTP/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bolcom%2FunFTP/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bolcom","download_url":"https://codeload.github.com/bolcom/unFTP/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254264765,"owners_count":22041793,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ftp","hacktoberfest","rust","server"],"created_at":"2024-11-16T19:05:33.191Z","updated_at":"2025-05-15T03:06:17.513Z","avatar_url":"https://github.com/bolcom.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# unFTP\n\n[![Crate Version](https://img.shields.io/crates/v/unftp.svg)](https://crates.io/crates/unftp)\n[![Build Status](https://github.com/bolcom/unFTP/workflows/build/badge.svg?branch=master)](https://github.com/bolcom/unFTP/actions)\n[![Docker Pulls](https://img.shields.io/docker/pulls/bolcom/unftp.svg?maxAge=2592000?style=plastic)](https://hub.docker.com/r/bolcom/unftp/)\n[![Follow on Telegram](https://img.shields.io/badge/follow%20on-Telegram-brightgreen.svg)](https://t.me/unftp)\n\nWhen you need to FTP, but don't want to.\n\n![logo](logo.png)\n\n[**Website**](https://unftp.rs) | [**Docs**](https://unftp.rs/server) | [**libunftp\n**](https://github.com/bolcom/libunftp)\n\nunFTP is an FTP(S) server written in [Rust](https://www.rust-lang.org) and built on top\nof [libunftp](https://github.com/bolcom/libunftp) and the [Tokio](https://tokio.rs) asynchronous run-time. It is **un**\nlike your normal FTP server in that it provides:\n\n- Configurable Authentication (e.g. Anonymous, [PAM](https://en.wikipedia.org/wiki/Linux_PAM), a JSON file or HTTP).\n- Configurable storage back-ends (e.g. [GCS](https://cloud.google.com/storage/) or filesystem)\n- Configurable notifications (e.g. events over [Google Pub/Sub](https://cloud.google.com/pubsub/docs/overview))\n- An HTTP server with health endpoints for use for example in Kubernetes for readiness and liveness probes.\n- Integration with [Prometheus](https://prometheus.io) for monitoring.\n- A proxy protocol mode for use behind proxies like HA Proxy and Nginx.\n- Structured logging and the ability to ship logs to [Google Cloud Logging](https://cloud.google.com/logging) or a Redis\n  instance.\n\nWith unFTP, you can present RFC compliant FTP(S) to the outside world while freeing yourself to use modern APIs and\ntechniques on the inside of your perimeter.\n\n## Installation and Usage\n\nUser documentation are available on our website [unftp.rs](https://unftp.rs)\n\n## Provided Docker Images\n\nThe project contains templated Dockerfiles . To get a list of available commands to create them, run:\n\n```sh\nmake help\n```\n\nWe offer 3 different options for building an unFTP docker image:\n\n- `scratch`: builds the binary in [rust:slim](https://hub.docker.com/_/rust) and deploys in a `FROM scratch` image. The\n  unFTP binary is statically linked using [musl libc](https://www.musl-libc.org/).\n- `alpine` (default): builds in [rust:slim](https://hub.docker.com/_/rust) and deploy in alpine. This image is built\n  with musl instead of a full-blown libc. The unFTP binary is statically linked\n  using [musl libc](https://www.musl-libc.org/).\n- `alpine-debug`: same images as `alpine` but using the debug build of unftp and adds tools\n  like [lftp](https://lftp.yar.ru/) and [CurlFtpFS](http://curlftpfs.sourceforge.net/) while also running as root.\n\nTo build the alpine docker image:\n\n```sh\nmake docker-image-alpine\n```\n\nAlternatively you can download pre-made images from [docker hub](https://hub.docker.com/r/bolcom/unftp/tags).\n\n## Enabling tokio-console\n\nYou can use [tokio-console](https://github.com/tokio-rs/console) to analyze async tasks running in unFTP. To do this you\nneed to compile a build or run with the `tokio_console` feature enabled while also enabling the `tokio_unstable cfg`.\n\nFor example:\n\n```sh\nRUSTFLAGS=\"--cfg tokio_unstable\" cargo build --features tokio_console\n```\n\nor:\n\n```shell\nRUSTFLAGS=\"--cfg tokio_unstable\" cargo run --features tokio_console -- -vv --auth-type=anonymous\n```\n\nunFTP will listen on default port 6669 for connections from tokio-console.\n\n## Selective compiling\n\nThe unFTP `Cargo.toml` file lists features that allows enabling or disabling storage and authentication back-ends.\n\nThese are the default ones: \"auth_rest\", \"sbe_gcs\", \"auth_jsonfile\", \"sbe_opendal\".\n\nThe binary called `unftp_x86_64-unknown-linux-gnu` that we provide via the unFTP GitHub releases also enables\n`auth_pam`.\n\n### 📦 Storage Back-end Extensions\n\n| Feature       | Description                                                                                                            |\n|---------------|------------------------------------------------------------------------------------------------------------------------|\n| `sbe_azblob`  | Enables Azure Blob Storage support via [`unftp-sbe-opendal`](https://crates.io/crates/unftp-sbe-opendal).              |\n| `sbe_gcs`     | Enables Google Cloud Storage support via [`unftp-sbe-gcs`](https://crates.io/crates/unftp-sbe-gcs).                    |\n| `sbe_iso`     | Enables serving ISO 9660 images as FTP storage backends via [`unftp-sbe-iso`](https://crates.io/crates/unftp-sbe-iso). |\n| `sbe_opendal` | Enables generic cloud storage support using [`unftp-sbe-opendal`](https://crates.io/crates/unftp-sbe-opendal).         |\n\n### 🔐 Auth Back-end Extensions\n\n| Feature         | Description                                                                                                              |\n|-----------------|--------------------------------------------------------------------------------------------------------------------------|\n| `auth_jsonfile` | Enables authentication from a local JSON file via [`unftp-auth-jsonfile`](https://crates.io/crates/unftp-auth-jsonfile). |\n| `auth_pam`      | Enables authentication via PAM using [`unftp-auth-pam`](https://crates.io/crates/unftp-auth-pam).                        |\n| `auth_rest`     | Enables REST-based authentication using [`unftp-auth-rest`](https://crates.io/crates/unftp-auth-rest).                   |\n\n## Getting help and staying informed\n\nSupport is given on a best effort basis. You are welcome to engage us\non [the discussions page](https://github.com/bolcom/unftp/discussions)\nor create a Github issue.\n\nYou can also follow news and talk to us on [Telegram](https://t.me/unftp)\n\n## Updating user documentation\n\nMake your edits in docs/\n\nIf you want to preview the docs:\n\n- Install Doctave as explained in the README at https://github.com/Doctave/doctave\n- Run make site-preview\n\n## License\n\nYou're free to use, modify and distribute this software under the terms of the Apache-2.0 license.\n\n## See also\n\n- [libunftp](https://github.com/bolcom/libunftp), the primary crate unFTP server is based on.\n- [libunftp back-ends/extensions on crates.io](https://crates.io/search?q=unftp-)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbolcom%2Funftp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbolcom%2Funftp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbolcom%2Funftp/lists"}