diff --git a/attachment_minio/README.md b/attachment_minio/README.md new file mode 100644 index 00000000..1e32a8e0 --- /dev/null +++ b/attachment_minio/README.md @@ -0,0 +1,52 @@ +# Use MinIO (or Amazon S3) for Attachment/filestore + +MinIO provides S3 API compatible storage to scale out without a shared filesystem like NFS. + +This module will store the bucket used in the attachment database object, thus allowing +you to retain read-only access to the filestore by simply overriding the bucket. + +## Setup details + +Before installing this app, you should add several System Parameters (the most important of +which is `ir_attachment.location`), OR set them through the config file as described later. + +**The in database System Parameters will act as overrides to the Config File versions.** + +| Key | Example Value | Default Value | +|-----------------------------------|---------------|---------------| +| ir_attachment.location | s3 | | +| ir_attachment.location.host | minio:9000 | | +| ir_attachment.location.bucket | odoo | | +| ir_attachment.location.region | us-west-1 | us-west-1 | +| ir_attachment.location.access_key | minio | | +| ir_attachment.location.secret_key | minio_secret | | +| ir_attachment.location.secure | 1 | | + +**Config File:** + +``` +attachment_minio_host = minio:9000 +attachment_minio_region = us-west-1 +attachment_minio_access_key = minio +attachment_minio_secret_key = minio_secret +attachment_minio_bucket = odoo +attachment_minio_secure = False +``` + +In general, they should all be specified other than "region" (if you are not using AWS S3) +and "secure" which should be set if the "host" needs to be accessed over SSL/TLS. + +Install `attachment_minio` and during the installation `base_attachment_object_storage` should move +your existing filestore attachment files into the database or object storage. + +For example, you can run a shell command like the following to set the parameter: + +``` +env['ir.config_parameter'].set_param('ir_attachment.location', 's3') +# If already installed... +# env['ir.attachment'].force_storage() +env.cr.commit() +``` + +If `attachment_minio` is not already installed, you can then install it and the migration +should be noted in the logs. **Ensure that the timeouts are long enough that the migration can finish.** diff --git a/attachment_minio/__manifest__.py b/attachment_minio/__manifest__.py index 5b7c2f32..6deb8c5a 100755 --- a/attachment_minio/__manifest__.py +++ b/attachment_minio/__manifest__.py @@ -7,40 +7,59 @@ "author": "Hibou Corp.", "license": "AGPL-3", "description": """ -################################################# -Use MinIO (or Amazon S3) for Attachment/filestore -################################################# +# Use MinIO (or Amazon S3) for Attachment/filestore MinIO provides S3 API compatible storage to scale out without a shared filesystem like NFS. +This module will store the bucket used in the attachment database object, thus allowing +you to retain read-only access to the filestore by simply overriding the bucket. -Setup details -############# +## Setup details -Before installing this app, you should add several System Parameters. +Before installing this app, you should add several System Parameters (the most important of +which is `ir_attachment.location`), OR set them through the config file as described later. -Key : Example Value : Default Value +**The in database System Parameters will act as overrides to the Config File versions.** -ir_attachment.location : s3 : _ +| Key | Example Value | Default Value | +|-----------------------------------|---------------|---------------| +| ir_attachment.location | s3 | | +| ir_attachment.location.host | minio:9000 | | +| ir_attachment.location.bucket | odoo | | +| ir_attachment.location.region | us-west-1 | us-west-1 | +| ir_attachment.location.access_key | minio | | +| ir_attachment.location.secret_key | minio_secret | | +| ir_attachment.location.secure | 1 | | -ir_attachment.location.host : minio.yourdomain.com : _ - -ir_attachment.location.bucket : odoo-prod : _ - -ir_attachment.location.region : us-west-1 : us-west-1 - -ir_attachment.location.access_key : odoo : _ - -ir_attachment.location.secret_key : 123456 : _ - -ir_attachment.location.secure : 1 : _ +**Config File:** +``` +attachment_minio_host = minio:9000 +attachment_minio_region = us-west-1 +attachment_minio_access_key = minio +attachment_minio_secret_key = minio_secret +attachment_minio_bucket = odoo +attachment_minio_secure = False +``` In general, they should all be specified other than "region" (if you are not using AWS S3) and "secure" which should be set if the "host" needs to be accessed over SSL/TLS. Install `attachment_minio` and during the installation `base_attachment_object_storage` should move your existing filestore attachment files into the database or object storage. + +For example, you can run a shell command like the following to set the parameter: + +``` +env['ir.config_parameter'].set_param('ir_attachment.location', 's3') +# If already installed... +# env['ir.attachment'].force_storage() +env.cr.commit() +``` + +If `attachment_minio` is not already installed, you can then install it and the migration +should be noted in the logs. **Ensure that the timeouts are long enough that the migration can finish.** + """, "summary": "", "website": "", diff --git a/attachment_minio/models/ir_attachment.py b/attachment_minio/models/ir_attachment.py index 599c3d83..08122566 100644 --- a/attachment_minio/models/ir_attachment.py +++ b/attachment_minio/models/ir_attachment.py @@ -15,12 +15,13 @@ class MinioAttachment(models.Model): @api.model def _get_minio_client(self): + config = tools.config params = self.env['ir.config_parameter'].sudo() - host = params.get_param('ir_attachment.location.host') - region = params.get_param('ir_attachment.location.region', 'us-west-1') - access_key = params.get_param('ir_attachment.location.access_key') - secret_key = params.get_param('ir_attachment.location.secret_key') - secure = params.get_param('ir_attachment.location.secure') + host = params.get_param('ir_attachment.location.host') or config.get('attachment_minio_host') + region = params.get_param('ir_attachment.location.region') or config.get('attachment_minio_region', 'us-west-1') + access_key = params.get_param('ir_attachment.location.access_key') or config.get('attachment_minio_access_key') + secret_key = params.get_param('ir_attachment.location.secret_key') or config.get('attachment_minio_secret_key') + secure = params.get_param('ir_attachment.location.secure') or config.get('attachment_minio_secure') if not all((host, access_key, secret_key)): raise exceptions.UserError('Incorrect configuration of attachment_minio.') return Minio(host, @@ -31,8 +32,9 @@ class MinioAttachment(models.Model): @api.model def _get_minio_bucket(self, client, name=None): + config = tools.config params = self.env['ir.config_parameter'].sudo() - bucket = name or params.get_param('ir_attachment.location.bucket') + bucket = name or params.get_param('ir_attachment.location.bucket') or config.get('attachment_minio_bucket') if not bucket: raise exceptions.UserError('Incorrect configuration of attachment_minio -- Missing bucket.') if not client.bucket_exists(bucket):