Skip to main content
S3 Attachment Storage for Odoo — A build-to-order Odoo module that offloads document, image, and report attachments from your — 1/1Illustrative preview

A build-to-order Odoo module that offloads document,

image, and report attachments from your database and filesystem into Amazon S3 or any S3-compatible bucket. ECOSIRE scopes, builds, installs, and supports it for Odoo 17.0, 18.0, or 19.0.

What is S3 Attachment Storage for Odoo?

A build-to-order Odoo module that offloads document, image, and report attachments from your database and filesystem into Amazon S3 or any S3-compatible bucket. ECOSIRE scopes, builds, installs, and supports it for Odoo 17.0, 18.0, or 19.0. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $999.00 USD; request a quote for a scoped proposal.

Key Features

Overrides `ir.attachment` storage hooks (`_file_write`, `_file_read`, `_file_delete`) to route binaries to S3 while preserving Odoo's `XX/<sha1>` checksum-addressed key scheme
Works with Amazon S3 and any S3-compatible endpoint (MinIO, Wasabi, Backblaze B2, DigitalOcean Spaces) via a configurable endpoint URL
Credentials, bucket, region, endpoint, and key prefix stored as `ir.config_parameter` / system parameters and surfaced in an inherited `res.config.settings` Settings view — nothing hard-coded
Batched, resumable migration action to move existing filestore objects into the bucket with no downtime and dry-run counting
Transparent read fallback to the local filestore for any object not yet migrated, so cutover is incremental and safe
Optional server-side encryption (SSE-S3 or SSE-KMS) with configurable KMS key id
Configurable multipart-upload threshold and boto3 client connection reuse for large report exports, images, and video attachments
Presigned time-limited GET URLs for website assets and large-file downloads so bytes stream from the bucket, not through Odoo workers
Attachment access continues to honor `ir.model.access.csv` and record rules — storage location changes, authorization does not
Compatible with XML-RPC/JSON-RPC attachment read/write paths so existing external integrations keep working unchanged
Fail-loud upload error handling — a failed PUT raises instead of silently dropping the binary, protecting chatter and report data
GC-safe delete path aligned with Odoo's filestore garbage collection so orphaned keys are removed, not leaked
Structured logging on upload/read/delete and migration progress for observability and audit
Built and tested against your exact target series — Odoo 17.0, 18.0, or 19.0, Community or Enterprise

Built to order, done for you

No DIY setup — a working app, built, installed and supported by ECOSIRE.

  1. 1

    You order

    Start with a one-time build price. We scope it with you at kickoff.

  2. 2

    We build & install

    ECOSIRE builds, configures and installs it on your Odoo.

  3. 3

    Go live + support

    You go live in about one working week, with two weeks of go-live support. Defects in the code we deliver are fixed free of charge.

Technical Specifications

Odoo Compatibility
Odoo 17, Odoo 18, Odoo 19
Editions
Enterprise & Community
License
Licence confirmation required
Python Requirement
Python 3.10+
Database
PostgreSQL 12+

About this Product

Every Odoo deployment eventually hits the attachment problem. By default ir.attachment writes binary payloads to the local filestore under the database data directory (or, worse, inline into the bytea column when the filestore is misconfigured), which means your PDFs, product images, QWeb report snapshots, chatter files, and email bodies all pile up on the same disk that runs the database. Backups balloon, pg_dump slows to a crawl, filestore sync between production and staging becomes fragile, and horizontal scaling is effectively blocked because every worker node needs a consistent copy of the same growing directory. Odoo core gives you no supported way to point that storage at durable, elastic object storage — it runs out of road exactly when your data volume starts to matter.

