Deploy with Docker
Syncplify Server! is available as a Docker image on Docker Hub. This page covers how to deploy and operate it using Docker Compose.
Prerequisites
- Docker Engine 24.0 or later
- Docker Compose v2 (the
docker composeplugin, not the legacydocker-compose) - The host must not already use ports 21, 22, 443, 990, 6443, or 6444 for other services (443 only matters when automatic certificates are used)
Deploying with Docker Compose
Create a docker-compose.yml file on your Docker host with the following content:
services:
syncplify-server:
image: syncplify/ss:latest
container_name: syncplify-server
restart: unless-stopped
environment:
# Activates the in-process worker supervisor (replaces systemd).
# Do NOT remove or change this variable.
- SS_CONTAINER_MODE=1
ports:
- "22:22"
- "21:21"
- "990:990"
- "443:443"
- "6443:6443"
- "6444:6444"
- "44388:44388"
volumes:
- /opt/Syncplify/Server/data:/opt/Syncplify/Server/data
- /opt/Syncplify/Server/log:/opt/Syncplify/Server/log
# Add one volume mount for each directory you want the SFTP/FTP server
# to be able to use as a home or root directory for your users.
# Example:
- /var/sftpdata:/var/sftpdata
# Access to the host machine ID is required for licensing.
- /etc/machine-id:/etc/machine-id:roIMPORTANT
Any host directory that you intend to use as a virtual site root, user home, or shared folder must be mounted into the container. The container cannot access host paths that are not explicitly listed under volumes. Add one entry per directory, keeping the host path and container path identical (e.g. - /var/sftpdata:/var/sftpdata). You can use any path that suits your environment.
Then follow the steps below.
1. Create persistent directories
sudo mkdir -p /opt/Syncplify/Server/data /opt/Syncplify/Server/log /var/sftpdataAll configuration, the license file, virtual-site definitions, and the internal database are stored under /opt/Syncplify/Server/data. Logs are written to /opt/Syncplify/Server/log. Both directories survive container restarts and upgrades.
2. Pull the image and start
docker compose pull
docker compose up -dOn the first start the container creates the internal database and generates its TLS certificates automatically. The server is then running, but not yet initialized: it has no node identity and no SuperAdmin account until you complete the setup wizard in the next step.
While the server is in this state, the container log shows two lines that look like errors and are not:
1st UpdateHA err: document not found
{"level":"error","service":"ss-webrest","subsystem":"globalConfCache", ... "error":"document not found","comment":"unable to reload global config, returning the old one"}Both say that the node record and the global configuration do not exist yet. The setup wizard creates them, and the lines stop once it has run.
3. Complete initial setup
Open a browser and navigate to the setup wizard. The /init/setup path is required:
https://<docker-host>:6443/init/setupThe wizard assigns the node its identity and creates the first SuperAdmin account; it is documented screen by screen in the setup wizard chapter. Once it completes, the wizard address is no longer served and the SuperAdmin UI at https://<docker-host>:6443/superadmin becomes your login page, where you configure your license and set up virtual sites.
WARNING
Do not try to create the SuperAdmin account from the login page. Both https://<docker-host>:6443 and https://<docker-host>:6443/superadmin lead to the SuperAdmin login page, which cannot be used before the wizard has run: any login attempt there answers "this Syncplify Server! is not initialized". That message means the wizard has not been completed yet, not that the installation failed. Go to /init/setup instead.
IMPORTANT
During initial setup, the setup wizard is accessible to any client that can reach port 6443. Ensure this port is not publicly reachable until setup is complete. You can restrict access temporarily using host firewall rules or Docker network policies.
Ports
| Host port | Container port | Protocol |
|---|---|---|
| 22 | 22 | SFTP |
| 21 | 21 | FTP control |
| 990 | 990 | FTPS implicit |
| 443 | 443 | Certificate authority validations (only with automatic certificates enabled) |
| 6443 | 6443 | Admin REST API and setup UI (HTTPS) |
| 6444 | 6444 | WebClient (HTTPS) |
| 44388 | 44388 | R2FS! (Reverse Remote File System) |
If your host already uses port 22 for SSH, change the left side of the mapping (for example "2222:22") and inform your SFTP clients to connect on the new port.
Useful commands
# View live logs
docker compose logs -f
# Stop the container (data is preserved in the volumes)
docker compose down
# Restart after a configuration change
docker compose restartData persistence and backup
All state lives in the three volume mounts. But to back up the server configuration, user database, and license file, you only need to back up the /opt/Syncplify/Server/data directory. You can safely ignore the log directory unless you want to preserve historical logs, and backing up the virtual sites' root directories is only necessary if you want to preserve the files stored there:
So, to back up the server state, run this command on the Docker host:
docker compose down
sudo tar -czf syncplify-backup-$(date +%Y%m%d).tar.gz /opt/Syncplify/Server/data
docker compose up -dAnd to back up the server state along with virtual sites' root directories, add them to the tar command:
docker compose down
sudo tar -czf syncplify-backup-$(date +%Y%m%d).tar.gz /opt/Syncplify/Server/data /var/sftpdata
docker compose up -dTo restore, extract the archive over /opt/Syncplify/Server/data before starting the container.
Upgrading
docker compose pull
docker compose up -d --force-recreateThe data volume is untouched during the upgrade. No manual migration steps are required for minor version upgrades.
