MinIO Installation on Ubuntu 24.04 with Nginx Proxy

Are you looking for a working guide on how to install MinIO on Ubuntu 24.04, and configure Nginx as a frontend proxy? In this blog we are going to setup MinIO object storage server on Ubuntu Linux machine behind Nginx. MinIO is a storage solution that gives you Amazon S3-compatible API and supports all S3 core features. It can be installed on a private cloud, public cloud, and even in edge kind of infrastructure setups. The product is released under dual license GNU 3.0 and MinIO Commercial License.

We are doing this installation of MinIO on Ubuntu Linux machine, but the same process is applicable to any other Debian Linux variant because minio package is distributed as a binary application. The MinIO server IP address in this guide is 192.168.20.11 and domain used is minio.cloudspinx.com.

Download MinIO binary

The showcased steps is for Intel and ARM systems. Download the latest binary release:

  • Intel / AMD 64-bit processors
wget https://dl.min.io/server/minio/release/linux-amd64/minio
  • ARM 64-bit processors
wget https://dl.min.io/server/minio/release/linux-arm64/minio

After the download make the file executable using chmod command:

chmod +x minio

Thereafter, copy the file to directory in your PATH:

sudo mv minio /usr/local/bin/

Confirm it works by checking the version of the software.

$ minio --version
minio version RELEASE.2025-03-12T18-04-18Z (commit-id=dbf31af6cb0d5ea33b277b6e461cfea98262778e)
Runtime: go1.24.1 linux/amd64
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Copyright: 2015-2025 MinIO, Inc.

Configure MinIO Server (Single node)

This is a single node storage server configuration of MinIO. Once the binary is downloaded, create data directories where MinIO will store its data. This should often be a dedicated disks drive such as raid device capable of outliving operating system failures. In our example we are using /data/minio for data and /etc/minio for configuration files.

sudo mkdir -p /data/minio /etc/minio

Create a system user account that will own the directories and run systemd service. Set the home for the user to the directory created above.

sudo useradd --system --shell /sbin/nologin --home-dir /data/minio minio

Set permissions of the directory created to minio user:

sudo chown -R minio:minio /data/minio /etc/minio

Create system unit file for MinIO service.

sudo nano /etc/systemd/system/minio.service

Configure the file like below.

