aerni/sync

A git-like artisan command to easily sync files and folders between environments

v1.5.0 2024-03-30 21:38 UTC

This package is auto-updated.

Last update: 2024-10-30 23:12:34 UTC


README

Packagist version Packagist Total Downloads License

Laravel Sync

This package provides a git-like artisan command to easily sync files and folders between environments. This is super useful for assets, documents, and any other files that are untracked in your git repository.

Laravel Sync is a no-brainer and the perfect companion for your deploy script. The days are over when you had to manually keep track of files and folders between your environments. Do yourself a favor and give it a try!

Requirements

  • rsync on both your source and destination machine
  • A working SSH setup between your source and destination machine

Installation

Install the package using Composer.

composer require aerni/sync

Publish the config of the package.

php artisan vendor:publish --provider="Aerni\Sync\SyncServiceProvider"

The following config will be published to config/sync.php.

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Remotes
    |--------------------------------------------------------------------------
    |
    | Define on or more remotes you want to sync with.
    | Each remote is an array with 'user', 'host', 'root', and optional 'port'.
    |
    */

    'remotes' => [

        // 'production' => [
        //     'user' => 'forge',
        //     'host' => '104.26.3.113',
        //     'port' => 1431,
        //     'root' => '/home/forge/statamic.com',
        //     'read_only' => false,
        // ],

    ],

    /*
    |--------------------------------------------------------------------------
    | Recipes
    |--------------------------------------------------------------------------
    |
    | Define one or more recipes with the paths you want to sync.
    | Each recipe is an array of paths relative to your project's root.
    |
    */

    'recipes' => [

        // 'assets' => ['storage/app/assets/', 'storage/app/img/'],

    ],

    /*
    |--------------------------------------------------------------------------
    | Options
    |--------------------------------------------------------------------------
    |
    | An array of default rsync options.
    | You can override these options when executing the command.
    |
    */

    'options' => [
        '--archive',
    ],

];

Configuration

To use this package, you have to define at least one remote and recipe.

Remotes

Each remote consists of a user, host, and root. Optionally, you may also define the SSH port and make a remote read_only.

'remotes' => [

    'production' => [
        'user' => 'forge',
        'host' => '104.26.3.113',
        'port' => 1431,
        'root' => '/home/forge/statamic.com',
        'read_only' => env('SYNC_PRODUCTION', true),
    ],

],

The read_only option comes in handy if you want to prevent pushing to a remote from a certain environment, e.g. pushing to production from your local environment.

Recipes

Add any number of recipes with the paths you want to sync. Each recipe is an array of paths relative to your project's root.

'recipes' => [
    'assets' => ['storage/app/assets/', 'storage/app/img/'],
    'env' => ['.env'],
],

Options

Configure the default rsync options to use when performing a sync. You can override these options when executing the command.

'options' => [
    '--archive',
],

The Command

If you know git, you'll feel right at home with the syntax of this command:

php artisan [command] [operation] [remote] [recipe] [options]

Command Structure

The structure of the command looks like this:

Available Commands

You have three commands at your disposal:

Available Options

You may use the following options:

Usage Examples

Pull the assets recipe from the staging remote:

php artisan sync pull staging assets

Push the assets recipe to the production remote with some custom rsync options:

php artisan sync push production assets --option=-avh --option=--delete

Perform a dry run:

php artisan sync pull staging assets --dry

Echo the real-time output of the sync in your terminal:

php artisan sync pull staging assets --verbose

List the origin, target, options, and port in a nice table:

php artisan sync:list pull staging assets

List all rsync commands:

php artisan sync:commands pull staging assets