ECOSIRE builds a made-to-order module that overrides the storage layer of ir.attachment so that attachment binaries are written to and read from an S3 bucket instead of the local filestore. Technically, we extend models.Model on ir.attachment, intercepting _file_write, _file_read, _file_delete, and the store_fname/db_datas resolution path so the checksum-addressed key scheme Odoo already uses (XX/<sha1>) is preserved as an S3 object key under a configurable prefix. Credentials, bucket, region, endpoint URL, and prefix are held as ir.config_parameter values (or system parameters surfaced in Settings via an inherited res.config.settings view), never hard-coded — so the same build works against Amazon S3, MinIO, Wasabi, Backblaze B2, DigitalOcean Spaces, or any S3-compatible endpoint by changing the endpoint URL. We wire the boto3 client with connection reuse, optional server-side encryption (SSE-S3 or SSE-KMS), and configurable multipart thresholds so large report exports and video attachments upload reliably. A garbage-collection-safe delete path and an optional migration action (batched, resumable) move your existing filestore objects up to the bucket without downtime.

Because this is an override of a core storage path, it is built defensively: reads fall back to the local filestore for any object not yet migrated, failed uploads raise cleanly instead of silently dropping data, and access to attachments continues to obey Odoo's existing ir.model.access.csv grants and record rules — moving the bytes to S3 changes where they live, not who is allowed to read them. Presigned-URL delivery (time-limited GET links) is available for public website assets and large-file download flows so binaries stream from the bucket rather than through the Odoo workers. The module ships with its own __manifest__.py, a settings view, sensible defaults, and log instrumentation, and is compatible with the XML-RPC/JSON-RPC API paths that read and write attachments so external integrations keep working unchanged. Community and Enterprise editions are both supported; the delivery targets your exact Odoo series (17.0, 18.0, or 19.0).

Delivery is build-to-order. After a short scoping call we confirm your Odoo version and edition, your target bucket and region (or the S3-compatible endpoint you run), your encryption and access requirements, and whether you need existing attachments migrated. You approve a fixed quote and scope, we build against a staging copy of your database, run UAT with you, and then install on production with a rollback plan. Typical delivery is one working week from confirmed scope. Pricing starts from $999 (indicative, single-company base scope); data migration volume, multi-company or multi-database setups, custom encryption/KMS policy, and presigned-URL website delivery increase the quoted scope.

What you get

  • Installable source code for your version of the module, targeted at your exact Odoo series and edition
  • Installation and configuration on your staging environment, including bucket/endpoint wiring and Settings parameters
  • Technical documentation covering architecture, config parameters, encryption options, and the migration procedure
  • End-user / administrator guide plus one live training session for your team
  • UAT on a staging copy of your database with a documented rollback plan before production cutover
  • Post-go-live support window for defect fixes and configuration adjustments
  • Git repository handover with full commit history and tagged release
  • Optional supervised production migration run of existing filestore attachments into the bucket

Who this is for

Odoo system administrator / DevOps lead

Runs production Odoo and needs to shrink database backups, decouple attachment storage from the app servers, and enable multi-node scaling by moving the filestore to durable object storage rather than a shared local disk.

CFO or operations head at a document-heavy business

Deals with large volumes of invoices, contracts, product images, and QWeb report archives and wants those retained in cheap, durable, encrypted object storage without inflating the core ERP database or its backup costs.

IT manager with compliance and data-residency requirements

Needs attachments held in a specific region or on a self-hosted S3-compatible endpoint (MinIO/Wasabi) with server-side encryption, while keeping Odoo's existing access rules over who can read each document.

Managed-hosting / systems-integrator partner

Hosts Odoo for multiple clients and wants a supported, buildable pattern to offload attachments to per-tenant buckets, with a migration path for existing deployments and a git handover they can maintain.

How S3 Attachment Storage for Odoo Compares

