SSD Nodes Learn 8GB RAM — $66/rok
Przewodniki Matt ConnorAutor: Matt Connor · Zaktualizowano 2026-08-01

MinIO na VPS: własny magazyn obiektowy S3

Skonfiguruj MinIO na Ubuntu 24.04: zweryfikowany binarny plik, systemd, mc, presigned URLs i cel kopii zapasowych restic na jednym VPS.

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, July 30, 2026.

Co zapewnia samodzielnie hostowany magazyn obiektowy z MinIO

MinIO to samodzielnie hostowany magazyn obiektowy obsługujący API Amazon S3. Wystarczy wskazać własny serwer w restic lub dowolnym zestawie SDK S3 i zmienić ustawienie punktu końcowego. Klient nie rozpozna różnicy. W tym przewodniku skonfigurowano pojedynczy węzeł w Ubuntu 24.04: zweryfikowany plik binarny, dedykowanego użytkownika systemowego, jednostkę systemd, która nie przechowuje danych uwierzytelniających root w pliku jednostki, oraz bucket, do którego restic wykonuje kopie zapasowe.

S3 (simple storage service) to API HTTP, a nie system plików. Obiekt jest umieszczany za pomocą PUT w bucket pod określonym kluczem, a następnie pobierany za pomocą GET. Nie ma operacji częściowego zapisu ani zmiany nazwy. Narzędzia do tworzenia kopii zapasowych dobrze współpracują z tym modelem, ponieważ obiekt albo został zapisany w całości, albo nie został zapisany.

Jeden węzeł przechowuje jedną kopię danych. Jest to koszt tego rozwiązania. Zyskuje się kontrolowany punkt końcowy S3 za cenę VPS, ale przejmuje się również wszystkie zadania, które wcześniej wykonywał dostawca chmury: od wymiany uszkodzonego dysku po aktualizowanie oprogramowania serwera. W sekcji pod koniec tego przewodnika jasno określono, kiedy taki kompromis jest uzasadniony.

Stan edycji społecznościowej MinIO w lipcu 2026

Należy przeczytać tę część przed rozpoczęciem konfiguracji, ponieważ niedawno zaszły w niej zmiany. W maju 2025 firma MinIO usunęła funkcje administracyjne z konsoli internetowej w edycji społecznościowej. W przeglądarce dostępna jest obecnie przeglądarka obiektów, dlatego zarządzanie bucketami i kluczami dostępu odbywa się za pomocą klienta wiersza poleceń mc.

Później, w 2025 roku, MinIO przestało publikować wstępnie skompilowane pliki binarne edycji społecznościowej. W pliku README projektu podano obecnie, że edycja społecznościowa jest dystrybuowana wyłącznie w postaci kodu źródłowego. Starsze adresy URL pobierania nadal działają: w lipcu 2026 udostępniają wersję serwera RELEASE.2025-09-07T16-13-09Z oraz wersję klienta RELEASE.2025-08-13T08-35-41Z, a nowsza wersja społecznościowa nie została opublikowana. Poniższy plik binarny jest rzeczywisty i działa, ale jego wersja jest zamrożona. Nie zawiera poprawek bezpieczeństwa opublikowanych po wrześniu 2025.

Ten fakt wpływa na całą dalszą konfigurację. Z tego powodu MinIO nasłuchuje tutaj na 127.0.0.1 i uzyskuje dostęp do internetu wyłącznie przez kontrolowany serwer proxy. Jeśli wymagane jest śledzenie poprawek, należy skompilować MinIO z kodu źródłowego. Plik README dostawcy zawiera pojedyncze polecenie, go install github.com/minio/minio@latest, które wymaga zestawu narzędzi Go i zapisuje plik binarny w ~/go/bin/minio. Należy zainstalować ten plik binarny w /usr/local/bin/minio; wszystkie pozostałe kroki pozostają bez zmian.

Zainstaluj plik binarny MinIO i zweryfikuj pobranie

Pobierz przypisaną wersję i opublikowaną sumę kontrolną. Flaga -f powoduje, że curl zgłasza błąd HTTP zamiast zapisywać stronę błędu pod żądaną nazwą. W przeciwnym razie można zainstalować stronę 404 i zastanawiać się, dlaczego nie można jej uruchomić.

