CompleteFTP Docker Installation Guide

This guide provides step-by-step instructions for running CompleteFTP for Linux using Docker.

Docker provides an isolated, reproducible environment for CompleteFTP, making it perfect for development, testing, and containerized production deployments.


Quick Start

Running CompleteFTP in a Docker container requires building from the provided Dockerfile. Follow these steps to get started:


Building from Dockerfile

Step 1: Download the Dockerfile

Download the Dockerfile and docker-entrypoint.sh into the same directory.

Step 2: Build the Image

In the directory containing both files, run:

docker build -t completeftp .

Step 3: Run the Container

Development Mode (no persistence)

For quick testing and evaluation, run without bind mounts:

docker run -d \
  --name completeftp \
  -p 21:21 -p 22:22 -p 990:990 -p 80:80 -p 443:443 \
  completeftp

Warning: All configuration and uploaded files will be lost if the container is removed.

Production Mode (persistent data)

For production use, bind-mount the data directory to preserve configuration, user accounts, and uploaded files across container replacements:

docker run -d \
  --name completeftp \
  -p 21:21 -p 22:22 -p 990:990 -p 80:80 -p 443:443 \
  -v ./completeftp-data:/var/lib/completeftp \
  -v ./completeftp-logs:/var/log/completeftp \
  completeftp

On first run with an empty bind mount, the entrypoint automatically seeds the default configuration. Subsequent runs detect the existing configuration and start normally.

Important: Mount /var/lib/completeftp in production to prevent data loss when replacing containers.

Note for FTPS: FTPS requires additional ports for data channels. If you need FTPS support, you'll need to create an additional port range mapping in Docker and in CompleteFTP.


Step 4: Verify the Container

Check that the container is running:

docker ps

Check the logs:

docker logs completeftp

Step 5: Access CompleteFTP CLI

Execute commands inside the running container:

# List users
docker exec completeftp completeftp user list

# Add a user
docker exec completeftp completeftp user add testuser

# Get help
docker exec completeftp completeftp --help

For interactive access:

docker exec -it completeftp bash

Step 6: Activate Your Trial for Remote Access

By default, your CompleteFTP trial server will only accept connections from within the container (i.e. its own localhost). To enable access from the host machine and from other machines, you must active your 30-day trial license .

You can activate at any time — but until you do, external connections will be rejected.


Container Management

Start/Stop/Restart:

docker start completeftp
docker stop completeftp
docker restart completeftp

View logs:

docker logs completeftp -f

Remove container:

docker stop completeftp
docker rm completeftp

Port Configuration

The container exposes the following ports:

Port Protocol Purpose
21 FTP Standard FTP control
22 SSH/SFTP Secure Shell and SFTP
990 FTPS FTP over SSL/TLS
80 HTTP Web interface
443 HTTPS Secure web interface

Custom port mapping:

docker run -p 2121:21 -p 2022:22 ... completeftp

Persistent Data

The container stores all mutable state under two directories:

  • /var/lib/completeftp — Main data directory containing server configuration (config/), user accounts and settings (users/), and shared file storage (share/). Mount this directory in production to preserve data across container replacements.
  • /var/log/completeftp — Server log files. Mounting this is optional but useful for log aggregation and debugging.

Do not mount application code directories such as /usr/share/completeftp/web — these are part of the image and should not be overridden.


Next Steps

Refer to the Quick Tour to configure your server.


Troubleshooting

Issue Solution
Container won't start Check docker logs completeftp
Port conflicts Use different port mappings with -p
Permission errors Ensure Docker has proper permissions
Can't connect remotely Activate your trial license
Empty bind mount not initialised Check entrypoint logs: docker logs completeftp — you should see "First run detected"