Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Rustfs Laravel Package

siberfx/laravel-rustfs

Connect Laravel to RustFS, the S3-compatible object storage written in Rust. The package provides a filesystem driver so you can register a RustFS disk and use Laravel's familiar Storage facade to upload, read, delete, and manage files through the same API you already use for S3.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • The package exposes RustFS as a Laravel filesystem disk, so it slots into the existing Storage facade / FilesystemManager abstraction rather than introducing a parallel storage API. That is the single most important architectural property: application code depends on Laravel contracts, not on RustFS.
  • S3-compatible surface (presigned PUT/POST, multipart and resumable uploads, versioning, object lock, lifecycle/tiering, KMS, event notifications, replication, S3 Select) means the package covers considerably more than a typical "upload a file" driver. Several of these map to compliance and data-governance requirements a TPM is usually accountable for.
  • Release 1.0.1 is documentation and tests only — no code changes since 1.0.0. This is a positive stability signal for the public API but also means the assessment of 1.0.0 code risk is unchanged.

Integration feasibility

  • Low-friction: Composer install, a disk entry in config/filesystems.php, environment-driven credentials, and standard Storage::disk('rustfs') calls. Teams already fluent with the Laravel S3 driver should be productive in days, not weeks.
  • The new README is a genuine integration accelerator — copy-pasteable recipes now exist for the paths that historically consume the most engineering time (direct browser uploads, resumable/multipart, versioning restore, tenant provisioning). This materially reduces the discovery phase of an integration spike.
  • Two features are now demonstrably exercised in CI against a pinned server image (rustfs/rustfs:1.0.3): presigned POST policy enforcement and restoring an older version by copying it onto the same key. Those are the flows most likely to be relied on in production and were previously unverified.

Technical risk

  • Primary risk — presigned PUT does not enforce the signed Content-Type or any size limit. This is a documented, tested limitation, not a bug being fixed. Client-side Content-Type in a PUT is advisory; the server will accept whatever arrives. Consequences are concrete and commercially relevant: unbounded object sizes translate directly into storage and egress cost, and content-type spoofing on a public bucket enables stored-XSS-style abuse when objects are served back.
  • Mitigation is available and documented: presigned POST policies are enforced (EntityTooLarge on oversize, InvalidPolicyDocument on wrong key prefix). This makes presigned POST the correct default for any browser-direct upload path where the server must hold the line on limits.
  • Version maturity is 1.0.x with meaningful but modest live coverage (14 live tests). The CI suite validates the flows it names; it does not constitute broad compatibility assurance across the full S3 surface the README advertises.
  • Server-side compatibility is pinned to RustFS 1.0.3. Behaviour of a self-hosted, relatively young object store is now a dependency of our application's correctness, and that dependency is shared with the storage layer's own release cadence.

Key questions

  • Which upload paths in our product will tolerate an unenforced size/content-type limit, and which must move to presigned POST? Who owns that inventory?
  • Do we have application-layer validation (size caps, MIME sniffing, content-disposition on download) as a defence-in-depth layer regardless of the storage API's enforcement?
  • Are we self-hosting RustFS or consuming a managed endpoint? If self-hosted, who owns upgrades, backups, and the 1.0.3 pin?
  • Do we require object lock (WORM), KMS encryption, or replication for compliance? These are advertised features; have they been validated in our environment, not just documented?
  • What is the blast radius if RustFS's S3 subset diverges from AWS S3 on a call we depend on?

Integration Approach

Stack fit

  • Assumes a conventional Laravel application on PHP 8.x with Flysystem v3 and the AWS S3 Flysystem adapter underneath. No framework-level surgery is required; the disk abstraction is the seam.
  • Fits well where we already use Storage for local and S3 disks and want a self-hosted, S3-compatible target — for data residency, cost, or on-prem requirements.
  • Direct browser uploads (PUT and POST) and resumable/multipart uploads are now documented end-to-end, including the JavaScript. That means large-file and low-latency upload UX can bypass our PHP application servers entirely.

Migration path

  • Because the disk abstraction is the contract, migration is disk-by-disk rather than application-wide. Start with the lowest-risk disk (e.g. user avatars, generated exports) and prove the operational story before touching system-of-record documents.
  • For teams coming from AWS S3 or MinIO, the migration is largely configuration: endpoint, credentials, path-style addressing, bucket. The behavioural differences live at the edges — enforcement semantics, supported API subset — not in the call signatures.
  • Versioning restore is now a tested flow, which de-risks migration of buckets where we intend to carry historical object versions across.
  • Recommended staged path: local/dev against rustfs/rustfs:1.0.3 (matching CI) → staging with production-shaped buckets, lifecycle rules, and IAM → production with a documented rollback to the previous disk.

