Self-HostedDocker

Running self-hosted in Docker

Start the Simple FTP Server from the official Docker image, publish the right ports, and pass configuration as environment variables.
Updated August 27, 2026

We publish official Alpine-based images to Docker Hub as doceventio/sfs-server - multi-arch (amd64, arm64, arm), tagged latest and per version.

Quick start

docker run \
  -e LICENSE=<your-license-key> \
  -e REGION=us-east-1 \
  -p 2022:2022 \
  -p 2021:2021 \
  -p 9990:9990 \
  doceventio/sfs-server:latest

Every server parameter can be passed as an environment variable - LICENSE and REGION are the two required ones.

Passive FTP ports

Plain FTP and FTPS also need the passive data ranges published:

docker run \
  -e LICENSE=<your-license-key> \
  -e REGION=eu-west-1 \
  -e PUBLICIP=<your-public-ip> \
  -p 2022:2022 \
  -p 2021:2021 \
  -p 9990:9990 \
  -p 2030-2049:2030-2049 \
  doceventio/sfs-server:latest

PUBLICIP is what makes passive mode work at all - it is the address the server tells FTP clients to open data connections to. SFTP-only deployments need neither the ranges nor PUBLICIP.

TLS certificates and SSH keys

For production (PRODUCTION=1) you provide your own TLS certificate and SSH host key. Either build them into an image derived from ours, or mount them from the host and point the environment at them:

docker run \
  -e LICENSE=<your-license-key> \
  -e REGION=us-east-1 \
  -e PRODUCTION=1 \
  -e TLSCERT=/certs/cert.pem \
  -e TLSKEY=/certs/key.pem \
  -e SSHKEYFILE=/certs/id_rsa \
  -v /path/to/certs:/certs:ro \
  -p 22:2022 -p 21:2021 -p 990:9990 \
  -p 2030-2049:2030-2049 \
  doceventio/sfs-server:latest

In production mode logs come out of the container's stdout as JSON - see Server logging.