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.