Skip to main content

MinIO

This document will guide you through installing the MinIO file service plugin on your Medusa server.

Overview

To manage images in Medusa, you need a file service plugin responsible for hosting. Without a file service plugin, you will face issues while working with Medusa, such as when uploading images for products.

Medusa provides three different options to handle your file storage. This document will focus on setting up MinIO on your local machine and connecting Medusa to it.

Prerequisites

A Medusa server is required to be set up before following along with this document. You can follow the quickstart guide to get started in minutes.

Set up MinIO

You can follow MinIO’s guide to install it on your machine based on your operating system.

After installing it, make sure MinIO is always running when your Medusa server is running. It’s recommended that you set up an alias to quickly start the MinIO server as instructed at the end of the installation guides in MinIO.

danger

In MinIO’s documentation, port 9000 is used for the address of the MinIO server. However, this collides with the port for the Medusa server. You must change the port for MinIO to another one (for example, port 9001).

Create a MinIO bucket

After installing MinIO and logging into the Console, click on “Create Bucket” to create a new bucket that will store the files of your Medusa server.

Create Bucket

Then, in the form, enter a name for the bucket and click on Create Bucket. By MinIO’s requirement, the name can only consist of lower case characters, numbers, dots (.), and hyphens (-).

Bucket Info

After creating the bucket, click on the cog icon at the top right to configure the bucket.

Configure Bucket

Then, click on the edit icon next to Access Policy. This will open a pop-up.

Access Policy

In the pop-up, change the selected value to “public” and click Set.

danger

Changing the Access Policy to public will allow anyone to access your bucket. Avoid storing sensitive data in the bucket.

Generate Access Keys

From the sidebar of your MinIO console, click on Identity then Service Accounts.

Service Accounts Sidebar

Then, click on Create Service Account.

Create Service Account

This will generate a random Access Key and Secret Key for you.

Generated Keys

Click on Create. A pop-up will then show the value for your Access Key and Secret Key. Copy them to use in the next section.

caution

You will not be able to access the Secret Key after closing the pop-up. So, make sure to store it somewhere to use later when configuring the plugin.

Plugin Installation

In the directory of your Medusa server, run the following command to install the MinIO plugin:

npm install medusa-file-minio

Then, add the following environment variables in .env:

MINIO_ENDPOINT=<ENDPOINT>
MINIO_BUCKET=<BUCKET>
MINIO_ACCESS_KEY=<ACCESS_KEY>
MINIO_SECRET_KEY=<SECRET_KEY>

Where <ENDPOINT> is the URL of your MinIO server, <BUCKET> is the name of the bucket you created earlier, and <ACCESS_KEY> and <SECRET_KEY> are the keys you generated in the previous section.

Finally, configure your medusa-config.js to include the plugin with the required options:

{
resolve: `medusa-file-minio`,
options: {
endpoint: process.env.MINIO_ENDPOINT,
bucket: process.env.MINIO_BUCKET,
access_key_id: process.env.MINIO_ACCESS_KEY,
secret_access_key: process.env.MINIO_SECRET_KEY,
},
},
caution

If you have multiple storage plugins configured, the last plugin declared in the medusa-config.js file will be used.

Test it Out

Run your Medusa server alongside the Medusa Admin to try out your new file service. Upon editing or creating products, you can now upload thumbnails and images, that are stored in a MinIO server.

Image Uploaded on Admin

Additional Configuration for Exports

Medusa v1.3.3 introduced the Export API. For example, you can now export your products from the Medusa Admin on the Products page.

Export button in Products page in Medusa Admin

note

Exports require using Redis to handle the event queue, and using PostgreSQL for the database. If you don’t use Redis or PostgreSQL, you can follow this documentation to install and then configure them on your Medusa server.

When using MinIO, you must create a private bucket that will store these product exports. To do that, follow along the steps mentioned earlier to create a bucket, but keep Access Policy set to private.

Then, add the following environment variable on your Medusa server:

MINIO_PRIVATE_BUCKET=exports

Finally, add a new option to the plugin’s options in medusa-config.js:

{
resolve: `medusa-file-minio`,
options: {
//...
private_bucket: process.env.MINIO_PRIVATE_BUCKET
},
},

If you start your Medusa server now and click on Export Products on the Medusa admin, the export will run in the background. When ready, it should be available for download.

Export is available for download on the Medusa Admin

tip

If you face any errors, make sure you have the latest version of the plugin installed.

Use Different Secret and Access Keys

If you only add the private_bucket option, the same secret and access keys that you used for the public bucket will be used to access the private bucket.

If you want to use different keys, set the following environment variables:

MINIO_PRIVATE_ACCESS_KEY=<YOUR_PRIVATE_ACCESS_KEY>
MINIO_PRIVATE_SECRET_KEY=<YOUR_PRIVATE_SECRET_KEY>

Where <YOUR_PRIVATE_ACCESS_KEY> and <YOUR_PRIVATE_SECRET_KEY> are the access key and secret access key that have access to the private MinIO bucket.

Then, add two new options to the plugin’s options in medusa-config.js:

{
resolve: `medusa-file-minio`,
options: {
//...
private_access_key_id: process.env.MINIO_PRIVATE_ACCESS_KEY,
private_secret_access_key: process.env.MINIO_PRIVATE_SECRET_KEY
},
},

Next.js Storefront Configuration

If you’re using a Next.js storefront, you need to add an additional configuration that adds the MinIO domain name into the configured images domain names. This is because all URLs of product images will be from the MinIO server.

If this configuration is not added, you’ll receive the error "next/image Un-configured Host”.

In next.config.js add the following option in the exported object:

module.exports = {
//other options
images: {
domains: [
"127.0.0.1",
//any other domains...
],
},
}

Where 127.0.0.1 is the domain of your local MinIO server.

What’s Next 🚀