ftpserver

by fclairamb

fclairamb / ftpserver

Golang based autonomous FTP server with an S3 integration

35 Stars 5 Forks Last release: 5 months ago (v0.7.0) MIT License 857 Commits 11 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

Golang FTP Server

Build Docker Image Cross Build Docker test 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 FS are: - Local disk - S3 through fclairamb/afero-s3 - SFTP through afero's sftpfs

Planned FS are: - Dropbox - Google Drive

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

Golang

go get -u github.com/fclairamb/ftpserver

Config file

If you don't create a

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

Here is a sample config file:

{
  "version": 1,
  "accesses": [
    {
      "user": "test",
      "pass": "test",
      "fs": "os",
      "params": {
        "basePath": "/tmp"
      }
    },
    {
      "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"
      }
    }
  ],
  "passive_transfer_port_range": {
    "start": 2122,
    "end": 2130
  }
}

With local binary

You can build the binary and use it directly:

# Get and install the server
go get github.com/fclairamb/ftpserver

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 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

With docker

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

# Starting the sample FTP server
docker run --rm -d -p 2121-2130:2121-2130 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]:2121/kitty.jpg -o kitty2.jpg

Compare it

diff kitty.jpg kitty2.jpg

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.