Need help with ftpserver?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

fclairamb
139 Stars 26 Forks MIT License 1.3K Commits 1 Opened issues

Description

Golang based autonomous FTP server with SFTP, S3, Dropbox, and Google Drive connectors.

Services available

!
?

Need anything else?

Contributors list

Golang FTP Server

Build Cross Build Docker Image Docker test Docker downloads Go Report Card GoDoc

This FTP server is a gateway between old-school FTP devices and modern cloud based file systems, using the afero's Fs interface and acting as a reference implementation of the ftpserverlib.

At the current stage, supported backend are: - Local disk - S3 through afero-s3 - Dropbox (see doc) through afero-dropbox - Google Drive (see doc) through afero-gdrive - SFTP through afero's sftpfs - Email through go-mail thanks to @x-way

And with those are supported common parameters to switch them to read-only, enable logging access, or use a temporary directory file (see doc).

Current status of the project

Features

FTP protocol

These features are brought by ftpserverlib itself:

  • Uploading and downloading files
  • Directory listing (LIST + MLST)
  • File and directory deletion and renaming
  • TLS support (AUTH + PROT)
  • File download/upload resume support (REST)
  • Complete driver for all the above features
  • Passive socket connections (EPSV and PASV commands)
  • Active socket connections (PORT command)
  • Small memory footprint
  • Only relies on the standard library except for:
  • Supported extensions:
    • AUTH - Control session protection
    • AUTH TLS - TLS session
    • PROT - Transfer protection
    • MDTM - File Modification Time
    • SIZE - Size of a file
    • REST - Restart of interrupted transfer
    • MLST - Simple file listing for machine processing
    • MLSD - Directory listing for machine processing

Getting started

Get it

Download it

Fetch a binary from the latest release and run it.

Build it

go install github.com/fclairamb/[email protected]

Run it with docker

There's also a containerized version of the server (31MB, based on alpine).

# Starting the sample FTP server
docker run --rm -d -p 2121-2130:2121-2130 -v ./ftpserver/files:/tmp -v ./ftpserver:/app fclairamb/ftpserver

Download some file

[ -f kitty.jpg ] || (curl -o kitty.jpg.tmp https://placekitten.com/2048/2048 && mv kitty.jpg.tmp kitty.jpg)

Upload it

curl -v -T kitty.jpg ftp://test:[email protected]:2121/

Download it back

curl ftp://test:[email protected]host:2121/kitty.jpg -o kitty2.jpg

Compare it

diff kitty.jpg kitty2.jpg

Run it with docker compose

# docker-compose.yml

version: '3.3' services: ftpserver: ports: - '2121-2130:2121-2130' volumes: - ./ftpserver/files:/tmp - ./ftpserver:/app image: fclairamb/ftpserver

docker-compose up -d

Test it

This is a quick way to see if it's working correctly:

# Download some file
[ -f kitty.jpg ] || (curl -o kitty.jpg.tmp https://placekitten.com/2048/2048 && mv kitty.jpg.tmp kitty.jpg)

Upload it to the server

curl -v -T kitty.jpg ftp://test:[email protected]:2121/

Download it back

curl ftp://test:[email protected]:2121/kitty.jpg -o kitty2.jpg

Compare it

diff kitty.jpg kitty2.jpg

Config file

If you don't create a

ftpserver.json
file, one will be created for you.

Here is a sample config file:

{
   "version": 1,
   "passive_transfer_port_range": {
      "start": 2122,
      "end": 2130
   },
   "tls": {
      "server_cert": {
         "cert": "cert.pem",
         "key": "key.pem"
      }
   },
   "accesses": [
      {
         "user": "test",
         "pass": "test",
         "fs": "os",
         "params": {
            "basePath": "/tmp"
         }
      },
      {
         "user": "test",
         "pass": "test",
         "fs": "os",
         "params": {
            "basePath": "/tmp"
         }
      },
      {
         "user": "dropbox",
         "pass": "dropbox",
         "fs": "dropbox",
         "params": {
            "token": "..."
         }
      },
      {
         "user": "gdrive",
         "pass": "gdrive",
         "fs": "gdrive",
         "params": {
            "google_client_id": "***.apps.googleusercontent.com",
            "google_client_secret": "****"
         }
      },
      {

     "user": "s3",
     "pass": "s3",
     "fs": "s3",
     "params": {
        "endpoint": "https://s3.amazonaws.com",
        "region": "eu-west-1",
        "bucket": "my-bucket",
        "access_key_id": "AKIA....",
        "secret_access_key": "IDxd....",
        "disable_ssl": "false",
        "path_style": "false"
     }
  },
  {
     "user": "sftp",
     "pass": "sftp",
     "fs": "sftp",
     "params": {
        "username": "user",
        "password": "password",
        "hostname": "192.168.168.11:22"
     }
  }

] }

You can generate the TLS key pair files with the following command:

bash
openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out cert.pem -keyout key.pem

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.