DEV Community

Cover image for Create MinIO Bucket using Express.js
CodeFalconX
CodeFalconX

Posted on

Create MinIO Bucket using Express.js

1️⃣ Install Dependencies

npm init -y
npm install express minio dotenv
Enter fullscreen mode Exit fullscreen mode

2️⃣ Project Structure (Recommended)

minio-service/
├── src/
│   ├── app.js
│   ├── minio/
│   │   └── minioClient.js
│   ├── routes/
│   │   └── bucket.routes.js
│   └── services/
│       └── bucket.service.js
├── .env
└── package.json
Enter fullscreen mode Exit fullscreen mode

3️⃣ .env Configuration

PORT=3000

MINIO_ENDPOINT=localhost
MINIO_PORT=9000
MINIO_USE_SSL=false
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
Enter fullscreen mode Exit fullscreen mode

4️⃣ MinIO Client (src/minio/minioClient.js)

import { Client } from 'minio';
import dotenv from 'dotenv';

dotenv.config();

const minioClient = new Client({
  endPoint: process.env.MINIO_ENDPOINT,
  port: parseInt(process.env.MINIO_PORT),
  useSSL: process.env.MINIO_USE_SSL === 'true',
  accessKey: process.env.MINIO_ACCESS_KEY,
  secretKey: process.env.MINIO_SECRET_KEY,
});

export default minioClient;
Enter fullscreen mode Exit fullscreen mode

5️⃣ Bucket Service (src/services/bucket.service.js)

import minioClient from '../minio/minioClient.js';

export async function createBucket(bucketName) {
  const exists = await minioClient.bucketExists(bucketName);

  if (exists) {
    return { created: false, message: 'Bucket already exists' };
  }

  await minioClient.makeBucket(bucketName);
  return { created: true, message: 'Bucket created successfully' };
}
Enter fullscreen mode Exit fullscreen mode

6️⃣ Bucket API Route (src/routes/bucket.routes.js)

import express from 'express';
import { createBucket } from '../services/bucket.service.js';

const router = express.Router();

/**
 * POST /api/buckets
 * Body: { "bucketName": "my-new-bucket" }
 */
router.post('/', async (req, res) => {
  try {
    const { bucketName } = req.body;

    if (!bucketName) {
      return res.status(400).json({ message: 'bucketName is required' });
    }

    const result = await createBucket(bucketName);

    return res.status(200).json(result);
  } catch (err) {
    console.error(err);
    return res.status(500).json({
      message: 'Failed to create bucket',
      error: err.message,
    });
  }
});

export default router;
Enter fullscreen mode Exit fullscreen mode

7️⃣ Express App (src/app.js)

import express from 'express';
import bucketRoutes from './routes/bucket.routes.js';

const app = express();

app.use(express.json());

app.use('/api/buckets', bucketRoutes);

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`MinIO service running on port ${PORT}`);
});
Enter fullscreen mode Exit fullscreen mode

8️⃣ Run the Application

node src/app.js
Enter fullscreen mode Exit fullscreen mode

9️⃣ Test with CURL or Insomnia

Request

curl -X POST http://localhost:3000/api/buckets \
  -H "Content-Type: application/json" \
  -d '{
    "bucketName": "test-bucket-001"
  }'
Enter fullscreen mode Exit fullscreen mode

Success Response

{
  "created": true,
  "message": "Bucket created successfully"
}
Enter fullscreen mode Exit fullscreen mode

Already Exists

{
  "created": false,
  "message": "Bucket already exists"
}
Enter fullscreen mode Exit fullscreen mode

🔐 Permissions Reminder

The MinIO user must have:

"s3:CreateBucket",
"s3:ListAllMyBuckets"
Enter fullscreen mode Exit fullscreen mode

Otherwise you'll get AccessDenied.

Github: https://github.com/codefalconx/minio-service

Reference: https://www.min.io/

Top comments (0)