cd /tmp
REL=RELEASE.2025-09-07T16-13-09Z
curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/archive/minio.$REL" -o minio
curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/archive/minio.$REL.sha256sum" -o minio.sha256sum

Porównaj obie wartości skrótu. Porównuj wyłącznie wartości skrótu.

published=$(awk '{print $1}' minio.sha256sum)
downloaded=$(sha256sum minio | awk '{print $1}')
[ "$published" = "$downloaded" ] && echo "checksum ok"

Nie używaj tutaj sha256sum -c minio.sha256sum. Etykieta zapisana po wartości skrótu w tym pliku to minio.RELEASE.2025-09-07T16-13-09Z, a pobrany plik zapisano jako minio, dlatego -c szuka pliku, który nie istnieje. Zgłasza No such file or directory, a następnie WARNING: 1 listed file could not be read. Może to wyglądać jak uszkodzone pobranie, ale nim nie jest. Etykieta jest tylko nazwą. Wartość skrótu jest elementem zapewniającym integralność.

Należy jasno określić, co potwierdza ta kontrola. Plik binarny i wartość skrótu pochodzą od tego samego dostawcy i zostały pobrane przez to samo połączenie, dlatego zgodność potwierdza kompletność pobrania oraz brak uszkodzenia lub modyfikacji podczas transmisji. Nie potwierdza natomiast wiarygodności dostawcy. Jest to odrębny problem, którego nie rozwiązuje żadne polecenie sha256sum.

sudo install -o root -g root -m 755 minio /usr/local/bin/minio
minio --version

minio --version wyświetla minio version RELEASE.2025-09-07T16-13-09Z, a następnie kilka wierszy dotyczących kompilacji. W tym przypadku Permission denied oznacza nieprawidłowy tryb, a command not found oznacza, że /usr/local/bin nie znajduje się w obiekcie PATH.

Tworzenie użytkownika systemowego i katalogu danych

MinIO przyjmuje pliki przesyłane przez sieć, dlatego nie powinien działać jako root. Należy utworzyć dla niego konto bez katalogu domowego i bez powłoki logowania.

sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user -s /usr/sbin/nologin minio-user
sudo mkdir -p /var/lib/minio/data
sudo chown -R minio-user:minio-user /var/lib/minio
sudo chmod 750 /var/lib/minio

-r tworzy konto systemowe z UID poniżej 1000, dzięki czemu konto nie znajduje się w zakresie używanym przez użytkowników. -M pomija tworzenie katalogu domowego, ponieważ konto, na które nigdy się nie loguje, nie wymaga takiego katalogu. Wynik należy sprawdzić za pomocą id minio-user oraz stat -c '%U %a' /var/lib/minio, które powinno wypisać minio-user 750.

Katalog danych musi być zapisywalny przez tego użytkownika, a nie tylko dostępny do odczytu. Przy pierwszym uruchomieniu MinIO tworzy w woluminie katalog .minio.sys, w którym przechowuje własną konfigurację. Dlatego katalog należący do root powoduje zakończenie działania MinIO podczas uruchamiania komunikatem kończącym się wartością permission denied. Ta sama zasada dotyczy każdej usługi uruchamianej w ten sposób. Szczegółowo opisano ją w użytkownikach usług z minimalnymi uprawnieniami na VPS.

Umieść dane uwierzytelniające root w pliku środowiskowym

Dane uwierzytelniające root zapewniają dostęp do każdego zasobnika, dlatego nie powinny znajdować się w pliku jednostki, który jest czytelny dla wszystkich użytkowników. Najpierw utwórz plik z właściwymi uprawnieniami, a dopiero potem zapisz do niego dane. Dzięki temu hasło ani przez chwilę nie będzie znajdować się w pliku czytelnym dla innych użytkowników.

sudo install -o root -g root -m 600 /dev/null /etc/default/minio
printf 'MINIO_ROOT_USER=minio-root\nMINIO_ROOT_PASSWORD=%s\nMINIO_VOLUMES="/var/lib/minio/data"\nMINIO_OPTS="--address 127.0.0.1:9000 --console-address 127.0.0.1:9001"\n' "$(openssl rand -base64 24)" | sudo tee /etc/default/minio > /dev/null
sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/minio

