 Autor: [Adam Nadolny](/autorzy/adam-nadolny) Ekspert DevOps i infrastruktury · Zweryfikowano Kwiecień 2026

1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  MinIO — S3 object storage

# MinIO — własny S3-compatible object storage na VPS

Opublikowano: 9 kwietnia 2026 · Kategoria: VPS / Storage

MinIO to open source object storage zgodny z protokołem S3 — wszystko co działa z AWS S3 (SDK, awscli, boto3, s3cmd, Terraform providers) działa z MinIO bez zmian w kodzie. Stawia się w minutach, działa w trybie single-node (dev, małe produkcyjne) albo distributed z erasure coding (HA produkcyjne). Idealny dla własnych backupów, zbiorów mediów, logów aplikacji, danych ML lub jako storage dla kubernetes (RWX volumes przez CSI driver).

## Instalacja single-node

\# Pobierz najnowszy binary
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/

# Uzytkownik i katalog danych
sudo useradd -r minio-user -s /sbin/nologin
sudo mkdir -p /srv/minio/data
sudo chown -R minio-user:minio-user /srv/minio

# Plik konfiguracyjny
sudo tee /etc/default/minio >/dev/null <<'EOF'
MINIO\_VOLUMES="/srv/minio/data"
MINIO\_OPTS="--address :9000 --console-address :9001"
MINIO\_ROOT\_USER="admin"
MINIO\_ROOT\_PASSWORD="bardzo-mocne-haslo-minimum-8-znakow"
EOF
sudo chmod 600 /etc/default/minio

## systemd unit

\# /etc/systemd/system/minio.service
\[Unit\]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target

\[Service\]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO\_OPTS $MINIO\_VOLUMES
Restart=always
LimitNOFILE=65536
TasksMax=infinity
TimeoutStopSec=infinity

\[Install\]
WantedBy=multi-user.target

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

# Panel web (Console): http://twoj-vps:9001
# S3 API: http://twoj-vps:9000

## Reverse proxy Nginx + SSL

Wystawienie MinIO bezpośrednio na internet to zły pomysł — zawsze stawiaj Nginx przed nim z certyfikatem Lets Encrypt. Użyj osobnych subdomen dla API i Console:

\# /etc/nginx/sites-available/minio
server {
    listen 443 ssl http2;
    server\_name s3.example.com;

    ssl\_certificate /etc/letsencrypt/live/s3.example.com/fullchain.pem;
    ssl\_certificate\_key /etc/letsencrypt/live/s3.example.com/privkey.pem;

    client\_max\_body\_size 0;  # MinIO obsluguje duze pliki
    chunked\_transfer\_encoding off;

    location / {
        proxy\_pass http://127.0.0.1:9000;
        proxy\_http\_version 1.1;
        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 300s;
        proxy\_send\_timeout 300s;
        proxy\_read\_timeout 300s;
    }
}

server {
    listen 443 ssl http2;
    server\_name console.s3.example.com;
    ssl\_certificate /etc/letsencrypt/live/s3.example.com/fullchain.pem;
    ssl\_certificate\_key /etc/letsencrypt/live/s3.example.com/privkey.pem;

    location / {
        proxy\_pass http://127.0.0.1:9001;
        proxy\_http\_version 1.1;
        proxy\_set\_header Host $http\_host;
        proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for;
        proxy\_set\_header X-Forwarded-Proto $scheme;
    }
}

## Klient mc — administracja z terminala

\# Instalacja mc (MinIO Client)
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

# Dodaj alias do swojego serwera
mc alias set myminio https://s3.example.com admin bardzo-mocne-haslo-minimum-8-znakow

# Utworz bucket
mc mb myminio/backups
mc mb myminio/media

# Ustaw policy public read (tylko dla publicznych plikow)
mc anonymous set download myminio/media

# Lista bucketow i zawartosci
mc ls myminio/
mc ls myminio/backups/ --recursive

# Kopiowanie plikow
mc cp /var/backups/db.sql.gz myminio/backups/
mc cp --recursive /var/www/uploads myminio/media/

# Mirror (sync jak rsync)
mc mirror --overwrite --remove /var/www/uploads myminio/media/uploads

## Klucze dostępu (access keys) zamiast root

Root user to super-admin — nie używaj go w aplikacjach. Utwórz service account z ograniczoną policy:

\# Stworz uzytkownika
mc admin user add myminio app-backup bardzo-mocne-haslo-app

# Policy - read/write tylko do bucketu backups
cat > /tmp/backup-policy.json <<'EOF'
{
  "Version": "2012-10-17",
  "Statement": \[
    {
      "Effect": "Allow",
      "Action": \["s3:PutObject", "s3:GetObject", "s3:ListBucket", "s3:DeleteObject"\],
      "Resource": \["arn:aws:s3:::backups/\*", "arn:aws:s3:::backups"\]
    }
  \]
}
EOF

mc admin policy create myminio backup-rw /tmp/backup-policy.json
mc admin policy attach myminio backup-rw --user app-backup

## Integracja z awscli i boto3

\# awscli - ustaw klucze uzytkownika app-backup
aws configure set aws\_access\_key\_id app-backup
aws configure set aws\_secret\_access\_key bardzo-mocne-haslo-app
aws configure set region us-east-1

# Listowanie bucketow
aws --endpoint-url https://s3.example.com s3 ls

# Upload pliku
aws --endpoint-url https://s3.example.com s3 cp backup.tar.gz s3://backups/

