You know how boring can be site upload over and over again. Site is like a house pet, always needs some attention and after each change it should be uploaded to the Web vie FTP. Even doing this over and over again it is easy to make a mistake a miss one important file, so site can become malfunction.

I use simple lftp command line tool to automate project deployment via FTP and eliminate any possible deployment errors.

Lftp - easy upload and sync website via FTP

lftp is a program that allows sophisticated ftp and http connections to other hosts. lftp can handle six file access methods - ftp, ftps, http, https, hftp.   Every operation in lftp is reliable, that is any not fatal error is ignored and the operation is repeated. So if downloading breaks, it will be restarted from the point automatically.

lftp has shell-like command syntax allowing, it accepts on the input script like program. Each command tells lftp what to do. This gives perfect control of what is going to be uploaded or deleted.

Installing under Ubuntu is pretty straightforward: apt-get install lftp. There is also windows version available.

# Usage example

In this example, lftp script is used for uploading CakePHP project, which is not a simple upload task.

In the project folder I created file which handles all the dirty job, below is the content of the file.

www is local folder. public_html is remote folder.

lftp << EOF
set ftp:ssl-allow no
set ftp:passive-mode true
set ftp:list-options -a
# Upload site configuration
put -O public_html/dev/app/config/ www/app/config/bootstrap.php
put -O public_html/dev/app/config/ www/app/config/routes.php
# Mirror program code
mirror -R --delete --exclude config --exclude tmp --exclude webroot www/app public_html/dev/app
# Mirror webroot (not delete remote user files)
mirror -R --exclude user_data www/app/webroot public_html/dev/app/webroot
cd public_html/dev/app/tmp/cache/models
mrm *
cd public_html/dev/app/tmp/cache/persistent
mrm *

FTP username or password can be embedded into script itself, which is less secure. More secure way is to add additional lines of bash scripting to ask for password.

put - uploads one sinlge file. First argument is REMOTE file name, second argument is LOCAL file name.

mirror - synchronizes local and remote folder. Used swithes are:

  • -R - sync from local to remote (uploading, NOT downloading)
  • --delete - delete files on remote side which do not exist on local side
  • --exclude - exclude directory by name
  • cd - remote change directory command
  • mrm - remove multiple files


When lftp is run with "-d" switch it shows all FTP commands, which is good for debugging. One more good switch of mirror command is "--dry-run", it just shows what is going to be uploaded without any actual action performed.

Beware! Do not do any experiments on live project with uncommitted changes!!! You may loose your changes. Do a project copy or commit all changes before.

# Conclusion

Now I am sure that after development round all changes will be uploaded to the server and nothing left behind. Upload script is easy customizable for future projects.