Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

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.