SSD Nodes Learn 8GB RAM — $66/Jahr
Anleitungen Matt ConnorVon Matt Connor · Aktualisiert 2026-08-01

MinIO auf einem VPS selbst hosten: S3-Speicher einrichten

Richten Sie MinIO unter Ubuntu 24.04 auf einem VPS ein: verifizierte Binärdatei, systemd, mc, Presigned URLs und ein restic-Ziel für S3-Backups.

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

Was Ihnen selbst gehosteter Objektspeicher mit MinIO bietet

MinIO ist selbst gehosteter Objektspeicher mit Unterstützung für die Amazon S3 API. Richten Sie restic oder ein beliebiges S3 SDK auf Ihren eigenen Server und ändern Sie nur eine Endpunkteinstellung. Der Client erkennt keinen Unterschied. In dieser Anleitung richten Sie einen einzelnen Knoten unter Ubuntu 24.04 ein: eine verifizierte Binärdatei, einen dedizierten Systembenutzer, eine systemd-Einheit, die die Root-Anmeldedaten aus der Unit-Datei heraushält, sowie einen Bucket, in den restic Sicherungen schreibt.

S3 (Simple Storage Service) ist eine HTTP API und kein Dateisystem. Sie schreiben ein Objekt mit PUT unter einem Schlüssel in einen Bucket und lesen es mit GET wieder aus. Es gibt weder Teil-Schreibvorgänge noch Umbenennungen. Sicherungsprogramme verwenden dieses Modell gern, weil ein Objekt entweder vollständig angekommen ist oder nicht.

Ein Knoten enthält eine Kopie Ihrer Daten. Das ist der Kompromiss. Sie erhalten einen S3-Endpunkt, den Sie für die Kosten eines VPS kontrollieren. Gleichzeitig übernehmen Sie alle Aufgaben, die sonst der Cloud-Anbieter erledigt, vom Ersetzen einer ausgefallenen Festplatte bis zum Patchen der Serversoftware. Im Abschnitt gegen Ende wird klar erläutert, wann dieser Kompromiss sinnvoll ist.

Der Stand der MinIO Community Edition im Juli 2026

Lesen Sie diesen Abschnitt, bevor Sie darauf aufbauen, da sich die Situation kürzlich geändert hat. Im Mai 2025 hat MinIO die Administrationsfunktionen aus der Webkonsole der Community Edition entfernt. Im Browser ist nur noch ein Objektbrowser verfügbar. Buckets und Zugriffsschlüssel werden daher stattdessen mit dem mc Befehlszeilenclient verwaltet.

Später im Jahr 2025 hat MinIO die Veröffentlichung vorkompilierter Community-Binärdateien eingestellt. In der README des Projekts steht jetzt, dass die Community Edition nur noch als Quellcode verteilt wird. Die älteren Download-URLs funktionieren weiterhin: Im Juli 2026 liefern sie die Serverversion RELEASE.2025-09-07T16-13-09Z und die Clientversion RELEASE.2025-08-13T08-35-41Z. Eine neuere Community-Version ist nicht erschienen. Die unten angegebene Binärdatei ist daher verfügbar, läuft und ist unverändert. Sicherheitskorrekturen, die nach September 2025 veröffentlicht wurden, sind darin nicht enthalten.

Diese Tatsache bestimmt den restlichen Aufbau dieses Leitfadens. Deshalb lauscht MinIO hier auf 127.0.0.1 und erreicht das Internet nur über einen von Ihnen kontrollierten Proxy. Wenn Sie Sicherheitskorrekturen laufend übernehmen möchten, erstellen Sie MinIO aus dem Quellcode. Die README des Anbieters enthält dafür den einzelnen Befehl go install github.com/minio/minio@latest. Dafür benötigen Sie eine Go-Toolchain. Die Binärdatei wird nach ~/go/bin/minio geschrieben. Installieren Sie diese Binärdatei nach /usr/local/bin/minio. Alle weiteren Schritte hier bleiben unverändert.

Die MinIO-Binärdatei installieren und den Download überprüfen

Laden Sie das festgelegte Release und die veröffentlichte Prüfsumme herunter. Das -f-Flag bewirkt, dass curl bei einem HTTP-Fehler fehlschlägt, anstatt die Fehlerseite unter dem angeforderten Namen zu speichern. Andernfalls installieren Sie möglicherweise eine 404-Seite und fragen sich, warum sie nicht ausgeführt werden kann.

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

Vergleichen Sie die beiden Hashes. Vergleichen Sie ausschließlich die Hashes.

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