tee skraca istniejący plik zamiast tworzyć go ponownie, dlatego uprawnienia pozostają ustawione na 600, a właścicielem nadal jest root. Jest to działanie zamierzone. systemd odczytuje EnvironmentFile jako root, zanim obniży uprawnienia do User=. Konto usługi nie musi więc odczytywać własnych danych uwierzytelniających. Po uruchomieniu usługi należy potwierdzić ten stan za pomocą sudo -u minio-user cat /etc/default/minio. To polecenie musi wyświetlić Permission denied.

Przed uruchomieniem usługi należy znać dwa zachowania MinIO. Jeśli w środowisku nie ma MINIO_ROOT_USER ani MINIO_ROOT_PASSWORD, MinIO nie odmawia uruchomienia. Uruchamia się ze standardowymi, opisanymi w dokumentacji danymi uwierzytelniającymi minioadmin:minioadmin. Jest to pierwsza para sprawdzana przez skanery, a usługa podczas tego działania wygląda na całkowicie sprawną. Hasło krótsze niż 8 znaków jest natomiast odrzucane. MinIO kończy działanie podczas uruchamiania i wyświetla błąd informujący, że dane uwierzytelniające są nieprawidłowe, ponieważ klucz dostępu musi mieć co najmniej 3 znaki, a klucz tajny co najmniej 8 znaków.

MINIO_VOLUMES to ścieżka danych, a MINIO_OPTS zawiera flagi. Powiązanie z 127.0.0.1 oznacza, że nic spoza tego VPS nie może jeszcze uzyskać dostępu do API S3. Jest to właściwe ustawienie domyślne. Dostęp należy otworzyć celowo później, za pośrednictwem proxy z certyfikatem.

Tworzenie jednostki systemd

Utworzyć /etc/systemd/system/minio.service:

[Unit]
Description=MinIO object storage
Documentation=https://github.com/minio/minio
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_VOLUMES $MINIO_OPTS
Restart=always
RestartSec=5
LimitNOFILE=65536
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Na początku EnvironmentFile nie ma -. Jest to celowe, a nie błąd. Z myślnikiem systemd ignoruje brakujący plik i mimo to uruchamia MinIO. Usunięty plik lub błędna ścieżka powodują więc bez ostrzeżenia uruchomienie serwera z użyciem minioadmin:minioadmin. Bez myślnika brakujący plik powoduje niepowodzenie jednostki, zanim MinIO zostanie uruchomione, a journalctl -u minio wyświetla Failed to load environment files: No such file or directory. Jednostkę, która odmawia uruchomienia, łatwiej zauważyć niż serwer po cichu akceptujący hasło domyślne.

$MINIO_VOLUMES i $MINIO_OPTS pozostają celowo nieujęte w cudzysłowy, ponieważ systemd dzieli nieujęte w cudzysłowy zmienne według białych znaków na osobne argumenty. W ten sposób cztery słowa w MINIO_OPTS stają się czterema argumentami dla minio server. LimitNOFILE=65536 zwiększa limit deskryptorów plików, ponieważ każde otwarte połączenie i każdy otwarty plik danych zajmuje jeden deskryptor, a domyślna wartość 1024 wyczerpuje się pod obciążeniem.

sudo systemctl daemon-reload
sudo systemctl enable --now minio
systemctl is-active minio
curl -fsS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9000/minio/health/live

is-active powinno wyświetlić active, a punkt końcowy kondycji powinien zwrócić 200. journalctl -u minio -n 20 --no-pager wyświetla adres API, na którym serwer nasłuchuje. Jeśli jednostka jest ciągle uruchamiana ponownie, systemd rezygnuje i zapisuje w dzienniku Start request repeated too quickly. Oznacza to, że MinIO kończy działanie przy każdej próbie. Przyczyna jest wyświetlana w wierszach poprzedzających ten komunikat, dlatego należy czytać w górę.

Aby zapewnić większą izolację, dodać ProtectSystem=full i ProtectHome=true do sekcji [Service]. Oba ustawienia wymagają przestrzeni nazw montowania udostępnianych przez jądro hosta. W przypadku wirtualizacji kontenerowej współdzielącej jądro hosta, takiej jak OpenVZ lub LXC, mogą one zakończyć się niepowodzeniem, a jednostka zgłosi wtedy status=226/NAMESPACE. Usunięcie tych dwóch wierszy pozwala ją uruchomić. Sama jednostka jest standardową jednostką, a usługi i czasomierze systemd na VPS obejmują pozostałe dyrektywy.