Compatibility

  • Documented and tested: presigned POST policy enforcement, version restore-on-same-key. Treat these as known-good.
  • Documented and not enforced: presigned PUT content-type and size. Treat this as a design constraint to route around, not a defect to wait out.
  • Untested by the live suite but advertised in the README: object lock/WORM, KMS, replication, S3 Select, event notifications, CORS, tenant provisioning, service accounts. Each of these needs a targeted spike before it appears in a commitment.

Sequencing

  1. Pin rustfs/rustfs:1.0.3 in dev and CI to match the package's validated surface.
  2. Run a short spike covering the flows we actually intend to ship: presigned POST upload, private download, version restore, and one lifecycle rule.
  3. Decide per upload path between PUT (convenience, trust the client) and POST (enforced limits) and record that decision.
  4. Add application-layer validation to cover the PUT gap before any public-facing upload path goes live.
  5. Roll out disk-by-disk behind config, with the previous disk retained as a fallback for one release cycle.

Operational Impact

Maintenance

  • The package itself is low-maintenance: 1.0.1 changed no code, and the API surface is stable at 1.0.0. The real maintenance load sits with the RustFS server, which we either operate or depend on someone operating.
  • Documentation quality is now a genuine operational asset — recipes for backups, cluster status, tracing, and error handling reduce reliance on tribal knowledge and shorten incident diagnosis.
  • Pin both the package and the server image. The CI matrix is validated against RustFS 1.0.3; drifting the server ahead of the package's test coverage reintroduces unknown-unknowns.

Support

  • Upstream support depth is the weak point: a young, single-maintainer-shaped ecosystem around both the package and the server. Budget for internal ownership of the storage layer rather than assuming vendor escalation.
  • The README now functions as first-line support for common tasks, but S3-semantics incidents (policy documents, multipart aborts, lifecycle transitions) will still require an engineer fluent in the S3 model.
  • Establish an internal runbook covering bucket provisioning, credential rotation, service accounts, and restore-from-version before go-live.

Scaling

  • Strong story for upload scale: direct browser uploads and multipart/resumable transfers keep large payloads off the PHP tier, and replication plus tiering give horizontal and cost-scaling levers.
  • Presigned POST shifts enforcement to the storage tier, which is exactly where it belongs for high-volume public ingestion.
  • Multi-tenancy and service accounts suggest a viable shared-cluster model, but tenant provisioning is README-documented rather than CI-verified — validate before designing a tenancy model on it.

Failure modes

  • Unbounded upload via presigned PUT — a malicious or buggy client can store arbitrarily large objects and spoof content types. Cost exposure and content-safety exposure. Mitigate with POST-only for public paths plus hard application-side caps.
  • Public bucket + spoofed content type — stored payloads served back with attacker-chosen types. Mitigate with Content-Disposition, a separate download domain, and response-header policy.
  • Irreversible object lock — WORM retention set incorrectly cannot be walked back. Require review and a dry-run bucket before enabling.
  • Version restore by copy — restore creates a new version; it does not rewind history. Runbooks must reflect the append-only reality so no one expects a rollback.
  • Silent policy mismatch — InvalidPolicyDocument is a clear failure, but misconfigured policy conditions can produce rejections that look like client bugs. Log and surface storage error codes distinctly from application errors.
  • Server-side divergence — an API call supported by AWS S3 but absent or differently implemented in RustFS surfaces late, at the worst time. Front-load the spike on every S3 feature we intend to depend on.

Ramp-up

  • The new README materially shortens ramp-up: a mid-level Laravel engineer can implement form uploads and private downloads in an afternoon from the recipes.
  • The harder competency is S3 policy semantics — presigned POST conditions, multipart lifecycle, versioning and object lock. Plan for one engineer to own that depth rather than distributing it thinly.
  • Onboarding checklist: read the upload security clarification first, decide PUT vs POST per path, confirm the enforcement layer, then follow the relevant recipe. That ordering prevents the most likely early mistake.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
robertmarney/lara-hierarchial-collections
simonschaufi/rule-doc-generator
emissaoja/emissaoja
blackbricksoftware/gravityforms-civicrm-form-processor
al-rahabi/fancy-crud
jinas/dhivatar-component
mltstephane/laravel-quality
bernskiold/laravel-talentlms
bernskioldmedia/laravel-form-architect
youbar/easy-crud
c-point-labs/laravel-hostyourai
dbravoan/dbcms-admin-theme-dbcms
dbravoan/dbcms-theme-db-cyber
dbravoan/dbcms-blocks-basic
dbravoan/dbcms-module-content-audit
dbravoan/dbcms-module-ai-assistant
paygate-to/paygate-php
padosoft/askmydocs-connector-base
defstudio/supercharged-carbon
bernskioldmedia/laravel-matomo