Verwenden Sie hier nicht sha256sum -c minio.sha256sum. Die Bezeichnung hinter dem Hash in dieser Datei lautet minio.RELEASE.2025-09-07T16-13-09Z, und wir haben den Download als minio gespeichert. Daher sucht -c nach einer Datei, die nicht existiert. Es meldet No such file or directory und anschließend WARNING: 1 listed file could not be read. Das sieht wie ein beschädigter Download aus, ist aber keiner. Die Bezeichnung ist nur ein Name. Der Hash ist der Teil, der die Integritätsgarantie liefert.

Machen Sie sich klar, was diese Prüfung beweist. Die Binärdatei und der Hash stammen vom selben Anbieter und wurden über dieselbe Verbindung übertragen. Eine Übereinstimmung beweist daher, dass der Download vollständig ist und während der Übertragung nicht beschädigt oder verändert wurde. Sie beweist nicht, dass der Anbieter vertrauenswürdig ist. Das ist ein anderes Problem, und kein sha256sum-Befehl löst es.

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

minio --version gibt minio version RELEASE.2025-09-07T16-13-09Z gefolgt von einigen Build-Zeilen aus. Ein Permission denied bedeutet hier, dass der Modus falsch ist. command not found bedeutet, dass /usr/local/bin nicht in Ihrem PATH enthalten ist.

Systembenutzer und Datenverzeichnis erstellen

MinIO akzeptiert Uploads aus dem Netzwerk und sollte daher nicht als root ausgeführt werden. Geben Sie ihm ein Konto ohne Home-Verzeichnis und ohne Login-Shell.

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 erstellt ein Systemkonto mit einer UID unter 1000. Dadurch liegt es außerhalb des für Benutzer verwendeten Bereichs. -M überspringt das Home-Verzeichnis, da ein Konto, bei dem keine Anmeldung erfolgt, dort nichts speichern muss. Prüfen Sie das Ergebnis mit id minio-user und mit stat -c '%U %a' /var/lib/minio. Letzteres sollte minio-user 750 ausgeben.

Das Datenverzeichnis muss für diesen Benutzer schreibbar und nicht nur lesbar sein. Beim ersten Start erstellt MinIO im Volume ein Verzeichnis .minio.sys, um die eigene Konfiguration zu speichern. Ein Verzeichnis im Besitz von root führt daher dazu, dass MinIO während des Starts mit einer Meldung beendet wird, die auf permission denied endet. Dieselbe Regel gilt für jeden Dienst, den Sie auf diese Weise ausführen. Dienstbenutzer mit geringsten Berechtigungen auf einem VPS behandelt dieses Thema ausführlich.

Die root-Anmeldedaten in einer Umgebungsdatei ablegen

Die root-Anmeldedaten ermöglichen den Zugriff auf jeden Bucket. Sie gehören daher nicht in die Unit-Datei, die für alle Benutzer lesbar ist. Erstellen Sie die Datei zuerst mit den richtigen Berechtigungen und schreiben Sie erst danach hinein. So befindet sich das Passwort zu keinem Zeitpunkt in einer lesbaren Datei.

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 leert eine vorhandene Datei, statt sie neu zu erstellen. Dadurch bleiben der Modus 600 und der Eigentümer root erhalten. Das ist beabsichtigt. systemd liest EnvironmentFile als root ein, bevor es die Berechtigungen auf User= reduziert. Das Dienstkonto muss daher niemals seine eigenen Anmeldedaten lesen. Sobald der Dienst läuft, weisen Sie dies mit sudo -u minio-user cat /etc/default/minio nach. Dieser Befehl muss Permission denied ausgeben.

Vor dem Start sollten Sie zwei Eigenschaften von MinIO kennen. Wenn weder MINIO_ROOT_USER noch MINIO_ROOT_PASSWORD in der Umgebung gesetzt ist, verweigert MinIO den Start nicht. Es startet mit den dokumentierten Standardanmeldedaten minioadmin:minioadmin. Das ist das erste Anmeldedatenpaar, das jeder Scanner ausprobiert. Der Dienst wirkt dabei vollständig funktionsfähig. Ein Passwort mit weniger als 8 Zeichen wird dagegen abgelehnt. MinIO beendet sich beim Start mit einer Fehlermeldung, dass die Anmeldedaten ungültig sind, weil der Zugriffsschlüssel mindestens 3 Zeichen und der geheime Schlüssel mindestens 8 Zeichen benötigt.