# Multipart upload dla duzych plikow (automatyczny)
aws --endpoint-url https://s3.example.com s3 cp big.mkv s3://media/

\# boto3 w Pythonie
import boto3

s3 = boto3.client(
    's3',
    endpoint\_url='https://s3.example.com',
    aws\_access\_key\_id='app-backup',
    aws\_secret\_access\_key='bardzo-mocne-haslo-app',
    region\_name='us-east-1',
)

# Upload
s3.upload\_file('/tmp/db.sql.gz', 'backups', 'db-2026-04-09.sql.gz')

# Lista
for obj in s3.list\_objects\_v2(Bucket='backups').get('Contents', \[\]):
    print(obj\['Key'\], obj\['Size'\])

# Presigned URL (1 godzina)
url = s3.generate\_presigned\_url(
    'get\_object',
    Params={'Bucket': 'media', 'Key': 'video.mp4'},
    ExpiresIn=3600,
)
print(url)

## Distributed mode — erasure coding

Dla produkcji uruchom MinIO na minimum 4 węzłach z erasure coding. Każdy obiekt jest dzielony na data shards i parity shards — możesz stracić połowę dysków/węzłów bez utraty danych.

\# Uruchom na kazdym z 4 wezlow
minio server http://minio{1...4}.example.com/data/{1...4}

# 16 dyskow (4 wezly x 4 dyski), domyslna parity EC:8
# Mozesz stracic 8 dyskow (i nawet 2 wezly) bez utraty danych

## Typy policy i zastosowanie

Policy

Uprawnienia

Zastosowanie

readonly

GetObject, ListBucket

Klient tylko pobiera pliki (CDN origin)

readwrite

Put/Get/Delete + List

Aplikacja zarządza własnym bucketem

writeonly

PutObject

Write-only backup target (append-only logs)

diagnostics

Admin read-only

Monitoring, metryki Prometheus

consoleAdmin

Pełny admin

Panel web — root user, nie dla aplikacji

## Najczęstsze pytania

Dlaczego miałbym stawiać własne MinIO zamiast używać AWS S3? +

AWS S3 jest wygodne dla małych i średnich zbiorów, ale dla dużych ilości danych koszty rosną szybko — S3 Standard kosztuje około 0.023 USD/GB/miesiąc plus opłaty za egress (9 centów/GB). Własny MinIO na VPS z dużym dyskiem (np. 1 TB za 20 PLN/mc) daje stały koszt bez opłat za transfer, pełną kontrolę nad danymi i zgodność z RODO (dane w UE). MinIO jest S3-compatible — te same SDK, awscli, boto3 działają bez zmian w kodzie. Wybór: mały zbiór lub nieprzewidywalny ruch to S3, duży stały zbiór to MinIO na VPS.

Czy MinIO nadaje się do produkcji czy tylko do devu? +

MinIO jest używane w produkcji przez duże firmy i instytucje — single-node distribution nadaje się do małych workloadów (dev, backup, zbiory poniżej 10 TB), a distributed mode (minimum 4 węzły) daje erasure coding z odpornością na awarię wielu dysków/węzłów. MinIO obsługuje multi-site replication, bucket versioning, server-side encryption, IAM policies, retention locks (WORM), które są potrzebne w produkcji. Dla poważnych workloadów distributed mode jest wymagany — pojedynczy węzeł to SPOF.

Jak MinIO zabezpiecza dane — erasure coding vs RAID? +

Distributed MinIO używa erasure coding (Reed-Solomon) — dane są dzielone na data shards i parity shards rozłożone na wielu dyskach. Przy setupie 4+4 (4 data, 4 parity na 8 dyskach) możesz stracić do 4 dowolnych dysków i nadal odczytać dane. RAID operuje na poziomie bloków dysku i chroni pojedynczy węzeł, MinIO EC operuje na poziomie obiektów i chroni całe węzły. Dla produkcji zalecam distributed MinIO z parity co najmniej N/2 — jest bezpieczniejszy niż RAID6 bo przetrwa utratę całych maszyn, nie tylko dysków.

Czy klient awscli wymaga modyfikacji żeby pracować z MinIO? +

Nie — wystarczy przekazać --endpoint-url do swojego MinIO. Cały protokół S3 (sigv4, operacje PUT/GET/LIST/DELETE, multipart upload, presigned URLs) jest w pełni zgodny. boto3 ustawia endpoint\_url w konstruktorze Client. W praktyce migracja kodu z AWS S3 do MinIO to jedna linia — zmiana endpointa. Wyjątkiem są specjalne usługi AWS jak Glacier, Intelligent-Tiering — te nie mają odpowiednika w MinIO.

## Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.

Contabo

Storage VPS z dużym dyskiem — idealny MinIO target dla 1-10 TB danych

Storage VPS

[Aktywuj rabat →](/out/contabo)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

Mikrus

Tani VPS do testowania MinIO przed migracją na produkcję

Dev/Test

[Aktywuj rabat →](/out/mikrus)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus)

LH.pl

Hosting z kopią zapasową — alternatywa bez setupu MinIO

Managed

[Aktywuj rabat →](/out/lh-pl)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/lh-pl)

## Powiązane strony

-   [BorgBackup — deduplikacja backup](/baza-wiedzy/borgbackup-deduplikacja-backup)
-   [rsync — kopia zapasowa VPS](/baza-wiedzy/rsync-kopia-zapasowa-vps)
-   [Docker na VPS — instalacja](/baza-wiedzy/docker-na-vps)
-   [Wszystkie artykuły](/baza-wiedzy/)