CriterionECOSIRECustom BuildCompetitorOdoo Native
Storage targetAmazon S3 or any S3-compatible endpoint, configurable per deploymentWhatever you build in-house; endpoint flexibility depends on effortOften fixed to one provider or limited endpointsLocal filestore on the Odoo server disk only
Odoo version fitBuilt and tested against your exact 17.0/18.0/19.0 + editionYou maintain version compatibility yourselfDepends on the listing; may lag current seriesShips with core, no S3 option at all
Existing-data migrationBatched, resumable migration action with filestore fallbackMust be designed and tested from scratchMigration tooling varies; often manual or absentN/A — no move path off local disk
Access controlPreserves `ir.model.access.csv` + record rules; optional presigned URLsCorrect only if you re-implement the checks carefullyUsually preserved but rarely documented in detailStandard Odoo access rules on local files
EncryptionSSE-S3 or SSE-KMS, configurable KMS keyOnly if you build itMay offer basic SSE, KMS policy often not configurableFilesystem/OS-level only
Support & handoverDocs, training, support window, git repo handoverInternal knowledge only; bus-factor riskVendor support varies; source may be obfuscatedCommunity forums / your own team
Configuration approachSystem parameters + inherited Settings view, nothing hard-codedHowever your developer chooses to store secretsSettings UI quality varies by listingNo configuration surface for object storage
Delivery modelBuild-to-order, scoped quote, UAT + rollback planFull in-house project you plan and staffInstant download, generic, self-installAlready included in Odoo core

Frequently Asked Questions about S3 Attachment Storage

How long does delivery take?

This is a build-to-order module, not an instant download. Typical delivery is one working week from confirmed scope. After a scoping call we confirm your Odoo version, edition, bucket/endpoint, encryption needs, and migration volume, then build against a staging copy of your database, run UAT, and install on production with a rollback plan.

How does pricing and scoping work?

Pricing starts from $999 as an indicative single-company base-scope figure. It is not a fixed final price. After a short scoping call we issue a fixed written quote based on your actual requirements — data migration volume, multi-company or multi-database setups, custom KMS encryption policy, and presigned-URL website delivery are the main drivers that increase scope.

What happens to attachments that are already in my filestore?

We build in an optional batched, resumable migration action that moves your existing filestore objects into the bucket without downtime, and reads transparently fall back to the local filestore for anything not yet migrated. This lets you cut over incrementally. A supervised production migration run can be included in scope.

Does this work with storage other than Amazon S3?

Yes. Because the bucket, region, and endpoint URL are configuration parameters, the same build works against any S3-compatible object storage — for example MinIO, Wasabi, Backblaze B2, or DigitalOcean Spaces — by pointing it at the appropriate endpoint. This also supports data-residency and self-hosted requirements.

Will moving attachments to S3 change who can access them?

No. The module changes where attachment binaries are stored, not authorization. Access continues to be governed by Odoo's existing `ir.model.access.csv` grants and record rules on `ir.attachment`. Optional presigned URLs are time-limited so shared links expire rather than exposing the bucket.

Which Odoo versions and editions are supported?

We build and test against your exact target series — Odoo 17.0, 18.0, or 19.0 — on either Community or Enterprise. Because this overrides a core storage path, we always target one specific version rather than shipping a generic multi-version binary.

What about support and updates after go-live?

Every build includes a post-go-live support window for defect fixes and configuration adjustments, plus a git repository handover so your team can maintain it. Ongoing support, version upgrades to a newer Odoo series, or feature extensions can be arranged as a separate scoped engagement.

Request a quote

S3 Attachment Storage

A build-to-order Odoo module that offloads document, image, and report attachments from your database and filesystem into Amazon S3 or any S3-compatible bucket. ECOSIRE scopes, builds, installs, and supports it for Odoo 17.0, 18.0, or 19.0.

  • Overrides `ir.attachment` storage hooks (`_file_write`, `_file_read`, `_file_delete`) to route binaries to S3 while preserving Odoo's `XX/<sha1>` checksum-addressed key scheme
  • Works with Amazon S3 and any S3-compatible endpoint (MinIO, Wasabi, Backblaze B2, DigitalOcean Spaces) via a configurable endpoint URL
  • Credentials, bucket, region, endpoint, and key prefix stored as `ir.config_parameter` / system parameters and surfaced in an inherited `res.config.settings` Settings view — nothing hard-coded
  • Batched, resumable migration action to move existing filestore objects into the bucket with no downtime and dry-run counting

Request a Quotation

Tell us about your S3 Attachment Storage requirements and we'll send pricing, licensing options and a tailored proposal — usually within one business day.

No payment now. This sends a quote request to our team — we'll follow up by email with pricing and next steps.