MINIO_VOLUMES ist der Datenpfad, und MINIO_OPTS enthält die Flags. Wenn Sie an 127.0.0.1 binden, kann außerhalb dieses VPS noch niemand die S3-API erreichen. Das ist die richtige Standardeinstellung. Später geben Sie den Zugriff bewusst über einen Proxy frei, der ein Zertifikat verwendet.

Die systemd-Unit schreiben

Erstellen Sie /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

EnvironmentFile beginnt nicht mit -. Das ist eine bewusste Entscheidung und kein Tippfehler. Mit dem Bindestrich ignoriert systemd eine fehlende Datei und startet MinIO trotzdem. Eine gelöschte Datei oder ein falsch geschriebener Pfad führt dadurch unbemerkt zu einem Server, der auf minioadmin:minioadmin läuft. Ohne den Bindestrich schlägt die Unit fehl, bevor MinIO überhaupt startet, und journalctl -u minio zeigt Failed to load environment files: No such file or directory. Eine Unit, die den Start verweigert, fällt viel leichter auf als ein Server, der stillschweigend das Standardpasswort akzeptiert.

$MINIO_VOLUMES und $MINIO_OPTS bleiben absichtlich ohne Anführungszeichen, weil systemd Variablen ohne Anführungszeichen bei Leerzeichen in einzelne Argumente aufteilt. Dadurch werden die vier Wörter in MINIO_OPTS zu vier Argumenten für minio server. LimitNOFILE=65536 erhöht das Dateideskriptorlimit. Jede offene Verbindung und jede geöffnete Datendatei benötigt einen Deskriptor. Der Standardwert 1024 ist unter Last schnell ausgeschöpft.

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 sollte active ausgeben. Der Health-Endpunkt sollte mit 200 antworten. journalctl -u minio -n 20 --no-pager zeigt die API-Adresse, unter der der Server Verbindungen entgegennimmt. Wenn die Unit ständig neu gestartet wird, gibt systemd auf und protokolliert Start request repeated too quickly. Das bedeutet, dass MinIO bei jedem Versuch beendet wird. Der Grund steht in den Zeilen vor dieser Meldung. Lesen Sie daher nach oben.

Für eine stärkere Isolation fügen Sie ProtectSystem=full und ProtectHome=true zum Abschnitt [Service] hinzu. Beide benötigen Mount-Namespaces des Host-Kernels. Bei Container-Virtualisierung mit gemeinsam genutztem Host-Kernel, etwa OpenVZ oder LXC, können sie fehlschlagen. Die Unit meldet dann status=226/NAMESPACE. Entfernen Sie diese beiden Zeilen, damit sie startet. Die Unit selbst ist eine gewöhnliche Unit. systemd-Dienste und -Timer auf einem VPS behandelt die übrigen Direktiven.

mc installieren und eine Round-Trip-Prüfung durchführen

Der MinIO-Client ist mc. Installieren Sie ihn nicht mit apt install mc. Dieses Paket ist Midnight Commander, ein von MinIO unabhängiger Dateimanager.

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

Registrieren Sie den Server als Alias und verschieben Sie anschließend ein Objekt darüber.

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

mc ls sollte hello.txt mit seiner Größe auflisten, und mc cat sollte hello object storage ausgeben. Diese Round-Trip-Prüfung ist der eigentliche Nachweis, dass der Server funktioniert, weil dabei dieselben signierten S3-Anforderungen verwendet werden wie von jedem anderen Client. mc admin info local gibt den Serverstatus aus, wenn Sie eine zweite Überprüfung wünschen.

Führen Sie jetzt noch eine Prüfung durch, solange der Server noch leer ist.

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

Dieser Befehl muss fehlschlagen. Wenn er erfolgreich ist, wurde die Umgebungsdatei nicht an den Prozess übergeben, und Ihr Server läuft mit den Standardanmeldedaten. Beheben Sie das, bevor etwas anderes auf den Rechner zugreift.

mc speichert Aliase in ~/.mc/config.json als Klartext. Diese Anmeldedaten befinden sich daher im Homeverzeichnis des Benutzers, der den Befehl ausgeführt hat. Wenn Sie mc unter sudo ausführen, werden die root-Anmeldedaten in /root/.mc/config.json gespeichert. Belassen Sie den root-Alias bei einem einzigen Administratorkonto und geben Sie jeder Anwendung einen eigenen Schlüssel.

Ein Objekt mit einer presigned URL bereitstellen

