A build-to-order ERPNext app that transparently offloads File attachments to S3-compatible object storage per folder, cutting server disk usage while keeping downloads seamless via presigned URLs. ECOSIRE scopes, builds, installs, and supports it for your Frappe/ERPNext v15/v16 site. Built to order by ECOSIRE for ERPNext v15, v16 — indicative price from $249.00 USD; request a quote for a scoped proposal.

A build-to-order ERPNext app that transparently offloads File attachments to S3-compatible object storage per folder, cutting server disk usage while keeping downloads seamless via presigned URLs. ECOSIRE scopes, builds, installs, and supports it for your Frappe/ERPNext v15/v16 site.
No payment now. This sends a quote request to our team — we'll follow up by email with pricing and next steps.
Every ERPNext site accumulates attachments — sales order PDFs, item images, expense receipts, quality inspection photos, employee documents — and by default the File DocType writes all of them straight to the bench's local sites/<site>/private/files and public/files directories on the application server. On a high-attachment-volume site that disk fills relentlessly: your frappe-bench volume balloons, backups take longer and cost more, bench migrate and restore windows grow, and eventually you are resizing the server for storage you should never have been paying compute prices for. ERPNext core has no native concept of routing attachments to object storage, no per-folder storage policy, and no built-in migration path — so teams end up bolting on cron rsync hacks or symlinking files/ to a mount, both of which break on bench update, backups, and multi-bench setups.
Per-folder routing rules via a dedicated configuration DocType that maps each Frappe File folder to a specific S3-compatible bucket, prefix, and access policy
Intercepts the `File` DocType through `hooks.py` doc events (`after_insert`, `on_trash`, `validate`) so new attachments are offloaded automatically without changing any existing upload workflow
S3-compatible backend abstraction supporting AWS S3, MinIO, Wasabi, Backblaze B2, and DigitalOcean Spaces via configurable endpoint, region, and path/virtual-host addressing style
Short-lived presigned GET URLs minted by a whitelisted server method, so private files stream directly from object storage instead of proxying bytes through gunicorn workers
Public vs private bucket policies per folder, letting image-heavy DocTypes serve from a public/CDN origin while HR and finance attachments stay strictly private
CDN-friendly delivery with configurable public base URL / origin so `Website Image` and item media resolve to a cache-fronted host
We build a proper Frappe app (installable via bench get-app / bench install-app) with its own module that intercepts file writes through hooks.py doc events on the File DocType — after_insert, on_trash, and validate — so that attachments in the folders you designate are streamed to an S3-compatible bucket (AWS S3, MinIO, Wasabi, Backblaze B2, DigitalOcean Spaces, or any endpoint that speaks the S3 API) instead of the local disk. Routing is driven by a configuration DocType where you map Frappe File folders to target buckets and policies, so, for example, Home/Attachments/Item Images can go to a public CDN-backed bucket while Home/Attachments/HR stays in a strictly private bucket. Credentials live in encrypted site config, never in the database or code, and every storage backend is validated on save.
File access stays transparent to end users. When a private attachment is requested, the app issues a short-lived presigned URL through a whitelisted method rather than proxying bytes through the Frappe worker, so downloads don't tie up gunicorn/worker processes and large files stream directly from the object store. Public-bucket files can be served straight from a CDN origin for image-heavy DocTypes. A one-time migration tool — implemented as a Frappe scheduler/background job so it doesn't block the request cycle — walks existing File records folder by folder, uploads each object, verifies integrity, rewrites the file_url / content_hash linkage, and (optionally, after a verification pass) reclaims the local disk. Permissions are unchanged: the app respects Frappe's existing File permission model, role profiles, and the private/public distinction, so a presigned URL is only ever minted for a user who is already entitled to that attachment.
Because this is build-to-order, we don't hand you a generic plugin and wish you luck. We start with a short scoping call to confirm your ERPNext version (v15 or v16), attachment volume, which folders and DocTypes need offloading, your target object store, and whether you need public/CDN delivery, private-only, or a mix. We then build your version of the app, test it on a staging copy of your site including a dry-run of the migration against a snapshot of your real files, run UAT with you, and cut over with a documented rollback plan. Typical delivery is 2-4 weeks from confirmed scope. You receive the full source and git repository so you are never locked to us.
Runs a busy ERPNext site where the bench volume keeps filling with attachments. Needs to move file storage off the application server without rewriting workflows or risking existing links, and wants a clean migration for the files already on disk.
Owns the Frappe deployment and hates the rsync/symlink hacks that break on `bench update` and complicate backups. Wants attachments in S3-compatible object storage with proper credentials handling, presigned access, and a solution that survives migrations and multi-bench setups.
Runs catalog, manufacturing, or field-service processes with thousands of item images and inspection photos. Needs public/CDN-backed delivery for images while keeping HR and finance documents private, all routed per folder.
Handles sensitive employee and financial attachments and needs storage segregated into private buckets with the existing Frappe permission model intact, plus an auditable log of what was offloaded and where.
Buy the license on ecosire.com and download the S3 / External File Storage Offloader for ERPNext app ZIP from your account dashboard.
Extract the ZIP into your bench's apps folder, or run `bench get-app` with the path to the extracted app.
Run `bench --site SITE_NAME install-app APP_NAME` followed by `bench migrate` to install S3 / External File Storage Offloader for ERPNext and apply its schema.
Open the ECOSIRE License settings on your site and activate your license key. Requires the free ecosire_connect and ecosire_license_client apps.
| Criterion | ECOSIRE | Custom Build | Competitor | Odoo Native |
|---|---|---|---|---|
| Attachment storage location | Per-folder routing to any S3-compatible bucket | Wherever you code it, if you finish it | Usually a single fixed bucket | |
| Per-folder / public-vs-private policy | Configurable rules per Frappe folder | Possible but you build the config layer | Rarely folder-granular | |
| Migrating existing files | Verified background-job migration + reclaim report | You write and test the migration yourself | Often new-files-only, no migration tool | |
| Private file access | Permission-checked short-lived presigned URLs | Depends on your implementation | Sometimes proxied through workers | |
| Fit to your ERPNext version | Built and tested for your v15/v16 site | Whatever you target | Generic; version support varies | |
| Source & ownership | Full source + git repo handover | You own it | Often closed or license-bound | |
| Testing & rollback | Staging UAT + dry-run migration + rollback plan | Your responsibility | Install-at-your-own-risk | |
| Support after go-live | Post-go-live support window from ECOSIRE | None unless you staff it | Forum/community, variable |
This is a build-to-order app, not an instant download. After a short scoping call to confirm your ERPNext version, folders, and target object store, typical delivery is 2-4 weeks from confirmed scope. That includes building your version, testing on a staging copy of your site, a dry-run migration against a snapshot of your real files, UAT, and cutover with a rollback plan.
Any S3-compatible endpoint — AWS S3, MinIO (self-hosted), Wasabi, Backblaze B2, and DigitalOcean Spaces are all supported via configurable endpoint, region, and addressing style. If your provider speaks the S3 API, we can target it. We confirm the exact backend during scoping.
No. The migration tool rewrites each `File` record's `file_url` linkage as it moves the object, and file access stays transparent through presigned URLs, so existing document attachments keep resolving. We verify integrity with content-hash/ETag comparison before any local copy is reclaimed, and we run the whole migration as a dry-run on staging first with a tested rollback plan.
Yes. We build and test against your confirmed version — v15 or v16 — using the current Frappe app conventions (hooks doc events on the `File` DocType, whitelisted methods, scheduler events). We target one version for your build; if you plan to upgrade, tell us during scoping so we can account for it.
Private files are never made publicly readable. They're served via short-lived presigned URLs minted by a whitelisted method only after the request passes Frappe's existing `File` permission checks, so a user who cannot see an attachment in ERPNext cannot obtain a link to it. Bucket credentials are stored encrypted in site config, never in the database or code.
Every engagement includes a post-go-live support window for defect fixes and configuration adjustments. Because you receive the full source and git repository, your own team can also maintain it. We offer ongoing support and version-upgrade work (for example, an ERPNext major-version bump) as a separate arrangement — just ask during scoping.
Yes. Routing is per folder, so you can send item images and website media to a public, CDN-fronted bucket for fast cached delivery while HR, finance, and other sensitive folders route to strictly private buckets that only ever resolve through presigned URLs.
A build-to-order ERPNext app that transparently offloads File attachments to S3-compatible object storage per folder, cutting server disk usage while keeping downloads seamless via presigned URLs. ECOSIRE scopes, builds, installs, and supports it for your Frappe/ERPNext v15/v16 site.