SharedSync is a Laravel package designed for deploying applications to shared hosting environments where only FTP or SFTP access is available. It builds the project locally and performs incremental uploads to the remote server.
This package is aimed at Laravel developers who want to deploy their applications to shared hosting environments that only support FTP or SFTP (A notable example is OVH's shared hosting basic plan)
- Build project locally before deployment (Composer, NPM, Artisan cache).
- Incremental deployment using a manifest file (
.deploy-manifest.json). - Supports both FTP and SFTP.
- Configurable ignore rules (supports
.deployignore). - Dry-run mode to see changes before uploading.
- Selective deployment using the
--onlyflag. - Post-deployment remote health checks (storage permissions, symlinks, etc.).
- PHP 8.2+
- Laravel 10.0+
- FTP or SFTP access to your hosting provider.
You can install the package via composer:
composer require cslash/laravel-sharedsyncPublish the configuration file:
php artisan vendor:publish --tag=sharedsync-configEdit config/sharedsync.php with your server details. You can also use environment variables.
Example .env configuration:
SHAREDSYNC_DRIVER=ftp
FTP_HOST=ftp.example.com
FTP_USER=user@example.com
FTP_PASS=secret
FTP_ROOT=/public_html
FTP_PASSIVE=true
FTP_SSL=false
SFTP_HOST=sftp.example.com
SFTP_USER=user
SFTP_PASS=secret
SFTP_ROOT=/var/www/html
SFTP_PRIVATE_KEY=/path/to/id_rsa
SHAREDSYNC_URL=https://example.comExample config/sharedsync.php:
'driver' => env('SHAREDSYNC_DRIVER', 'ftp'),
'ftp' => [
'host' => env('FTP_HOST'),
'username' => env('FTP_USER'),
'password' => env('FTP_PASS'),
'port' => env('FTP_PORT', 21),
'root' => env('FTP_ROOT', '/'),
'passive' => env('FTP_PASSIVE', true),
'ssl' => env('FTP_SSL', false),
],
'sftp' => [
'host' => env('SFTP_HOST'),
'username' => env('SFTP_USER'),
'password' => env('SFTP_PASS'),
'port' => env('SFTP_PORT', 22),
'root' => env('SFTP_ROOT', '/'),
'privateKey' => env('SFTP_PRIVATE_KEY'),
],
'url' => env('SHAREDSYNC_URL'),The composer build step runs composer install --no-dev --optimize-autoloader in an isolated temporary
directory. This ensures that your local development environment's vendor folder remains untouched
and the current Artisan process is not affected by the removal of dev-dependencies.
This allows you to safely enable the composer build step in your configuration.
php artisan sharedsync:deployTest the connection to your remote server:
php artisan sharedsync:testList files on the remote server:
php artisan sharedsync:lsOr list a specific directory:
php artisan sharedsync:ls path/to/directoryList files that will be uploaded or updated:
php artisan sharedsync:diffSee which files will be uploaded or deleted without actually performing the actions:
php artisan sharedsync:deploy --dry-runIgnore the manifest and upload all files:
php artisan sharedsync:deploy --forceOnly upload files from specific directories:
php artisan sharedsync:deploy --only=app,config,resources/viewsRun health checks on the remote server to ensure permissions are correct and necessary symlinks exist:
php artisan sharedsync:checkThese checks are also automatically performed at the end of every successful deployment.
- Build: Creates an isolated temporary directory, copies the project (excluding
vendor,node_modules,.git), and runscomposer install --no-dev,npm install,npm run build. - Scan: Recursively scans the build directory, applying ignore rules.
- Compare: Compares the scanned files against the last deployment manifest.
- Upload: Connects via FTP/SFTP and uploads new or modified files from the build directory.
- Delete: Removes files from the remote server that no longer exist in the build directory (if enabled).
- Manifest: Updates the local
.deploy-manifest.jsonfile. - Remote Checks: Connects to the remote
/sharedsyncendpoint (secured with a temporary token) to verify storage permissions and ensure thepublic/storagesymlink exists. - Cleanup: Deletes the temporary build directory and the remote security token.
The MIT License (MIT).