If you need a simple, secure, and straightforward SFTP server, Atmoz SFTP is one of the easiest solutions available.

It runs inside Docker, requires minimal configuration, and is secure by default, no fiddly chroot setup that can often be error-prone or introduce security risks.

In this guide, we’ll install and run Atmoz SFTP on Debian 12 (Bookworm) using Docker Compose.
If you haven’t installed Docker and Docker Compose yet, follow my earlier guide:

Why Choose Atmoz SFTP?

Unlike traditional FTP, SFTP runs over SSH, providing encryption by default, with Atmoz SFTP, you get:

  • Secure by default, only SFTP over SSH, no plaintext FTP.
  • Dockerized simplicity, no OS-level tinkering with OpenSSH configs.
  • Quick setup, create a user, map a directory, run the container.
  • No chroot headaches, the container handles isolation cleanly.

Step 1. Prepare Your Environment Variables

We’ll use a .env file to store credentials, port settings, and the local path to be mounted into the container.
This makes it easier to manage and avoids hardcoding sensitive values into the Compose file.

Create a file named .env:

nano .env

Add the following content (customize to your needs):

SFTP_USER=example.user
SFTP_PASSWORD=example.pass.1234
SFTP_PORT=22888
SFTP_PATH=/mnt/example.host.path

Explanation:

  • SFTP_USER → The username for SFTP login.
  • SFTP_PASSWORD → Strong password for authentication.
  • SFTP_PORT → External port to access SFTP (mapped to container’s port 22).
  • SFTP_PATH → Local folder path that will be mounted inside the container.

Step 2. Create the Docker Compose File

Next, create a docker-compose.yaml file:

nano docker-compose.yaml

Paste the following configuration:

services:
  sftp:
    image: atmoz/sftp:latest
    container_name: atmoz-sftp-server-1
    mem_limit: 2g         # Hard limit on memory usage
    memswap_limit: 2g     # Limit RAM + swap usage
    mem_reservation: 1g   # Soft memory reservation
    cpus: 2               # Limit to 2 CPU cores
    restart: unless-stopped
    ports:
      - "${SFTP_PORT}:22"  # Map SFTP port from .env file
    volumes:
      - ${SFTP_PATH}:/home/${SFTP_USER}/upload  # Mount local folder
    env_file:
      - .env
    environment:
      - SFTP_USERS=${SFTP_USER}:${SFTP_PASSWORD}:1001
    networks:
      - atmoz-bridge-network

networks:
  atmoz-bridge-network:
    driver: bridge

Highlights:

  • Uses environment variables from .env.
  • Memory and CPU limits keep the container lightweight and predictable.
  • Automatically restarts unless stopped manually.
  • Isolated via a custom Docker bridge network.

Step 3. Start the Atmoz SFTP Server

Run the following command in the same directory as your .env and docker-compose.yaml:

docker compose up -d

Check container status:

docker ps

You should see something like:

CONTAINER ID   IMAGE                COMMAND      STATUS         PORTS
abc123456789   atmoz/sftp:latest    "/entry..."  Up 10 seconds  0.0.0.0:22888->22/tcp

Step 4. Connect to the SFTP Server

From another machine or SFTP client (e.g., FileZilla, WinSCP, or sftp CLI):

sftp -P 22888 [email protected]

When prompted, enter your SFTP_PASSWORD.

Step 5. Security and Maintenance Tips

  • Use strong passwords, avoid dictionary words.
  • Limit IP access via firewall (ufw or iptables).
  • Implement RSA key, better compare to password.
  • Back up your data , mounted folder (SFTP_PATH) is where files are stored.
  • Update regularly, keep Docker images up to date:
docker compose pull
docker compose up -d

Conclusion

You now have a fully functional, secure-by-default SFTP server running in Docker on Debian 12, with a clean configuration and minimal fuss.

Atmoz SFTP removes the complexity of traditional SFTP setups while still giving you all the benefits of secure file transfers. Perfect for development teams, backup uploads, or controlled client file sharing.

Leave A Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.