elijahcruz / ecdeployer
Deploy projects using a simple CLI
Requires
- php: ^8.1
- ext-openssl: *
- ext-yaml: *
- guzzlehttp/guzzle: ^7.5
- illuminate/http: ^10.0
- nunomaduro/termwind: ^1.15.1
- spatie/ssh: ^1.9
- symfony/yaml: ^6.3
Requires (Dev)
- laravel-zero/framework: ^10.0.2
- laravel/pint: ^1.10
- mockery/mockery: ^1.5.1
- pestphp/pest: ^2.5
README
Deploy your project onto multiple servers with ease.
Requirements
- PHP 8.1 or higher
- Composer
- SSH access to your servers
- OpenSSL PHP Extension
- YAML PHP Extension
- We're assuming you have an SSH key at
~/.ssh/id_rsa
.
Installation
To install, all it takes is a simple composer require
composer global require elijahcruz/ecdeployer
Usage
Commands
Init
You can use the init command to create a new deploy.json file in your project.
ecdeploy init
Note that if a deploy.json file already exists, it will as if you want it to be overwritten.
If you add --laravel
it will create a deploy.json file with the default laravel configuration.
If you add --gitignore
it will add the deploy.json file to your .gitignore file.
If you add --format=
you can then choose between a json, php or a yaml file.
Deploy
You can use the deployment command to deploy your project to your servers.
ecdeploy deploy
Using --all
will deploy to all servers.
Using --tags
will deploy to all servers with the specified tags.
If you don't select any options, it will prompt you to select which servers you want to deploy to. You can select multiple servers by separating them with a comma.
Encryption
You can encrypt and decrypt your deployment file using the encrypt
and decrypt
commands.
These will create a new file with the extension .enc
in the same directory as the deployment file.
If you add --remove
it will remove the original file if you are using encrypt
, and it will remove the encrypted file if you're using decrypt
.
Configuration
deploy.json
The deploy.json file is where you configure your servers and your project.
{ "name": "myproject", "repo": "git@github.com:myproject/myproject.git", "servers": [ { "name": "prod-server", "host": "192.168.1.1", "user": "root", "port": 22, "tags": [ "prod" ], "path": "~/myproject", "commands": [ "before", "during", "after", "node" ] } ], "commands": { "before": [ "php artisan down", "php artisan optimize:clear", "git pull origin master", "composer install --no-interaction --prefer-dist --no-dev --optimize-autoloader" ], "queue-pause": [ "php artisan horizon:pause" ], "during": [ "php artisan migrate --force", "php artisan config:cache", "php artisan route:cache", "php artisan view:cache" ], "node": [ "npm install", "npm run build" ], "after": [ "php artisan up" ], "queue-resume": [ "php artisan horizon:continue" ] } }
Servers
All servers are defined in the servers array. Each server has the following properties:
- Name: The name of the server
- Host: The IP address or domain of the server
- User: The user to connect to the server with
- Port: The port to connect to the server with
- Tags: An array of tags to identify the server with.
- Path: The path to the project on the server
- Commands: An array of the command stages to run on the server
Commands
All commands are defined in stages. The stages are run in the order they are defined in the commands array. So in the example above, node
will run before after
, even though after
is defined before node
in the server's command array.
The stages names can be anything you want, and you can have as many stages as you want. The only exception is the node
stage.
You also don't need to create the path on the server, it will be created automatically if it doesn't exist.
Contributing
Please see CONTRIBUTING for details.
License
The MIT License (MIT). Please see License File for more information.