S3-compatible object storage on your own VPS — with automated backups, a web panel, a CLI, and a full REST API. Powered by Garage, secured by Caddy.
Production-ready object storage with batteries included. No vendor lock-in, no hidden costs.
Powered by Garage — a lightweight, self-contained storage engine. Works with any AWS SDK, the
aws CLI, or S3-compatible client.
An interactive script provisions Garage, obtains TLS certificates via Caddy, configures rclone for backups, and wires up nightly cron — all in one run.
Nightly SFTP sync of every bucket to one or more remote servers with date-based retention. Optional S3-to-S3 replication for cross-node redundancy.
Optional Laravel dashboard to browse buckets, manage objects, create and revoke API keys — secured with TOTP two-factor authentication and SMTP password reset.
11 JSON endpoints covering buckets, keys, permissions, and one-call tenant provisioning — with built-in Swagger UI and an OpenAPI spec.
A nightly cron job pulls the latest release, runs database migrations, rebuilds caches, and keeps the panel in sync — zero-downtime updates.
An elegant Laravel dashboard to monitor storage, manage buckets and keys, and issue API tokens — in light or dark mode, secured with TOTP two-factor authentication.
Dashboard — storage overview & top buckets
A push-based model. Orchestration runs only on your primary VPS. Backup servers just need SSH and disk space.
Johnny wraps Garage with everything a production S3 setup needs — TLS, backups, key management, and a REST API — on a single Ubuntu VPS.
/etc/johnny/
Clone the repo, run the installer, and start storing objects. That's it.
Clone outside /root so the Laravel panel can run as www-data.
The interactive wizard installs dependencies, configures Garage, Caddy, rclone, and cron.
Your S3 credentials are ready. Use any AWS SDK or S3 client to start working.
Manage storage, keys, and backups with simple commands.
| johnny version | Print installed version |
| johnny status | Garage cluster status |
| johnny update | Update installation |
| johnny bucket list | List all buckets |
| johnny bucket create | Create a new bucket |
| johnny key list | List API keys |
| johnny key create | Create an API key |
| johnny backup list | List targets & retention |
| johnny backup create | Add a backup target |
| johnny backup delete | Remove a target |
| johnny backup run | Run backup now |
| install-panel.sh | Install the panel |
| johnny:admin | Create admin user |
| config:cache | Rebuild config cache |
Secured with Laravel Sanctum tokens. Interactive docs at /api/docs, OpenAPI spec at
/api/openapi.yaml.
| GET /api/buckets | List all buckets |
| POST /api/buckets | Create a bucket |
| GET /api/buckets/{bucket} | Bucket metadata & keys |
| DEL /api/buckets/{bucket} | Delete an empty bucket |
| GET /api/keys | List Garage keys |
| POST /api/keys | Create a new key |
| GET /api/keys/{keyId} | Key lookup by id |
| DEL /api/keys/{keyId} | Delete a key |
| POST /api/buckets/{b}/keys | Grant key access |
| DEL /api/buckets/{b}/keys/{k} | Revoke key access |
Bucket + key + credentials in one call
Interactive Swagger UI — explore and try every endpoint in the browser
Johnny is fully compatible with Laravel's S3 filesystem driver. Install the Flysystem adapter, paste the
credentials into your .env, and start storing files.
.envWorks with the default s3 disk in filesystems.php — no custom driver
needed. Compatible with Flysystem, AWS SDK for PHP, Intervention Image, and Spatie Media Library. The
provisioning API returns these same keys in an env map for automated tenant onboarding.