[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
AssertFileNotEmpty=/etc/default/minio

[Service]
Type=notify

WorkingDirectory=/usr/local/

User=minio
Group=minio
ProtectProc=invisible

EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=1048576

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutSec=infinity

# Disable killing of MinIO by the kernel's OOM killer
OOMScoreAdjust=-1000

SendSIGKILL=no

[Install]
WantedBy=multi-user.target

We should also create /etc/default/minio configuration file with username and password

sudo nano /etc/default/minio

Set admin username, password, and data directory.

# MINIO_ROOT_USER and MINIO_ROOT_PASSWORD sets the root account for the MinIO server.
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=Str0ngAdmP@ssw0rD

# MINIO_VOLUMES sets the storage volume or path to use for the MinIO server.
MINIO_VOLUMES="/data/minio"

# Server Listen address - API and Console
MINIO_OPTS="-C /etc/minio --address :9000 --console-address :9001"

The :9000 and :9001 will expose the services on external/public IP address of the server. For local access within the same server, the API and console address can be set to 127.0.0.1:9000 and 127.0.0.1:9001 respectively – this is a good setting when using Nginx to redirect requests to this endpoints for better security. The /data/minio directory should be replaced with a path from where you want to store the data.

Reload systemd and start minio service.

sudo systemctl daemon-reload
sudo systemctl enable --now minio

Confirm service status

$ systemctl status minio
● minio.service - MinIO Storage Server
     Loaded: loaded (/etc/systemd/system/minio.service; enabled; preset: enabled)
     Active: active (running) since Thu 2025-03-13 09:09:10 EAT; 7s ago
       Docs: https://docs.min.io
   Main PID: 1549863 (minio)
      Tasks: 7 (limit: 9489)
     Memory: 215.4M (peak: 215.8M)
        CPU: 592ms
     CGroup: /system.slice/minio.service
             └─1549863 /usr/local/bin/minio server /data/minio --console-address 127.0.0.1:9001

Mar 13 09:09:10 minio.cloudspinx.com systemd[1]: Started minio.service - MinIO Storage Server.
Mar 13 09:09:11 minio.cloudspinx.com minio[1549863]: INFO: Formatting 1st pool, 1 set(s), 1 drives per set.
Mar 13 09:09:11 minio.cloudspinx.com minio[1549863]: INFO: WARNING: Host local has more than 0 drives of set. A host failure will result in data becoming unavailable.
Mar 13 09:09:11 minio.cloudspinx.com minio[1549863]: MinIO Object Storage Server
Mar 13 09:09:11 minio.cloudspinx.com minio[1549863]: Copyright: 2015-2025 MinIO, Inc.
Mar 13 09:09:11 minio.cloudspinx.com minio[1549863]: License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Mar 13 09:09:11 minio.cloudspinx.com minio[1549863]: Version: RELEASE.2025-03-12T18-04-18Z (go1.24.1 linux/amd64)
Mar 13 09:09:11 minio.cloudspinx.com minio[1549863]: API: http://192.168.20.11:9000  http://127.0.0.1:9000
Mar 13 09:09:11 minio.cloudspinx.com minio[1549863]: WebUI: http://192.168.20.11:9001 http://127.0.0.1:9001
Mar 13 09:09:11 minio.cloudspinx.com minio[1549863]: Docs: https://docs.min.io

This setup runs MinIO as a service on port 9000 (for the API), and port 9001 (for the Web Console).

Access MinIO Web console

Open a web browser and open URL http://ServerIP:9000 and you should be redirected to the login page. Use the initial credentials set in /etc/default/minio to login.

On successful login the following page is presented, from where you can perform most administrative operations against MinIO server.

Configuring Nginx Proxy for MinIO (Optional)

Install nginx web server if not already done.

sudo apt install nginx

Configure nginx configuration file for MinIO

sudo nano /etc/nginx/sites-available/minio.conf

Add or modify the following content:

upstream minio_s3 {
   least_conn;
   server 192.168.20.11:9000;
}

upstream minio_console {
   least_conn;
   server 192.168.20.11:9001;
}

server {
   listen       80;
   server_name minio.cloudspinx.com;

   # Allow special characters in headers
   ignore_invalid_headers off;
   # Allow any size file to be uploaded.
   # Set to a value such as 1000m; to restrict file size to a specific value
   client_max_body_size 0;
   # Disable buffering
   proxy_buffering off;
   proxy_request_buffering off;

   location / {
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;

      proxy_connect_timeout 300;
      # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      chunked_transfer_encoding off;

      proxy_pass http://minio_s3; # This uses the upstream directive definition to load balance
   }

   location /minio/ui/ {
      rewrite ^/minio/ui/(.*) /$1 break;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-NginX-Proxy true;

      # This is necessary to pass the correct IP to be hashed
      real_ip_header X-Real-IP;

      proxy_connect_timeout 300;

      # To support websockets in MinIO versions released after January 2023
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      # Some environments may encounter CORS errors (Kubernetes + Nginx Ingress)
      # Uncomment the following line to set the Origin request to an empty string
      # proxy_set_header Origin '';

      chunked_transfer_encoding off;

      proxy_pass http://minio_console; # This uses the upstream directive definition to load balance
   }
}

minio.cloudspinx.com should be replaced with your domain or sub-domain name, and 192.168.20.11 with your actual IP address.

Enable minio nginx website

sudo ln -s /etc/nginx/sites-available/minio.conf /etc/nginx/sites-enabled/

Validate Nginx configurations:

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Restart nginx service

sudo systemctl restart nginx

Confirmation of successful restart can be done using systemctl commands:

systemctl status nginx

Access MinIO Web Console

The domain used in nginx for MinIO should be configured in your DNS server with an A record pointing to the server hosting the service. For local use cases, it is sufficient to use your /etc/hosts file, just edit and map server IP address to the domain name used.

192.168.20.11 minio.example.com

Load MinIO web console on http://yourdomain and you will be redirected accordingly. In our articles to follow about MinIO, we will cover configurations of Let’s Encrypt SSL.

Your IT Journey Starts Here!

Ready to level up your IT skills? Our new eLearning platform is coming soon to help you master the latest technologies.

Be the first to know when we launch! Join our waitlist now.

Join our Linux and open source community. Subscribe to our newsletter for tips, tricks, and collaboration opportunities!

Recent Post

Leave a Comment

Your email address will not be published. Required fields are marked *

Related Post

GNS3 community is the world’s largest community of network professionals who love building better networks, sharing ideas and making connections […]

In this article we describe how you can remove a Storage Repository (SR) on XenServer / XCP-ng host when the […]

In this guide we will perform an installation of XCP-ng VM or guest tools on Ubuntu | Debian Linux system. […]

Let's Connect

Unleash the full potential of your business with CloudSpinx. Our expert solutions specialists are standing by to answer your questions and tailor a plan that perfectly aligns with your unique needs.
You will get a response from our solutions specialist within 12 hours
We understand emergencies can be stressful. For immediate assistance, chat with us now

Contact CloudSpinx today!

Download CloudSpinx Profile

Discover the full spectrum of our expertise and services by downloading our detailed Company Profile. Simply enter your first name, last name, and email address.