Eine presigned URL ist ein gewöhnlicher HTTPS-Link mit einer Signatur und einer Ablaufzeit. Jeder, der den Link besitzt, kann dieses eine Objekt ohne Konto und ohne Client abrufen.

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

Die Ausgabe enthält X-Amz-Signature und X-Amz-Expires in der Abfragezeichenfolge. Dabei gibt es zwei Punkte, die oft überraschen. Der Link wird anhand des Endpunkts im verwendeten Alias erstellt. Ein Alias auf 127.0.0.1 erzeugt daher einen Link, den nur diese Maschine öffnen kann. Erstellen Sie für Links, die Sie weitergeben möchten, einen zweiten Alias für Ihren öffentlichen Hostnamen. Außerdem gibt es keine Möglichkeit zum Widerrufen. Die Signatur bleibt bis zum Ablauf gültig. Eine kurze Ablaufzeit ist daher die einzige Kontrolle, die Ihnen zur Verfügung steht. Sieben Tage sind das Maximum, das das S3-Signaturformat erlaubt.

Geben Sie restic einen eigenen Schlüssel und Bucket

Die root-Anmeldedaten können jeden Bucket lesen und löschen. Ein Backup-Job darf sie daher nicht verwenden. Erstellen Sie einen Bucket, eine auf diesen Bucket beschränkte Policy und einen Benutzer ohne weitere Berechtigungen.

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 enthält eine integrierte readwrite-Policy. Damit wäre ein Befehl entfallen. Sie gewährt jedoch vollständigen Zugriff auf jeden Bucket auf dem Server. Die obige Policy nennt den Bucket absichtlich zweimal: einmal als arn:aws:s3:::restic, damit das Auflisten des Buckets funktioniert, und einmal als arn:aws:s3:::restic/* für die darin enthaltenen Objekte. In S3 sind ein Bucket und seine Objekte getrennte Ressourcen. Eine Policy, die nur eine dieser Ressourcen nennt, schlägt daher auf eine Weise fehl, die wie ein defekter Client aussieht.

Testen Sie die Einschränkung, bevor Sie ihr vertrauen.

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

Der erste ls-Befehl ist erfolgreich, der zweite schlägt mit Access Denied fehl. Eine Policy, die Sie nicht getestet haben, ist nur eine Vermutung.

Verweisen Sie restic jetzt auf den Bucket. restic liest S3-Anmeldedaten aus den standardmäßigen AWS-Umgebungsvariablen. Eine restic-spezifische Anmeldedatendatei ist daher nicht erforderlich.

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 fordert ein Repository-Passwort an. Dieses Passwort verschlüsselt das Repository. MinIO speichert daher nur Chiffretext. Wenn das Passwort verloren geht, ist auch das Backup verloren. Ein von einem systemd-Timer gestarteter Lauf hat kein Terminal für die Eingabe. Setzen Sie RESTIC_PASSWORD_FILE daher für geplante Backups auf eine Datei mit dem Modus 600.

Eine Platzierungsregel ist wichtiger als jeder obige Befehl. Ein restic-Repository auf demselben VPS wie die geschützten Daten schützt Sie vor einem fehlerhaften rm, aber vor nichts anderem. Der MinIO-Knoten sollte sich auf einer anderen Maschine befinden, idealerweise in einer anderen Region. restic-Backups auf einem VPS behandelt darauf aufbauend die Planung und Aufbewahrung.

TLS mit nginx beenden

MinIO läuft auf localhost, daher ist nginx die öffentlich erreichbare Schnittstelle. Stellen Sie zuerst das Zertifikat aus, wie unter Let's-Encrypt-Zertifikate mit certbot und nginx beschrieben, und verwenden Sie anschließend diesen Serverblock.

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;
    }
}

Mehrere dieser Zeilen sind entscheidend. client_max_body_size 0 entfernt das standardmäßige Limit von 1 MB für den Request-Body. Ohne diese Einstellung weist nginx größere Uploads mit 413 Request Entity Too Large zurück, bevor MinIO die Anfrage überhaupt sieht. proxy_request_buffering off leitet den Upload direkt weiter. Standardmäßig wird die gesamte Anfrage zuerst in eine temporäre Datei geschrieben. Ein großes Objekt benötigt dann doppelt so viel Speicherplatz auf der Festplatte. proxy_set_header Host $http_host ist die wichtige Feinheit: Eine S3-Signatur umfasst den Header Host. Wenn ein Proxy diesen Header umschreibt, schlägt jede Anfrage mit SignatureDoesNotMatch fehl, obwohl das Zugriffsprotokoll eine normal eingehende Anfrage zeigt.

Teilen Sie MinIO außerdem seinen öffentlichen Namen mit. Dann verweisen die erzeugten Links auf den Proxy und nicht auf localhost.

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

Die Firewall bleibt klein. Erlauben Sie SSH und HTTPS. Lassen Sie die Ports 9000 und 9001 vollständig ohne Regel, da eine an 127.0.0.1 gebundene Adresse unabhängig von der Firewall-Einstellung von einem anderen Rechner nicht erreichbar ist. ufw-Grundlagen für Firewalls auf einem VPS enthält die Befehle.

Wann ein einzelner MinIO-Knoten ausreicht und wann Sie echtes S3 benötigen

Ein einzelner Knoten bedeutet hier ein Laufwerk ohne Parität. Die eigene Dokumentation von MinIO beschreibt dieses Layout als geeignet für Tests und kleine Workloads ohne Verfügbarkeitsanforderungen. Innerhalb der Bereitstellung gibt es keine zweite Kopie. Die Haltbarkeit jedes Objekts entspricht daher der Haltbarkeit eines einzelnen VPS-Laufwerks. Funktionen, die ein verteiltes, fehlerkorrigierendes Backend voraussetzen, darunter Bucket-Replikation und Objektsperren, gehören zu Bereitstellungen mit mehreren Laufwerken. Versprechen Sie daher für dieses Setup keine unveränderliche Aufbewahrungsrichtlinie.

Das Setup eignet sich gut als restic-Ziel auf einem zweiten VPS in einer anderen Region sowie als S3-Endpunkt für Entwicklungsarbeiten und CI-Artefakte. Der Verlust eines Buckets führt in diesen Fällen nur dazu, dass Sie ihn neu erstellen müssen. Auch für Benutzer-Uploads in einer kleinen Anwendung ist es vertretbar, sofern Sie für den Wiederherstellungsplan verantwortlich sind und eine Wiederherstellung tatsächlich getestet haben.

Wählen Sie Managed S3, wenn ein Vertrag oder eine Aufsichtsbehörde Objektsperren oder Haltbarkeit über mehrere Regionen verlangt. Das gilt auch, wenn Sie nicht um 03:00 Uhr benachrichtigt werden möchten, weil ein Laufwerk vollgelaufen ist. Der eingefrorene Build ist ein weiterer sachlicher Grund. Im Juli 2026 stammt die vorkompilierte Community-Binary vom September 2025 und erhält keine Fehlerbehebungen. Bei ihrem Betrieb akzeptieren Sie diesen Zustand. Alternativ müssen Sie sie aus dem Quellcode erstellen und das Projekt selbst aktuell halten.

Eine wichtige Abgrenzung sollte erwähnt werden, weil sie häufig relevant ist. Objektspeicher ist keine Datenbank. Jeder Schreibvorgang ersetzt ein vollständiges Objekt. Eine aktive SQL-Datei in einem S3-Bucket ist daher langsam und unsicher. Speichern Sie die Datenbank auf dem lokalen Laufwerk und sichern Sie sie stattdessen in den Bucket: SQLite in der Produktion auf einem VPS ausführen beschreibt diese Aufteilung.

Fehlerzustände und die angezeigten Meldungen

Die Unit schlägt direkt nach systemctl enable --now fehl. Lesen Sie journalctl -u minio -n 30 --no-pager. Failed to load environment files: No such file or directory bedeutet, dass /etc/default/minio in der Unit fehlt oder der Pfad falsch geschrieben ist. Eine Meldung mit dem Ende permission denied bedeutet, dass das Datenverzeichnis für das Dienstkonto nicht beschreibbar ist. Prüfen Sie daher, ob stat -c '%U' /var/lib/minio/data minio-user ausgibt.

minioadmin:minioadmin meldet sich weiterhin an. Die Umgebungsdatei hat den Prozess nicht erreicht. Stellen Sie sicher, dass die Unit EnvironmentFile=/etc/default/minio enthält, führen Sie sudo systemctl daemon-reload aus und starten Sie den Dienst anschließend neu. MinIO liest seine Root-Zugangsdaten einmal beim Start. Eine Änderung dieser Datei ohne Neustart hat daher keine Wirkung.

Address already in use beim Start. Ein anderer Prozess verwendet Port 9000. Ermitteln Sie ihn mit sudo ss -ltnp | grep :9000, bevor Sie den Port von MinIO ändern.

Uploads über 1 MB schlagen über den Proxy fehl. nginx hat mit 413 Request Entity Too Large geantwortet, und MinIO hat die Anfrage nie erhalten. Setzen Sie client_max_body_size 0 im Server-Block.

SignatureDoesNotMatch. Entweder ist der geheime Schlüssel falsch, oder etwas zwischen dem Client und MinIO hat den Header Host geändert. Dieser Header wird von der Signatur abgedeckt.

RequestTimeTooSkewed. Die Uhr des Clients oder des Servers geht falsch. Jede S3-Anfrage enthält einen Zeitstempel und wird außerhalb eines Zeitfensters von 15 Minuten abgewiesen. Prüfen Sie timedatectl und bestätigen Sie, dass die Zeitsynchronisierung aktiv ist.

Access Denied für einen Bucket, von dessen Existenz Sie wissen. Der Schlüssel ist auf einen anderen Bucket beschränkt. Geben Sie mit mc admin policy info local restic-rw aus, was die Richtlinie tatsächlich erlaubt, und vergleichen Sie den Bucket-Namen in den Ressourcenzeilen.

FAQ

Reicht ein einzelner MinIO-Knoten für echte Backups aus?

Er reicht als restic-Ziel aus, das auf einer anderen Maschine als die zu schützenden Daten läuft. Er reicht nicht als einzige Kopie aus. Bei einer Bereitstellung mit einem einzelnen Laufwerk gibt es keine Parität. Daher gibt es in MinIO keine zweite Kopie. Wenn diese VPS-Festplatte Daten verliert, sind die Objekte verloren. Verwenden Sie ein zweites Ziel an einem anderen Ort. Führen Sie mindestens einmal eine Wiederherstellung von beiden Zielen durch, damit Sie wissen, dass der Vorgang funktioniert.

Warum schlägt sha256sum -c bei der Prüfsummendatei von MinIO fehl?

Weil die Bezeichnung nach dem Hash in dieser Datei den Release-Namen minio.RELEASE.2025-09-07T16-13-09Z enthält, während Ihre heruntergeladene Datei normalerweise minio heißt. sha256sum -c sucht nach einer Datei mit dem in der Prüfsummendatei angegebenen Namen. Es findet diese Datei nicht und meldet No such file or directory sowie WARNING: 1 listed file could not be read. Der Download ist in Ordnung. Vergleichen Sie die Hash-Zeichenfolgen direkt und ignorieren Sie die Bezeichnung. Sie hat keine sicherheitsrelevante Bedeutung.

Wo ist die Webkonsole für die MinIO-Administration geblieben?

MinIO hat die Administrationsfunktionen aus der Konsole der Community Edition im Mai 2025 entfernt. In der Weboberfläche ist ein Objektbrowser geblieben. Buckets und Benutzer werden jetzt mit dem mc-Client verwaltet, beispielsweise mit den Befehlen mc admin user add und mc admin policy attach. Das ist der unterstützte Weg in der Community Edition und kein Workaround. Deshalb erledigt diese Anleitung alles über die Befehlszeile.

Wie verwende ich MinIO als S3-Backend für restic?

Setzen Sie AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY auf einen MinIO-Zugriffsschlüssel und das zugehörige Geheimnis. Verwenden Sie anschließend eine Repository-Zeichenfolge im Format s3:https://s3.example.com/restic. Das letzte Pfadelement ist dabei der Bucket-Name. Erstellen Sie den Bucket zuerst mit mc mb. Ein Schlüssel, der auf einen einzelnen Bucket beschränkt ist, darf keine Buckets erstellen. restic verschlüsselt alle Daten vor dem Upload mit seinem eigenen Repository-Passwort. MinIO speichert daher Chiffretext und erhält niemals Ihre Dateien.

Muss ich MinIO hinter nginx betreiben?

Sie benötigen TLS (Transport Layer Security), sobald sich ein Client nicht auf derselben Maschine befindet. S3-Anmeldedaten und Objektdaten werden beide innerhalb der Anfrage übertragen. Ein Proxy auf Port 443 mit einem von certbot ausgestellten Zertifikat ist dafür der einfachste Weg. Die Zertifikatserneuerung bleibt dabei von MinIO getrennt. MinIO kann TLS auch selbst beenden, wenn Sie --certs-dir auf ein Verzeichnis mit public.crt und private.key verweisen lassen. Dann benötigt das Dienstkonto jedoch Lesezugriff auf den erneuerten privaten Schlüssel. Das verursacht zusätzlichen Aufwand bei gleichem Ergebnis.

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