innoge / laravel-rclone
A sleek PHP wrapper around rclone with Laravel-style fluent API syntax
Fund package maintenance!
InnoGE
Requires
- php: ^8.2
- illuminate/contracts: ^10.0|^11.0|^12.0
- illuminate/filesystem: ^10.0|^11.0|^12.0
- illuminate/process: ^10.0|^11.0|^12.0
- illuminate/support: ^10.0|^11.0|^12.0
Requires (Dev)
- laravel/pint: ^1.0
- nunomaduro/collision: ^8.0|^9.0
- orchestra/testbench: ^9.0|^10.0|^11.0
- pestphp/pest: ^3.0|^4.0
- pestphp/pest-plugin-laravel: ^3.0|^4.0
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^1.12|^2.0
This package is auto-updated.
Last update: 2025-09-24 19:44:53 UTC
README
A sleek Laravel package that wraps rclone with an elegant, fluent API syntax.
โจ Features
- ๐ฏ Fluent API - Laravel-style method chaining
- ๐ Driver Agnostic - Local, S3, SFTP, FTP support
- โก Zero Configuration - Uses Laravel filesystem config
- ๐ง Highly Configurable - Override any rclone option
- ๐ Progress Tracking - Real-time callbacks & stats
- ๐งช 100% Test Coverage - Battle-tested with Pest
- ๐๏ธ Laravel Native - Service Provider, Facade, Auto-Discovery
๐ Quick Start
Install via Composer:
composer require innoge/laravel-rclone
Basic usage:
use InnoGE\LaravelRclone\Facades\Rclone; // Simple sync Rclone::source('s3', 'documents') ->target('backup', 'archive') ->sync(); // With progress & options Rclone::source('s3', 'media/photos') ->target('local', 'storage/backups') ->withProgress() ->transfers(16) ->checkers(8) ->getOutputUsing(fn($type, $output) => Log::info("Rclone: {$output}")) ->sync();
๐ Requirements
- PHP 8.2+
- Laravel 10.x, 11.x, or 12.x
- rclone binary - Installation Guide
โ๏ธ Configuration
The package automatically uses your existing config/filesystems.php
configuration:
// config/filesystems.php 'disks' => [ 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 'bucket' => env('AWS_BUCKET'), ], 'sftp' => [ 'driver' => 'sftp', 'host' => env('SFTP_HOST'), 'username' => env('SFTP_USERNAME'), 'password' => env('SFTP_PASSWORD'), 'port' => env('SFTP_PORT', 22), ], ]
Optional: Publish config for advanced settings:
php artisan vendor:publish --provider="InnoGE\LaravelRclone\RcloneServiceProvider" --tag="rclone-config"
๐ฏ API Reference
Core Operations
// Sync (make target identical to source) $result = Rclone::source('s3', 'data')->target('backup')->sync(); // Copy (don't delete from target) $result = Rclone::source('s3', 'data')->target('backup')->copy(); // Move (delete from source after transfer) $result = Rclone::source('s3', 'data')->target('backup')->move();
Performance Tuning
Rclone::source('s3', 'large-dataset') ->target('backup', 'archive') ->transfers(32) // Parallel transfers ->checkers(16) // File checkers ->retries(5) // Retry attempts ->statInterval(10) // Stats interval (seconds) ->option('bandwidth', '50M') // Custom rclone option ->sync();
Progress Monitoring
$result = Rclone::source('s3', 'files') ->target('local', 'backup') ->withProgress() ->getOutputUsing(function ($type, $output) { if ($type === 'out') { echo "Progress: {$output}"; } else { Log::error("Rclone Error: {$output}"); } }) ->sync(); // Check results if ($result->isSuccessful()) { $stats = $result->getStats(); echo "Transferred: {$stats['transferred_files']} files\n"; echo "Data: {$stats['transferred_bytes']} bytes\n"; } else { echo "Failed: {$result->getErrorOutput()}\n"; }
๐ Supported Storage Providers
Provider | Driver | Required Config |
---|---|---|
Local Filesystem | local |
root |
Amazon S3 | s3 |
key , secret , region , bucket |
SFTP | sftp |
host , username , password /key_file |
FTP | ftp |
host , username , password |
S3 Configuration
's3' => [ 'driver' => 's3', 'key' => 'AKIAIOSFODNN7EXAMPLE', 'secret' => 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY', 'region' => 'us-west-2', 'bucket' => 'my-bucket', 'endpoint' => 'https://s3.amazonaws.com', // Optional 'use_path_style_endpoint' => false, // Optional ]
SFTP Authentication
'sftp' => [ 'driver' => 'sftp', 'host' => 'server.example.com', 'username' => 'user', // Password auth 'password' => 'secret', // OR Key file auth 'key_file' => '/path/to/private/key', // OR Inline key auth 'private_key' => '-----BEGIN OPENSSH PRIVATE KEY-----...', 'port' => 22, ]
๐๏ธ Laravel Integration
Dependency Injection
use InnoGE\LaravelRclone\Contracts\RcloneInterface; class BackupService { public function __construct( private RcloneInterface $rclone ) {} public function dailyBackup(): bool { $result = $this->rclone ->source('local', 'app/data') ->target('s3', 'backups/daily') ->withProgress() ->sync(); return $result->isSuccessful(); } }
Artisan Command Example
use InnoGE\LaravelRclone\Facades\Rclone; class BackupCommand extends Command { public function handle(): int { $this->info('Starting backup...'); $result = Rclone::source('local', 'storage/app') ->target('s3', 'backups/' . now()->format('Y-m-d')) ->withProgress() ->getOutputUsing(fn($type, $output) => $this->line($output)) ->sync(); return $result->isSuccessful() ? 0 : 1; } }
๐ ๏ธ Advanced Configuration
Environment variables:
RCLONE_BINARY_PATH=/usr/local/bin/rclone RCLONE_TIMEOUT=7200
Custom config file (config/rclone.php
):
return [ 'binary_path' => env('RCLONE_BINARY_PATH', 'rclone'), 'timeout' => env('RCLONE_TIMEOUT', 3600), 'base_options' => [ '--delete-after', '--fast-list', '--checksum', ], 'defaults' => [ 'transfers' => 4, 'checkers' => 8, 'retries' => 3, 'progress' => false, ], ];
๐งช Testing
# Run tests composer test # With coverage composer test-coverage # Static analysis composer analyse # Format code composer format
๐ค Contributing
Contributions welcome! Please submit issues and pull requests on GitHub.
๐ Built With Love
This package was crafted with passion by amazing developers:
- Daniel Seuffer - Creator & Maintainer
- Tim Geisendoerfer - Inspiring Leader, Core Contributor
- All Contributors - Community Heroes โค๏ธ
๐ License
MIT License. See LICENSE for details.
โก Powered by rclone - The Swiss Army knife of cloud storage