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 |