Install mc and prove a round trip

Klient MinIO to mc. Nie należy instalować go za pomocą apt install mc. Ten pakiet zawiera Midnight Commander, menedżer plików niezwiązany z MinIO.

cd /tmp
curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o mc
curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc.sha256sum -o mc.sha256sum
[ "$(awk '{print $1}' mc.sha256sum)" = "$(sha256sum mc | awk '{print $1}')" ] && echo "checksum ok"
sudo install -o root -g root -m 755 mc /usr/local/bin/mc

Należy zarejestrować serwer jako alias, a następnie przenieść za jego pośrednictwem obiekt.

MINIO_PASS=$(sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/minio)
mc alias set local http://127.0.0.1:9000 minio-root "$MINIO_PASS"
mc mb local/backups
echo "hello object storage" > /tmp/hello.txt
mc cp /tmp/hello.txt local/backups/hello.txt
mc ls local/backups
mc cat local/backups/hello.txt

Polecenie mc ls powinno wyświetlić hello.txt wraz z jego rozmiarem, a polecenie mc cat powinno wypisać hello object storage. Ta pełna ścieżka stanowi właściwe potwierdzenie działania serwera, ponieważ powoduje wysłanie tych samych podpisanych żądań S3, które wysyła każdy inny klient. Polecenie mc admin info local wyświetla stan serwera i może posłużyć do dodatkowej weryfikacji.

Należy teraz wykonać jeszcze jedną kontrolę, gdy serwer jest nadal pusty.

mc alias set defaultcheck http://127.0.0.1:9000 minioadmin minioadmin

To polecenie musi zakończyć się błędem. Jeśli zakończy się powodzeniem, plik środowiskowy nie został przekazany do procesu, a serwer działa z domyślnymi danymi uwierzytelniającymi. Należy to naprawić, zanim jakikolwiek inny proces uzyska dostęp do maszyny.

mc przechowuje aliasy w ~/.mc/config.json w postaci zwykłego tekstu, dlatego dane uwierzytelniające znajdują się w katalogu domowym użytkownika, który wykonał polecenie. Uruchomienie mc za pomocą sudo umieszcza dane uwierzytelniające root w /root/.mc/config.json. Alias root należy zachować na koncie jednego administratora, a każdej aplikacji przydzielić własny klucz.

Udostępnianie jednego obiektu za pomocą podpisanego adresu URL

Podpisany adres URL to zwykły odsyłacz HTTPS z dołączonym podpisem i terminem wygaśnięcia. Każdy, kto ma ten odsyłacz, może pobrać ten jeden obiekt bez konta i bez klienta.

mc share download --expire 12h local/backups/hello.txt

Wynik zawiera X-Amz-Signature i X-Amz-Expires w ciągu zapytania. Dwie kwestie mogą być zaskakujące. Odsyłacz jest tworzony na podstawie punktu końcowego aliasu użytego w poleceniu, dlatego alias wskazujący na 127.0.0.1 tworzy odsyłacz, który można otworzyć tylko na tym komputerze. Należy utworzyć drugi alias dla publicznej nazwy hosta i używać go w odsyłaczach przeznaczonych do udostępniania. Nie ma też przycisku unieważniania. Podpis pozostaje ważny do upływu terminu wygaśnięcia, dlatego jedynym dostępnym mechanizmem kontroli jest krótki termin wygaśnięcia. Siedem dni to maksymalny okres dozwolony przez format podpisu S3.

Nadaj restic własny klucz i bucket

Poświadczenia root pozwalają odczytywać i usuwać każdy bucket, dlatego zadanie tworzenia kopii zapasowej nie może ich używać. Należy utworzyć bucket, zasadę dostępu ograniczoną do tego bucketa oraz użytkownika, który nie otrzyma żadnych innych uprawnień.

mc mb local/restic
cat > /tmp/restic-rw.json <<'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket", "s3:GetBucketLocation"],
      "Resource": ["arn:aws:s3:::restic"]
    },
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
      "Resource": ["arn:aws:s3:::restic/*"]
    }
  ]
}
EOF
RESTIC_KEY=$(openssl rand -base64 24)
mc admin policy create local restic-rw /tmp/restic-rw.json
mc admin user add local restic-backup "$RESTIC_KEY"
mc admin policy attach local restic-rw --user restic-backup

