Deployer is a free, open-source deployment tool written in PHP by Anton Medvedev. It helps you easily deploy your PHP application to a server. By automating common deployment tasks such as pulling code, running migrations, and clearing caches, Deployer reduces the risk of human error and ensures consistent, repeatable deployments across environments.
Features
- Ability to configure your server, setup a firewall, install PHP and MySQL or Postgres, configure HTTPS, etc.
- Zero downtime deployments with the ability to rollback to the previous release.
- Ready to use recipes for most frameworks and applications (including a recipe for Laravel).
Installation
Install Deployer using Composer:
composer global require deployer/deployer
Once installed, navigate to your project directory and run:
dep init
After answering a few questions, this will create a deploy.php or deploy.yaml file for your deployment recipe. This file defines hosts, tasks, and dependencies on other recipes.
Tasks are set using the task function. You can also describe a task with the desc function.
It is recommended to use an identity key or private key when connecting to a server. You can add it to your ~/.ssh/config file.
Host *
IdentityFile ~/.ssh/id_rsa
Next, run the following command to provision your server:
dep provision
The provision command will ask about PHP versions, database preferences, and other requirements and install everything required to run your application.
Lastly, you can deploy your project with:
dep deploy
After your first successful deployment, your deployment path will look like this:
~/www // deploy_path
|- current -> releases/1 // Symlink to current release
|- releases // Directory for all releases
|- 1 // Latest release
|- ...
|- .env -> shared/.env // Symlink to shared .env file
|- shared // Shared files between releases
|- ...
|- .env // Shared .env file
|- .dep // Deployer configuration files
Additionally, you will need to modify your web server configuration to serve your application from the current directory. An example configuration for Nginx could be as follows:
root /home/deployer/www/current/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
Example deploy.php file
namespace Deployer;
host('my-server')
->set('hostname', 'my-server.org')
->set('deploy_path', '~/www');
->set('remote_user', 'deployer');
desc('Define my first task');
task('task_a', function () {
run('whoami');
});
desc('Run npm build process');
task('task_b', function () {
cd('{{release_path}}');
run('npm install');
run('npm run prod');
});
// Group tasks
desc('Deploys your project');
task('deploy', [
'task_a',
'task_b',
]);
Deployer can also be configured to work with either GitHub Actions or GitLab CI/CD.
Learn more by reading the documentation and view the source code on GitHub.