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;}
deploy.php
file
Example 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 tasksdesc('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.