MinIO udostępnia wbudowaną zasadę readwrite, dzięki której można byłoby użyć o jedną komendę mniej. Przyznaje ona jednak pełny dostęp do każdego bucketa na serwerze. W powyższej zasadzie nazwa bucketa występuje celowo dwa razy: raz jako arn:aws:s3:::restic, aby możliwe było wyświetlanie zawartości bucketa, oraz raz jako arn:aws:s3:::restic/* dla obiektów znajdujących się w tym buckecie. W S3 bucket i jego obiekty są oddzielnymi zasobami, dlatego zasada zawierająca tylko jeden z nich kończy się błędem, który może wyglądać jak problem z klientem.

Przed użyciem należy sprawdzić ograniczenie.

mc alias set resticuser http://127.0.0.1:9000 restic-backup "$RESTIC_KEY"
mc ls resticuser/restic
mc ls resticuser/backups

Pierwszy ls kończy się powodzeniem, a drugi kończy się błędem Access Denied. Nieprzetestowana zasada jest tylko przypuszczeniem.

Następnie należy wskazać bucket w restic. restic odczytuje poświadczenia S3 ze standardowych zmiennych środowiskowych AWS, dlatego nie jest potrzebny plik poświadczeń specyficzny dla restic.

sudo apt install -y restic
export AWS_ACCESS_KEY_ID=restic-backup
export AWS_SECRET_ACCESS_KEY="$RESTIC_KEY"
restic -r s3:http://127.0.0.1:9000/restic init
restic -r s3:http://127.0.0.1:9000/restic backup /etc
restic -r s3:http://127.0.0.1:9000/restic snapshots

restic init żąda hasła do repozytorium. Hasło szyfruje repozytorium, dlatego MinIO przechowuje wyłącznie szyfrogram, a utrata hasła oznacza utratę kopii zapasowej. Zadanie uruchomione przez timer systemd nie ma terminala, w którym można wpisać hasło, dlatego w przypadku zaplanowanych kopii zapasowych należy ustawić RESTIC_PASSWORD_FILE na plik z uprawnieniami 600.

Jedna zasada dotycząca lokalizacji ma większe znaczenie niż wszystkie powyższe komendy. Repozytorium restic na tym samym VPS co chronione dane chroni przed błędnym rm, ale przed niczym więcej. Węzeł MinIO powinien znajdować się na innym komputerze, najlepiej w innym regionie. kopie zapasowe restic na VPS opisuje planowanie i przechowywanie kopii na podstawie tej konfiguracji.

Terminowanie TLS za pomocą nginx

MinIO działa na localhost, dlatego nginx stanowi publiczny interfejs. Najpierw wystaw certyfikat zgodnie z opisem w Certyfikaty Let's Encrypt za pomocą certbot i nginx, a następnie użyj tego bloku serwera.

server {
    listen 443 ssl;
    server_name s3.example.com;

    ignore_invalid_headers off;
    client_max_body_size 0;
    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;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
        proxy_pass http://127.0.0.1:9000;
    }
}

Kilka z tych wierszy ma kluczowe znaczenie. client_max_body_size 0 usuwa domyślny limit rozmiaru treści wynoszący 1 MB. Bez tego limitu każdy większy upload jest odrzucany za pomocą 413 Request Entity Too Large, zanim MinIO w ogóle otrzyma żądanie. proxy_request_buffering off przekazuje upload bezpośrednio dalej, ponieważ domyślna konfiguracja najpierw zapisuje całe żądanie w pliku tymczasowym. Duży obiekt wymaga wtedy dwukrotnie większej ilości miejsca na dysku. proxy_set_header Host $http_host jest mniej oczywiste: podpis S3 obejmuje nagłówek Host, dlatego proxy, które go przepisuje, powoduje niepowodzenie każdego żądania z komunikatem SignatureDoesNotMatch, mimo że access log pokazuje prawidłowo odebrane żądanie.

Należy również przekazać MinIO jego publiczną nazwę, aby generowane przez nie odnośniki wskazywały proxy, a nie localhost.

echo 'MINIO_SERVER_URL=https://s3.example.com' | sudo tee -a /etc/default/minio
sudo systemctl restart minio

Reguły zapory pozostają ograniczone do minimum. Należy zezwolić na SSH i HTTPS, a dla portów 9000 i 9001 nie definiować żadnej reguły. Adres powiązany z 127.0.0.1 jest nieosiągalny z innego komputera niezależnie od konfiguracji zapory. Polecenia opisano w Podstawy konfiguracji zapory ufw na VPS.

Kiedy wystarczy MinIO na jednym węźle, a kiedy potrzebny jest rzeczywisty S3

Jeden węzeł oznacza tutaj jeden dysk bez parzystości. Dokumentacja MinIO opisuje taki układ jako odpowiedni do testów i małych obciążeń, dla których dostępność nie jest wymagana. W ramach wdrożenia nie ma drugiej kopii danych, dlatego trwałość każdego obiektu zależy od trwałości jednego dysku VPS. Funkcje zakładające użycie rozproszonego zaplecza z kodowaniem korekcyjnym, w tym replikacja bucketów i blokowanie obiektów, dotyczą wdrożeń z wieloma dyskami. Nie należy więc obiecywać niezmiennej polityki przechowywania danych w takiej konfiguracji.

Jest to dobre rozwiązanie jako miejsce docelowe dla restic na drugim VPS w innym regionie oraz jako endpoint S3 na potrzeby prac programistycznych i artefaktów CI, gdy utrata bucketa oznacza konieczność ponownego wykonania kompilacji i nic więcej. Można go również użyć do przesyłania plików przez użytkowników w małej aplikacji, pod warunkiem posiadania planu odtwarzania i przeprowadzenia rzeczywistego testu przywracania.

Należy wybrać zarządzaną usługę S3, gdy umowa lub regulator wymaga blokowania obiektów albo trwałości w wielu regionach, lub gdy nie chce się pełnić dyżuru o 03:00 z powodu zapełnienia dysku. Uczciwym powodem jest również zamrożona wersja kompilacji. W lipcu 2026 wstępnie skompilowany plik binarny społeczności pochodzi z września 2025 i nie otrzymuje poprawek. Jego uruchomienie oznacza zaakceptowanie tego stanu albo samodzielne zbudowanie oprogramowania ze źródeł i śledzenie dalszego rozwoju projektu.

Warto wyraźnie wskazać jedną granicę, ponieważ ten temat często powraca. Magazyn obiektowy nie jest bazą danych. Każdy zapis zastępuje cały obiekt, dlatego aktywny plik SQL w buckecie S3 działa wolno i jest niebezpieczny. Bazę danych należy przechowywać na dysku lokalnym, a następnie wykonywać jej kopie zapasowe do bucketa: uruchamianie SQLite w środowisku produkcyjnym na VPS opisuje taki podział.

Tryby awarii i komunikaty wyświetlane przez system

Jednostka kończy działanie zaraz po systemctl enable --now. Odczytaj journalctl -u minio -n 30 --no-pager. Failed to load environment files: No such file or directory oznacza, że brakuje /etc/default/minio albo jego ścieżka w jednostce jest zapisana niepoprawnie. Komunikat kończący się na permission denied oznacza, że katalog danych nie jest zapisywalny dla konta usługi. Sprawdź, czy stat -c '%U' /var/lib/minio/data wyświetla minio-user.

minioadmin:minioadmin nadal umożliwia logowanie. Plik środowiskowy nie został przekazany do procesu. Sprawdź, czy jednostka zawiera EnvironmentFile=/etc/default/minio, uruchom sudo systemctl daemon-reload, a następnie uruchom usługę ponownie. MinIO odczytuje poświadczenia root tylko podczas uruchamiania, dlatego edycja tego pliku bez ponownego uruchomienia niczego nie zmienia.

Address already in use podczas uruchamiania. Inny proces zajmuje port 9000. Znajdź go za pomocą sudo ss -ltnp | grep :9000, zanim zmienisz port MinIO.

Przesyłanie plików większych niż 1 MB przez proxy kończy się niepowodzeniem. nginx zwrócił 413 Request Entity Too Large, a MinIO nie otrzymało żądania. Ustaw client_max_body_size 0 w bloku serwera.

SignatureDoesNotMatch. Klucz tajny jest niepoprawny albo coś między klientem a MinIO zmieniło nagłówek Host, który jest uwzględniany w podpisie.

RequestTimeTooSkewed. Zegar klienta albo serwera wskazuje nieprawidłowy czas. Każde żądanie S3 zawiera znacznik czasu i jest odrzucane poza 15-minutowym oknem. Sprawdź timedatectl i potwierdź, że synchronizacja czasu jest aktywna.

Access Denied w zasobniku, o którego istnieniu wiadomo. Klucz jest przypisany do innego zasobnika. Wyświetl zakres faktycznie dozwolony przez zasadę za pomocą mc admin policy info local restic-rw i porównaj nazwę zasobnika w wierszach zasobów.

FAQ

Czy jednowęzłowy MinIO wystarcza do rzeczywistych kopii zapasowych?

Wystarcza jako miejsce docelowe dla restic uruchomione na oddzielnej maszynie względem danych, które chroni. Nie wystarcza jako jedyna kopia. Wdrożenie z jednym dyskiem nie zapewnia żadnej parzystości, więc w MinIO nie ma drugiej kopii. Jeśli ten dysk VPS utraci dane, obiekty zostaną utracone. Należy utrzymywać drugie miejsce docelowe w innej lokalizacji oraz co najmniej raz odtworzyć dane z obu miejsc, aby potwierdzić poprawność procedury.

Dlaczego sha256sum -c kończy się błędem w przypadku pliku sum kontrolnych MinIO?

Ponieważ etykieta znajdująca się za skrótem w tym pliku zawiera nazwę wydania, minio.RELEASE.2025-09-07T16-13-09Z, natomiast pobrany plik ma zwykle nazwę minio. sha256sum -c szuka pliku o nazwie zapisanej w pliku sum kontrolnych, nie znajduje go, a następnie zgłasza No such file or directory i WARNING: 1 listed file could not be read. Pobieranie przebiegło poprawnie. Należy bezpośrednio porównać ciągi skrótów i zignorować etykietę, ponieważ nie ma ona znaczenia dla bezpieczeństwa.

Gdzie znajduje się konsola administracyjna MinIO w przeglądarce?

MinIO usunęło funkcje administracyjne z konsoli edycji community w maju 2025, pozostawiając w interfejsie internetowym przeglądarkę obiektów. Zasobnikami i użytkownikami zarządza się teraz za pomocą klienta mc, używając poleceń takich jak mc admin user add i mc admin policy attach. W edycji community jest to obsługiwana metoda, a nie obejście. Z tego powodu wszystkie czynności w tym przewodniku wykonuje się z wiersza poleceń.

Jak skonfigurować restic do korzystania z MinIO jako backendu S3?

Należy ustawić AWS_ACCESS_KEY_ID i AWS_SECRET_ACCESS_KEY na klucz dostępu MinIO oraz odpowiadający mu klucz tajny, a następnie użyć ciągu repozytorium w formie s3:https://s3.example.com/restic, gdzie ostatni element ścieżki jest nazwą zasobnika. Zasobnik należy najpierw utworzyć za pomocą mc mb, ponieważ klucz ograniczony do jednego zasobnika nie ma uprawnień do tworzenia zasobników. Przed przesłaniem restic szyfruje wszystkie dane własnym hasłem repozytorium. MinIO przechowuje więc szyfrogramy i nie ma dostępu do plików.

Czy MinIO musi działać za nginx?

TLS (zabezpieczenia warstwy transportowej) jest wymagane, gdy klient nie znajduje się na tej samej maszynie, ponieważ dane uwierzytelniające S3 i dane obiektów są przesyłane w ramach żądania. Najprostszym rozwiązaniem jest proxy na porcie 443 z certyfikatem uzyskanym za pomocą certbot. Odnowienie certyfikatu nie wymaga wtedy konfiguracji w MinIO. MinIO może również samodzielnie kończyć połączenia TLS, jeśli --certs-dir zostanie wskazane na katalog zawierający public.crt i private.key. W takim przypadku konto usługi musi mieć uprawnienia odczytu do odnowionego klucza prywatnego. Wymaga to dodatkowej konfiguracji przy uzyskaniu tego samego rezultatu.

#minio#s3#object-storage#self-hosted#vps