There is nothing worse than manually uploading files via FTP, for example, using Total Commander. (Although, editing files directly on the server and then desperately trying to synchronize them is even worse.) Once you fail to automate the process, it consumes much more of your time and increases the risk of errors, such as forgetting to upload a file.
Today, sophisticated application deployment techniques are used, such as via Git, but many people still stick to uploading individual files via FTP. For them, the FTP Deployment tool is designed to automate and simplify the uploading of applications over FTP.
FTP Deployment is a PHP
script that automates the entire process. You simply specify which directory
(local
) to upload to (remote
). These details are
written into a deployment.ini
file, clicking which can immediately
launch the script, making deployment a one-click affair:
php deployment deployment.ini
What does the deployment.ini
file look like? The
remote
item is actually the only required field; all others are
optional:
; remote FTP server remote = ftp://user:secretpassword@ftp.example.com/directory ; you can use ftps:// or sftp:// protocols (sftp requires SSH2 extension) ; do not like to specify user & password in 'remote'? Use these options: ;user = ... ;password = ... ; FTP passive mode passiveMode = yes ; local path (optional) local = . ; run in test-mode? (can be enabled by option -t or --test too) test = no ; files and directories to ignore ignore = " .git* project.pp[jx] /deployment.* /log temp/* !temp/.htaccess " ; is allowed to delete remote files? (defaults to yes) allowDelete = yes ; jobs to run before uploading before[] = local: lessc assets/combined.less assets/combined.css before[] = http://example.com/deployment.php?before ; jobs to run after uploading and before uploaded files are renamed afterUpload[] = http://example.com/deployment.php?afterUpload ; directories to purge after uploading purge[] = temp/cache ; jobs to run after everything (upload, rename, delete, purge) is done after[] = remote: unzip api.zip after[] = remote: chmod 0777 temp/cache ; change permissions after[] = http://example.com/deployment.php?after ; files to preprocess (defaults to *.js *.css) preprocess = no ; file which contains hashes of all uploaded files (defaults to .htdeployment) deploymentFile = .deployment ; default permissions for new files ;filePermissions = 0644 ; default permissions for new directories ;dirPermissions = 0755
In test mode (when started with the -t
parameter), no file
uploads or deletions occur on the FTP, so you can use it to check if all values
are correctly set.
The ignore
item uses the same format as .gitignore:
log
– ignores alllog
files or directories, even within all subfolders/log
– ignores thelog
file or directory in the root directoryapp/log
– ignores thelog
file or directory in theapp
subfolder of the root directorydata/*
– ignores everything inside thedata
folder but still creates the folder on FTP!data/session
– excludes thesession
file or folder from the previous ruleproject.pp[jx]
– ignoresproject.ppj
andproject.ppx
files or directories
Before starting the upload and after it finishes, you can have scripts called
on your server (see before
and after
), which can
switch the server into a maintenance mode, sending a 503 header, for
instance.
To ensure synchronization of a large number of files happens (as far as
possible) transactionally, all files are first uploaded with the
.deploytmp
extension and then quickly renamed. Additionally, a
.htdeployment
file is saved on the server containing MD5 hashes of
all files, and it's used for further web synchronization.
On subsequent runs, it uploads only changed files and deletes removed ones
(unless prevented by the allowdelete
directive).
Files can be preprocessed before uploading. By default, all .css
files are compressed using Clean-CSS and .js
files using Google
Closure Compiler. Before compression, they first expand basic mod_include
directives from Apache. For instance, you can create a
combined.js
file:
<!--#include file="jquery.js" -->
<!--#include file="jquery
.fancybox.js" -->
<!--#include file="main.js" -->
You can request Apache on your local server to assemble this by combining the three mentioned files as follows:
<FilesMatch "combined\.(js|css)$"> Options +Includes SetOutputFilter INCLUDES </FilesMatch>
The server will then upload the files in their combined and compressed form. Your HTML page will save resources by loading just one JavaScript file.
In the deployment.ini
configuration file, you can create
multiple sections, or even make one configuration file for data and another for
the application, to make synchronization as fast as possible and not always
calculate the fingerprint of a large number of files.
I created the FTP Deployment tool many years ago and it fully covers my needs for a deployment tool. However, it's important to emphasize that the FTP protocol, by transmitting the password in plain text, poses a security risk and you definitely should not use it, for example, on public Wi-Fi.