En algunos casos, es necesario almacenar los archivos adjuntos en otro sistema distinto del filestore de Odoo. Por ejemplo, cuando tu despliegue se basa en una arquitectura multiservidor para garantizar la redundancia y la escalabilidad, tus archivos adjuntos deben almacenarse de forma que sean accesibles desde todos los servidores. De este modo, puedes utilizar un sistema de almacenamiento compartido como NFS o un almacenamiento en la nube como un almacenamiento compatible con S3, o....
Este addon amplía el mecanismo de almacenamiento de los archivos adjuntos de Odoo para permitirte almacenarlos en cualquier sistema de archivos de almacenamiento compatible con la librería de Python fsspec y disponible a través del addon fs_storage.
A diferencia de Odoo, cuando un archivo se almacena en un almacenamiento externo, este addon garantiza que el nombre del archivo conserve su significado (en Odoo, el nombre del archivo dentro del filestore es el checksum del contenido del archivo). Concretamente, el nombre del archivo se basa en el patrón: '\-\-\.\'
Este addon también añade en los archivos adjuntos 2 nuevos campos que se utilizan para recuperar el contenido del archivo desde una URL:
- Internal URL: URL para recuperar el contenido del archivo desde el filestore de Odoo.
- Filesystem URL: URL para recuperar el contenido del archivo desde el almacenamiento externo.
Nota
La URL interna siempre está disponible, pero la URL del sistema de archivos solo está disponible cuando el archivo adjunto se almacena en un almacenamiento externo. Se ha prestado especial atención a limitar en la medida de lo posible el consumo de recursos necesarios para servir a través de Odoo el contenido almacenado en un sistema de archivos externo. La implementación se basa por defecto en un streaming de extremo a extremo del contenido entre el sistema de archivos externo y la aplicación cliente de Odoo. No obstante, si tu contenido está disponible a través de una URL en el sistema de archivos externo, puedes configurar el almacenamiento para utilizar el mecanismo x-sendfile y servir el contenido si está activado en tu instancia de Odoo. En este caso, el contenido servido por Odoo en la URL interna se redirigirá mediante proxy a la URL del sistema de archivos por nginx.
Por último, pero no menos importante, el addon añade un nuevo método open en el archivo adjunto. Este método te permite abrir el archivo adjunto como un archivo. Para los archivos adjuntos almacenados en el filestore o en un sistema de archivos externo, te permite leer y escribir directamente en el archivo y, por lo tanto, minimizar el consumo de memoria, ya que los datos no se mantienen en memoria antes de escribirse en la base de datos.
Traducción automática al español (DeepSeek) de la descripción original de OCA, que está en inglés.
auto_awesome Qué hace este módulo
Generado por IA a partir del código · Odoo 19.0Permite a Odoo almacenar los adjuntos (documentos, imágenes, archivos) en un almacenamiento externo, como un disco compartido o un almacén de objetos en la nube, en lugar del disco local del servidor, y mantiene los nombres de archivo legibles y enlazables.
Este módulo cambia el lugar donde Odoo guarda los archivos adjuntos a los registros. En lugar del disco del servidor local, los adjuntos se pueden guardar en cualquier almacenamiento configurado mediante el complemento de almacenamiento (por ejemplo, una unidad de red compartida o un bucket en la nube).
En cada pantalla de configuración de almacenamiento obtienes nuevas opciones: - Marcar un almacenamiento como predeterminado para todos los adjuntos (solo uno puede ser predeterminado; Odoo rechaza un segundo). - Mantener las imágenes pequeñas y los archivos de estilo/script en la base de datos para que las vistas de lista y kanban sigan siendo rápidas; los límites de tamaño son editables como una simple lista de tipos de archivo. - Optimizar la estructura de carpetas para que los archivos se distribuyan en subcarpetas. - Crear direcciones web públicas para los archivos, incluyendo opcionalmente la ruta de la carpeta, y servirlas a través de un proxy (X-Sendfile) en lugar de Odoo. - Ocultar (ofuscar) los nombres de archivo en el almacenamiento y ejecutar la limpieza automática de los archivos no utilizados.
En los adjuntos, los nuevos campos de solo lectura muestran el almacenamiento utilizado, el nombre del archivo en el almacenamiento, una URL interna y una URL del sistema de archivos. Los nombres de archivo se hacen significativos (basados en el nombre del adjunto, el id del registro y un número de versión) en lugar de un checksum, y se renombran cuando cambia el nombre del adjunto.
Un trabajo de limpieza en segundo plano elimina los archivos del almacenamiento una vez que ningún adjunto los referencia. Los administradores pueden desencadenar una migración de los adjuntos existentes al almacenamiento, o mover los archivos pequeños/especiales de vuelta a la base de datos.
Depende de
Lo necesitan otros módulos
Modelos y campos (4)
- ir.binary · amplía un modelo existente
- fs.file.gc · modelo nuevostore_fname (Stored Filename), fs_storage_code (Storage Code)
- fs.storage · amplía un modelo existentebase_url, autovacuum_gc (Autovacuum Garbage Collection), base_url_for_files, is_directory_path_in_url, optimizes_directory_path, use_filename_obfuscation, use_as_default_for_attachments, use_x_sendfile_to_serve_internal_url (Use X-Sendfile To Serve Internal Url), force_db_for_default_attachment_rules
- ir.attachment · amplía un modelo existentefs_url (Filesystem URL), fs_filename (File Name into the filesystem storage), fs_url_path (Filesystem URL Path), internal_url (Internal URL), fs_storage_id, fs_storage_code (Filesystem Storage Code)
Texto generado por IA (DeepSeek) al leer el código de la versión 19.0 en GitHub; puede contener errores, así que verifícalo en el código antes de decidir. El módulo es muy grande y solo se ha leído una parte del código. Ver el código en GitHub
Disponibilidad por versión
Revisado: 2026-11-03Estado de confirmación: 3 confirmadas, 6 sin información de 9 versiones.
Fuentes · Odoo 16.0
Confirmado el 2026-11-03 en la rama 16.0 de OCA/storage.
terminal Instalación y uso
Documentación de OCA · Odoo 19.0Configuración
La configuración se realiza mediante la creación de un registro de almacenamiento del sistema de archivos en odoo. Para crear un nuevo almacenamiento, vaya al menú Settings > Technical > FS Storage y haga clic en Create.
Además de los campos comunes disponibles para configurar un almacenamiento, hay campos específicos disponibles en la sección 'Attachment' para configurar la forma en que se almacenarán los archivos adjuntos en el sistema de archivos.
Optimizes Directory Path: Esta opción es útil si necesita evitar tener demasiados archivos en un solo directorio. Creará una estructura de directorios basada en el checksum del archivo adjunto (con 2 niveles de profundidad). Por ejemplo, si el checksum es123456789, el archivo se almacenará en el directorio/path/to/storage/12/34/my_file-1-0.txt.Autovacuum GC: Se utiliza para eliminar automáticamente archivos del sistema de archivos cuando ya no se hace referencia a ellos en Odoo. Algunos backends de almacenamiento (como S3) pueden cobrarle por el almacenamiento de archivos, por lo que es importante eliminarlos cuando ya no sean necesarios. En algunos casos, esta opción no es deseable, por ejemplo si está utilizando un backend de almacenamiento para almacenar imágenes compartidas con otros sistemas (como su sitio web) y no desea eliminar los archivos del almacenamiento mientras todavía se hace referencia a ellos en los otros sistemas. Este mecanismo se basa en un modelofs.file.gcutilizado para recopilar los archivos a eliminar. Este modelo se rellena automáticamente mediante el modeloir.attachmentcuando se elimina un archivo de la base de datos. Si desactiva esta opción, tendrá que encargarse manualmente de los registros enfs.file.gcpara su almacenamiento del sistema de archivos.Use As Default For Attachment: Esta opción le permite declarar el almacenamiento como el predeterminado para los archivos adjuntos. Si tiene varios almacenamientos del sistema de archivos configurados, puede elegir cuál se utilizará de forma predeterminada para los archivos adjuntos. Una vez activada, los archivos adjuntos creados sin especificar un almacenamiento se almacenarán en este almacenamiento predeterminado.Force DB For Default Attachment Rules: Esta opción es útil si desea forzar el almacenamiento de algunos archivos adjuntos en la base de datos, incluso si tiene un almacenamiento del sistema de archivos predeterminado configurado. Esto es especialmente útil cuando utiliza un backend de almacenamiento como S3, donde la latencia de la red puede ser alta. Esta opción es un campo JSON que le permite definir los mimetypes y el límite de tamaño por debajo del cual los archivos adjuntos se almacenarán en la base de datos. Las imágenes pequeñas (128, 256) se utilizan en Odoo en vistas de lista / kanban. Queremos que sean rápidas de leer. Generalmente son \< 50KB (configuración predeterminada), por lo que no ocupan mucho espacio en la base de datos, pero se leerán mucho más rápido que desde el almacenamiento de objetos. Los assets (application/javascript, text/css) también se almacenan en la base de datos independientemente de su tamaño:- una base de datos no tiene miles de ellos
- por supuesto, mejor para el rendimiento
- mejor portabilidad de una base de datos: al replicar una instancia de producción para desarrollo, los assets se incluyen. La configuración predeterminada es: > {"image/": 51200, "application/javascript": 0, "text/css": 0} > > Donde la clave es el comienzo del mimetype a configurar y el > valor es el límite de tamaño por debajo del cual los archivos adjuntos se mantienen en la BD. 0 > significa sin límite. La configuración predeterminada significa:
- los mimetypes de imágenes (image/png, image/jpeg, ...) por debajo de 50KB se almacenan en la base de datos
- application/javascript se almacenan en la base de datos independientemente de su tamaño
- text/css se almacenan en la base de datos independientemente de su tamaño. Esta opción solo está disponible en el almacenamiento del sistema de archivos que se utiliza como predeterminado para los archivos adjuntos.
También es posible utilizar diferentes almacenamientos FS para archivos adjuntos vinculados a diferentes campos/modelos de recursos. Puede configurarlo directamente en el fs.storage, o en un archivo de entorno de servidor:
- Desde el
fs.storage: Los campos model_ids y field_ids codificarán para qué modelos/campos utilizar este almacenamiento como almacenamiento predeterminado para los archivos adjuntos que tengan estos modelo/campo de recurso. Tenga en cuenta que si un archivo adjunto tiene tanto modelo como campo de recurso, primero tomará el almacenamiento FS donde el campo está vinculado explícitamente, luego, si no se encuentra, el que está vinculado explícitamente al modelo. - Desde un archivo de entorno de servidor: En este caso solo tiene que proporcionar una lista separada por comas de modelos (bajo la clave model_xmlids) o campos (bajo la clave field_xmlids). Para ello, utilice los XML ids de modelo/campo proporcionados por Odoo. Consulte la sección Server Environment para ver un ejemplo concreto.
Otra característica clave de este módulo es la capacidad de acceder a los archivos adjuntos desde URLs.
Base URL: Esta es la URL base utilizada para acceder a los archivos adjuntos desde el propio almacenamiento del sistema de archivos. Si su almacenamiento no proporciona una forma de acceder a los archivos desde una URL, puede dejar este campo vacío.Is Directory Path In URL: Normalmente el parche de directorio configurado en el almacenamiento no se incluye en la URL. Si desea incluirlo, puede activar esta opción.Use X-Sendfile To Serve Internal Url: Si está marcado y odoo está detrás de un proxy que admite x-sendfile, el contenido servido por la URL interna del archivo adjunto será servido por el proxy utilizando la ruta url del sistema de archivos si está definida (Este campo está disponible en el archivo adjunto si el almacenamiento está configurado con una URL base). Si no, el archivo será servido por odoo que transmitirá el contenido leído desde el almacenamiento del sistema de archivos. Esta opción es útil para evitar servir archivos desde odoo y, por lo tanto, evitar cargar el proceso de odoo. Para que sea totalmente funcional, esta opción requiere que el proxy admita x-sendfile (apache) o x-accel-redirect (nginx). También debe configurar su proxy añadiendo para cada almacenamiento una regla para redirigir la url con raíz en el 'storagge code' al servidor que sirve los archivos. Por ejemplo, si tiene un almacenamiento con el código 'my_storage' y un servidor que sirve los archivos en la url '', debe añadir la siguiente regla en su configuración de proxy:
location /my_storage/ {
internal;
proxy_pass http://myserver.com;
}Con esta configuración, una llamada a '/web/content/\/\\" para un archivo almacenado en el almacenamiento 'my_storage' generará una respuesta de odoo con la URI /my_storage/<paht_in_storage>/<att.name>-<att.id>-<version><att.extension> en las cabeceras X-Accel-Redirect y X-Sendfile y el proxy redirigirá a http://myserver.com/<paht_in_storage>/<att.name>-<att.id>-<version><att.extension>.
ver
para más información.
Use Filename Obfuscation: Si está marcado, el nombre de archivo utilizado para almacenar el contenido en el almacenamiento del sistema de archivos será ofuscado. Esto es útil para evitar exponer el nombre de archivo real de los archivos adjuntos fuera de la base de datos de Odoo. El nombre de archivo se ofuscará utilizando el checksum del contenido. Esta opción debe evitarse cuando el contenido de su filestore se comparte con otros sistemas (como su sitio web) y desea mantener un nombre de archivo significativo para garantizar el SEO. Esta opción está deshabilitada de forma predeterminada.
Server Environment
Cuando configura un almacenamiento mediante el uso de un archivo de entorno de servidor, puede proporcionar valores para las siguientes claves:
optimizes_directory_pathautovacuum_gcbase_urlis_directory_path_in_urluse_x_sendfile_to_serve_internal_urluse_as_default_for_attachmentsforce_db_for_default_attachment_rulesuse_filename_obfuscationmodel_xmlidsfield_xmlids
Por ejemplo, la configuración de mi almacenamiento con el código fsprod utilizado para almacenar los archivos adjuntos de forma predeterminada podría ser:
[fs_storage.fsprod]
protocol=s3
options={"endpoint_url": "https://my_s3_server/", "key": "KEY", "secret": "SECRET"}
directory_path=my_bucket
use_as_default_for_attachments=True
use_filename_obfuscation=True
model_xmlids=base.model_res_lang,base.model_res_country
field_xmlids=base.field_res_partner__image_128Uso avanzado: Usar el archivo adjunto como un archivo
El método open del archivo adjunto se puede utilizar para abrir y manipular el archivo adjunto como un objeto de archivo. El objeto devuelto por la llamada al método implementa métodos de io.IOBase. El método se puede llamar como cualquier otro método de python. En tal caso, es su responsabilidad cerrar el archivo al final de su proceso.
attachment = self.env.create({"name": "test.txt"})
the_file = attachment.open("wb")
try:
the_file.write(b"content")
finally:
the_file.close()El resultado de la llamada a open también funciona en un bloque de contexto with. En tal caso, cuando el código sale del bloque, el archivo se cierra automáticamente.
attachment = self.env.create({"name": "test.txt"})
with attachment.open("wb") as the_file:
the_file.write(b"content")Siempre es más seguro preferir el segundo enfoque.
Cuando su archivo adjunto se almacena en el filestore de odoo o en un almacenamiento externo del sistema de archivos, cada vez que llama al método open, se crea un nuevo archivo. Esta forma de hacerlo garantiza que si la transacción se revierte, el contenido original se conserva. Sin embargo, podría tener casos de uso en los que desee escribir directamente en el archivo existente. Por ejemplo, podría crear un archivo adjunto vacío para almacenar un informe csv y luego usar el método open para escribir su contenido directamente en el nuevo archivo. Para admitir este tipo de casos de uso, el parámetro new_version se puede pasar como False para evitar la creación de un nuevo archivo.
attachment = self.env.create({"name": "test.txt"})
with attachment.open("w", new_version=False) as f:
writer = csv.writer(f, delimiter=";")
....Consejos y trucos
- Cuando se trabaja en entornos de múltiples staging, la gestión de los archivos adjuntos puede ser complicada. Por ejemplo, si tiene una instancia de producción y una instancia de staging basada en una copia de seguridad del entorno de producción, es posible que desee tener los archivos adjuntos compartidos entre las dos instancias PERO no desea que una instancia elimine o modifique los archivos adjuntos de la otra instancia. Para ello, puede añadir en sus instancias de staging un nuevo almacenamiento y declararlo como el almacenamiento predeterminado a utilizar para los archivos adjuntos. De esta forma, todos los nuevos archivos adjuntos se almacenarán en este nuevo almacenamiento, pero los archivos adjuntos creados en la instancia de producción todavía se leerán desde el almacenamiento de producción. Tenga cuidado de adaptar la configuración de su almacenamiento al entorno de producción para que sea de solo lectura. (El uso de archivos de entorno de servidor es una buena forma de hacerlo).
- Al habilitar
Use As Default For Attachmentdebe tener en cuenta que esta opción se aplica desde el momento en quefs_attachmentha sido cargado por Odoo. Esto significa que algunos archivos adjuntos (como los iconos) creados durante la actualización de módulos que se cargan antes defs_attachmenttodavía se almacenarán en la ubicación definida en el parámetro del sistemair_attachment.location(que esfilede forma predeterminada, lo que significa el directorio normal en discofilestore). Una forma sencilla de solucionar este problema es establecer el registro del parámetro del sistemair_attachment.locationendb.
Traducción automática al español (DeepSeek) de la documentación original de OCA; los comandos y el código no se traducen. Sin información verificada en OCA: Instalación, Configuración.
Las instrucciones de instalación, el paquete de distribución, las dependencias y los pasos de configuración no se muestran porque todavía no se han verificado en la documentación del módulo para ninguna versión.
Datos importados de GitHub: esta ficha refleja la última revisión del catálogo, no una consulta en directo. Verifica siempre en la documentación del módulo y en staging antes de instalar en producción.