How to export and import CompleteFTP configuration between servers and versions
CompleteFTP Manager has no Export configuration command, and people looking for one usually
conclude that the settings cannot be moved. They can. The entire configuration, every user,
password, group, folder, permission, site, protocol setting, event trigger, SSH host key, TLS
certificate and licence activation, lives in a single file called config.db. Copying that file
is the export, and putting it where a new installation will find it is the import. The installer
has an import prompt and no export button because the export is a file copy.
Two names are used throughout, because a migration has two machines in it and almost every mistake below comes from doing something to the wrong one:
- the source server is the machine the configuration is coming from.
- the target server is the machine it is going to.
Which situation are you in?
Answer from what you already know, and read one case only.
| Case | What you are doing | Read |
|---|---|---|
| A | Installing a newer release of CompleteFTP on the machine it already runs on. No second machine involved. | Case A |
| B | Moving to a Windows machine, from Windows or from Linux | Case B |
| C | Moving to a Linux machine, from Linux or from Windows | Case C |
| D | Taking a copy you can restore onto the same machine later | Case D |
B and C are decided by the target server's platform, not the source server's. Both move the
same file, and the file is identical either way. What differs is the tool that brings the
configuration up to the installed release once it arrives: on Windows that is the installer or
cftpconfig, on Linux it is the completeftp config new command, and neither exists on the other
platform. Moving between platforms adds one more rule, which is in both sections: an activation
issued for Windows is rejected on Linux, and an activation issued for Linux is rejected on Windows.
Two things that are not cases:
- If the source server's configuration file is named
config.sdfrather thanconfig.db, read If you are on an older release before you start. It changes how the file is imported. - Two servers cannot be combined into one. There is no merge tool and no user-import command; see failure mode 7 for what to do instead.
The short version
Case A needs none of this: the installer does the export and the import for you. For Cases B, C and D, these three steps are the same.
- Stop the CompleteFTP service. The running service holds the configuration in memory and writes it back on save, so a copy taken while it runs may be stale, and a file dropped in under a running service will be overwritten.
- Copy
config.dbfrom the configuration directory (see Where the configuration lives). This one file is the export. - Copy the user home directories too if the files themselves have to move. They are not inside
config.db.
Then one section only:
- Same machine, newer release → Case A.
- Windows target → Case B.
- Linux target → Case C.
- Backup and restore on the same machine → Case D.
If the move crosses machines, read Transferring the licence as well. Without it the target server accepts local connections only, however perfect the configuration is.
Where the configuration lives
| Windows | Linux | |
|---|---|---|
| Configuration file | C:\ProgramData\Enterprise Distributed Technologies\Complete FTP\config.db |
/var/lib/completeftp/config/config.db |
| Automatic backups | …\Complete FTP\Backup |
/var/lib/completeftp/config/Backup |
| User home directories | …\Complete FTP\Users |
/var/lib/completeftp/users |
| Public folder | …\Complete FTP\Public |
not created |
| Share links | …\Complete FTP\Share\Sites |
/var/lib/completeftp/share |
| Logs | …\Complete FTP\Logs |
/var/log/completeftp |
| Program files | C:\Program Files\Complete FTP |
/usr/lib/completeftp |
| Service | CompleteFTP (display name Complete FTP Server) |
completeftp.service |
The program files directory contains no configuration at all. Copying C:\Program Files\Complete FTP to another machine moves nothing you need and is the single most common wasted afternoon in
this procedure.
Folders you added yourself can point anywhere, including at network shares and other drives. Those
paths are recorded in config.db but their contents are not, so list them before you start.
What travels inside config.db, and what does not
Inside config.db |
Outside it |
|---|---|
| Users, passwords, groups, public keys | The files in the users' home directories |
| Folders, mappings and permissions | Anything stored on a network share or another drive |
| Sites, protocol settings, ports and interface bindings | Firewall rules and DNS records |
| SSH host keys and TLS certificates | Certificates you keep elsewhere for other purposes |
| Event triggers, scheduled tasks, IP filters | Custom web content you placed outside the configuration directory |
| Administrator account and admin port | The Windows service configuration |
| The licence activation key | Nothing: the key travels but stops being valid, see below |
Nothing in the file is tied to the machine except the activation key. Passwords, host keys and certificates are stored in a form that any CompleteFTP installation can read, which is why a copied configuration produces a server that clients recognise, with the same host key fingerprint they have already accepted.
Two consequences worth knowing before you plan the cutover:
- The configuration adopts its new home on first start. The machine name recorded for the server is updated to the target machine's name, and the list of the machine's own addresses is refreshed. Per-protocol interface bindings you set by hand are not, so a site pinned to a specific IP address on the source server will still be pinned to it on the target.
- The diagnostics zip is not a backup. The
config.dbproduced by Save diagnostics in the Monitoring panel has the SSH host keys, the TLS certificates and every user's password removed before it is written. It is for sending to support. Restoring it would give you a server with no keys and no logins.
Case A. A newer release on the same machine
Nothing needs exporting. The installation carries the configuration forward, backing it up first, and the activation stays valid because the machine has not changed.
On Windows, run the new installer over the existing installation with CompleteFTP Manager
closed. The configuration step finds the existing config.db, pre-selects Keep existing
configuration, backs the file up, and upgrades it to the installed release in place. Users,
folders, passwords, certificates and the activation key are all carried forward. The only decision
on that page is which of the three options is selected: leave it on Keep existing
configuration, because Create new configuration discards everything including the activation
key, and the page says so.
On Linux, install the new package over the old one. Its install script runs
completeftp config new against the existing configuration file, which backs the file up and
upgrades it in place, then restarts the service. You do not run anything by hand.
If you want a copy of the configuration in hand before you start, take one as in
Case D first. Both installations write their own backup as well, into the Backup
directory, before they change anything.
Case B. Moving to a Windows machine
Put the configuration file in place on the target machine, then run the installer over it. The installer upgrades the configuration it finds to the release being installed, so this needs no command line and no second pass, and the source server stays untouched and serving clients until you choose to stop it.
If the source server is Linux, its configuration file is at
/var/lib/completeftp/config/config.db and its home directories at /var/lib/completeftp/users,
and step 2 becomes sudo systemctl stop completeftp and a copy of those two paths. Everything else
below is unchanged, except that the licence must be re-issued for Windows (see
Transferring the licence).
- On the source server, stop the CompleteFTP service and copy
C:\ProgramData\Enterprise Distributed Technologies\Complete FTP\config.dbsomewhere you can reach from the target. Copy theUsersdirectory too if the home-directory contents have to move, plus anything underPublicandShare. Restart the service afterwards if the source server is still in production. - On the target server, put
config.dbin place before installing. Copy it toC:\ProgramData\Enterprise Distributed Technologies\Complete FTP\config.db. If CompleteFTP is already installed on the target, stop the service first and replace the file there. - Run the installer. Install the release you intend to end on, which can be newer than the source server's release. The installer finds the configuration already in place and upgrades it to the release being installed, so there is no separate import step and no second pass.
- On the target server, copy the user home directories into
…\Complete FTP\Users, and re-create by hand any folder whose contents live on a share or another drive. - On the target server, start the CompleteFTP service and connect with CompleteFTP Manager. The manager must be the same release as the server or it will refuse to connect.
- Transfer the licence, which touches both machines, as described in Transferring the licence. Until you do, the target server accepts connections from its own machine only.
- On the target server, check the settings that name the machine: per-protocol interface bindings if you pinned a site to a specific address, any trigger or scheduled task holding the old hostname, and any folder pointing at a path that does not exist on the target.
This is the same method the product guide's migration page describes, and it is the only one support
recommends. A config.sdf from an early release is the one case that still needs the guide's longer
route, described in If you are on an older release.
Case C. Moving to a Linux machine
The file format is the same on both platforms, so config.db copies across in both directions. What
does not copy is anything that depends on Windows.
On the source server, stop the service and copy config.db and the user home directories, as in
the short version. On a Windows source those are
C:\ProgramData\Enterprise Distributed Technologies\Complete FTP\config.db and the Users
directory beside it; on a Linux source, /var/lib/completeftp/config/config.db and
/var/lib/completeftp/users.
Then, on the target server:
sudo systemctl stop completeftp
sudo cp /path/to/config.db /var/lib/completeftp/config/config.db
sudo dotnet /usr/lib/completeftp/bin/completeftp.dll config new /var/lib/completeftp/config/config.db
sudo chown completeftp:completeftp /var/lib/completeftp/config/config.db
sudo systemctl start completeftp
config new reads as though it would overwrite what is there. It does not. Given a path that
already holds a configuration it backs the file up and upgrades it to the installed release, and it
creates a new one only when the path is empty. This is the same command the package's own install
script runs, which is how a package upgrade brings an existing configuration forward. Add -d to
see the version numbers it reports while it works.
The chown matters: the service runs as the completeftp user, and a file you copied in as root
stays owned by root.
What will not work after a move from Windows:
- Windows users. Accounts that authenticate against the Windows account database do not carry over as they stand, but Linux has a direct equivalent: OS users, which authenticate against the host's own accounts through PAM. Re-point those users at the Linux equivalent, or recreate them as CompleteFTP users.
- Windows folders and Windows file permissions. Any folder whose path is a drive letter or a UNC path has to be re-pointed at a Linux path, and per-folder Windows permissions do not apply.
- The licence. An activation issued for Windows is rejected on Linux and the server starts in
restricted mode, logging
Windows license used on Linux machine. Running in restricted mode.The reverse move logsLinux license used on Windows machine. Running in restricted mode.Ask support for an activation for the platform you are moving to before you cut over.
There is no cftpconfig on Linux, and no installer wizard, so a config.sdf from an early release
cannot be converted there at all. Convert it on a Windows machine first
(If you are on an older release), then move the resulting config.db.
Case D. Backup and restore on the same machine
To take a backup: stop the CompleteFTP service, copy config.db somewhere off the machine,
start the service. That file is a complete, restorable configuration. There is no separate backup
command and none is needed.
You may not have to take one at all. CompleteFTP writes its own copies into the Backup directory
beside config.db, and keeps fifteen of each kind:
| Prefix | Written when |
|---|---|
update_ |
An installation or a cftpconfig run is about to change the configuration |
daily_ |
The first time the configuration is saved on any given day |
overwrite_ |
A cluster member is about to have its configuration replaced by the primary's |
The file name carries the configuration's version and the date, for example
daily_2611_20260803.db. That version is the one thing you must check before restoring, because
the service refuses to start when the configuration's version and the software's version differ.
To restore:
- Stop the CompleteFTP service:
net stop CompleteFTPfrom an elevated prompt on Windows,sudo systemctl stop completeftpon Linux. - Copy the backup file over
config.db, renaming it toconfig.db. A backup whose name ends in.sdfcame from a release old enough that the file format has since changed: see If you are on an older release before you go further. - If the version in the file name is older than the installed release, bring the file up to date.
On Windows, run
cftpconfig /vfrom an elevated prompt inC:\Program Files\Complete FTP\Server; this also restores the file permissions the service needs. On Linux, runsudo dotnet /usr/lib/completeftp/bin/completeftp.dll config new /var/lib/completeftp/config/config.dbfollowed bysudo chown completeftp:completeftp /var/lib/completeftp/config/config.db, because a file you copied in as root stays owned by root and the service runs ascompleteftp. - Start the service.
Restoring onto the same machine keeps the activation, so nothing else is needed.
Transferring the licence
A production activation is bound to the machine it was issued for. Copy the configuration to another machine and the key travels with it but stops matching, so the target server starts in restricted mode and accepts connections originating on that machine only. Everything else works, which is what makes this confusing: the users are all there, the manager connects, and no client outside the box can log in.
The order that avoids trouble:
- On the target server, confirm the configuration is in place and the service starts.
- On the source server, release the activation. The source server switches to migration mode and stays fully operational for a further 30 days.
- On the target server, apply the purchased licence.
CompleteFTP Manager runs on Windows only, though it can administer a server on any machine: enter
the other machine's name or address in its connect dialog. From the manager, steps 2 and 3 are
Licensing in the left-hand list, then Release activation and Apply purchased license;
while migration mode is running that panel shows CompleteFTP Migration (N days left). From the
command line on the server itself, the same two steps are:
completeftp license release online <username> <password>
completeftp license activate online <purchase-reference> <username> <password>
The user name and password are the ones for your account on the EnterpriseDT customer site, not a
CompleteFTP login. completeftp license show reports the current state.
Releasing an activation cannot be undone without help from support, and the confirmation dialog says so before you commit. There is no cancel-migration-mode command. If you have to abandon the move after releasing, raise it with support; the source server keeps working in the meantime.
Two variations worth knowing before you start:
- If you cannot reach the source server at all, ask support for an additional activation rather than releasing.
- If the target server has no internet access, the manager's activation form offers a browser-based
route that you complete on another machine and paste back. The command-line equivalents are the
offlinerequestandofflineapplyforms of the same two commands.
When it doesn't work
Ordered by how often each comes up, with the cases each applies to.
1. The users are all there but nothing outside the machine can connect. (B, C)
The activation did not transfer. The server is in restricted mode, which permits local connections
only. See Transferring the licence. On a Windows-to-Linux or Linux-to-Windows move,
check the target server's Diagnostics.log for the restricted-mode line even if you did transfer
the licence: the activation is platform-specific. The log directory is in
Where the configuration lives.
2. The installer does not offer "keep the configuration file". (B, C) On a machine that has no configuration yet, the configuration step offers Create new configuration and Import configuration from other location only. Keep existing configuration appears once a configuration file is present in the configuration directory, which is why the guide's migration steps have you copy the file into place and then run the installer a second time. Both options do the same job; import is the one to use when the file is somewhere else.
3. Importing an old config.sdf fails. (B, D)
The import file dialog offers *.sdf as a file type, but selecting one produces an error such as
File opened that is not a database file, because the imported file is treated as a config.db.
The conversion only happens for a config.sdf sitting in the configuration directory. Put the file
at
C:\ProgramData\Enterprise Distributed Technologies\Complete FTP\config.sdf and choose Keep
existing configuration instead. See If you are on an older release.
4. The configuration was copied from the program files directory. (B, C, D)
Nothing under C:\Program Files\Complete FTP is configuration. If the target server came up with a
default set of users after you copied a directory across, this is why. The configuration directory
is under ProgramData, which is hidden in Explorer by default.
5. The file was copied while the service was running. (all) The running service holds the configuration in memory and writes it out when changes are applied, so a copy taken from a live machine can be missing the last change or, worse, be a half-written file. Stop the service first. On the target the failure is louder: drop a file in under a running service and the next save overwrites it.
6. The site is still bound to the old machine's IP address. (B, C) Interface bindings that name a specific address are part of the configuration and move with it. The service starts, but the listener for that protocol has nothing to bind to. Check each site's per-protocol interfaces in the manager after the import, and set them back to all interfaces unless you have a reason not to.
7. Two configurations cannot be merged. (B, C)
There is no merge tool, no user-import command, and no way to combine two config.db files. An
import replaces the whole configuration. To consolidate two servers you either re-create one side's
users and folders by hand on the other, or keep them apart as two sites within one configuration.
Export each server's user list first, with Export users on the right-click menu of the Users
panel, so you have the inventory to work from. The exported columns include the password hash, not
the password, so logins have to be re-issued.
8. A configuration from a newer release will not go backwards. (B, C, D) The upgrade path is one-way. Importing a configuration that came from a later release into an earlier one re-stamps the file with the installed version, which lets the service start, but nothing converts the later release's structures back. Install the same release as the source server, or a newer one, and never an older one.
9. The home directories are empty on the target server. (B, C)
config.db records where each user's home folder is, not what is in it. Copy the Users directory
across as well, and handle folders that live on shares or other drives separately.
10. The service will not start after the import. (B, C, D)
The usual cause is a configuration whose version does not match the installed software. Run
cftpconfig /v on Windows or config new on Linux against the file, which upgrades it and, on
Windows, resets the permissions the service account needs. A full walkthrough of the other startup
failures is in the article on the service failing to start after an upgrade, listed under
Related.
Reading the output
Both configuration tools report the two version numbers that matter. cftpconfig /v writes them to
the console and to cftpconfig.log in the same directory as the executable; the installer's
configuration step writes them to Bootstrapper.log beside it; config new -d on Linux writes them
to the console:
Current config version: 12.1.1
Upgrading to version: 26.1.1
The first line is the version of the file you imported, read out of the file itself. If it is not what you expected, you imported the wrong file. The second is the installed release. When the run finishes without an error, those two are equal and the service will accept the configuration.
Two dialogs come from the installer's file check rather than from the import itself, and both mean
the path is wrong rather than the file being bad: Configuration file does not exist at and
Error opening configuration file. The second also appears when the file is open in another
program, which on the source machine usually means the service is still running.
If you are on an older release
The configuration file was config.sdf up to and including release 21.1.0, and config.db from
22.0.0 onwards. A config.sdf is converted automatically, but only when it is sitting in the
configuration directory: copy it to
C:\ProgramData\Enterprise Distributed Technologies\Complete FTP\config.sdf
on a Windows target, run the installer, and choose Keep existing configuration. Selecting the
same file through Import configuration from other location fails with File opened that is not a database file. Linux has no conversion at all, so convert on Windows first.
Related
- CompleteFTP guide: Migrating to another machine, How to upgrade, cftpconfig, How to resolve restricted mode, How to activate Standard, Professional or Enterprise MFT, How to export users, How to upgrade a cluster
- KB: CompleteFTP service fails to start after an upgrade. What to do when the service will not come up after an installation or an import, including the configuration-version check and rolling back to the previous release.
- For background on planning a server move, running old and new in parallel and cutting over, see Migrating an SFTP server to a new machine and Setting up an SFTP server on Windows.
Other technical articles
- CompleteFTP service fails to start after an upgrade: how to find the cause and fix it
- CompleteFTP: System.OutOfMemoryException during SFTP, or a service that stops responding
- Does edtFTPnet/PRO support .NET 8? Which assembly to reference for .NET Framework, .NET Core and .NET 5+
- How to disable weak ciphers and encryption algorithms in CompleteFTP
- How to enable Debug logging in CompleteFTP for troubleshooting
- IP filtering and whitelisting in CompleteFTP: what it supports and how to configure it
- Passive FTP and FTPS data connection failures in CompleteFTP: login works, the directory listing times out
- SFTP login fails with "No supported authentication methods available (server sent: publickey)" or "Permission denied (publickey)"
- Using Active Directory, Entra ID (Azure AD), SAML and LDAP groups to control who can log in to CompleteFTP
- Why SFTP transfers fail with "ConsumeWindowSpace timed out", and how to fix it
- Why an SSL certificate won't import into CompleteFTP, and how to fix it