Journal-IndexDockup / Feldnotiz
Note / self-host-minio

MinIO 2026 selbst hosten: S3-Endpunkte, TLS und dauerhafte Speicherung

Ein praxisnaher Leitfaden zum Self-Hosting von MinIO mit Docker, Ports, persistenten Daten, TLS, Sicherheit, Backups und den Fehlern, die den Einsatz in der Produktion verhindern. Schritt für Schritt.

Ein fehlgeschlagenes MinIO-Deployment stürzt nicht immer ab. Es kann eine Login-Seite ausliefern, während Clients Requests für die Console-URL statt für die S3-API-URL signieren. Beginne stattdessen mit einem End-to-End-Check: Erstelle einen Bucket, lade ein Multipart-Objekt hoch, rufe es über eine presigned URL ab und überprüfe, ob ein versionierter Löschvorgang wiederhergestellt werden kann.

Dieser Check entspricht dem dokumentierten Zweck von MinIO: S3-kompatibler Object Storage auf Datenträgern, die du kontrollierst. Außerdem macht er fehlende Abhängigkeiten, falsche Annahmen über den Proxy und kurzlebige Daten früher sichtbar als ein einfacher Uptime-Probe.

Wovon MinIO abhängt

Der MinIO-HTTP-Prozess lauscht auf Port 9000. Belasse diesen Port im Anwendungsnetzwerk und veröffentliche nur die Plattform-Route. Die lokale Laufzeitanforderung ist ein zweiter Datenträger oder ein Remote-Ziel für wiederherstellbare Backups. Halte dessen Lebenszyklus explizit fest, damit das Verschieben von MinIO zwischen Hosts das Verhalten nicht unbemerkt verändert.

Halte die Abgrenzung als kurzen Vertrag fest: Wer ist für die Anforderung zuständig, welche Zugangsdaten werden verwendet, welches Timeout ist akzeptabel und wie zeigt sich ein Fehler? Führe anschließend diese Transaktion aus: Erstelle einen Bucket, lade ein Multipart-Objekt hoch, rufe es über eine presigned URL ab und überprüfe, ob ein versionierter Löschvorgang wiederhergestellt werden kann. Beobachte währenddessen die Festplattenlatenz, parallele Multipart-Uploads, den freien Speicher und den Netzwerkdurchsatz zwischen Anwendungen und dem S3-Endpunkt, da diese Auslastung eine bessere Ausgangsgröße liefert als ein inaktiver Container.

Eine Docker-Basis für MinIO

Ein produktionsnaher Start ist bewusst unspektakulär: benannter Zustand, explizite Ports und keine Secrets im Image.

docker run -d \
  --name minio \
  --restart unless-stopped \
  -p 127.0.0.1:9000:9000 \
  -p 127.0.0.1:9001:9001 \
  -v minio-data:/data \
  -e MINIO_ROOT_PASSWORD=replace-with-a-long-random-value \
  -e MINIO_ROOT_USER=dockup-admin \
  quay.io/minio/minio:latest server /data --console-address :9001

Das Beispiel ist eine Ausgangsbasis und kein vollständiger unterstützender Stack. Bestätige vor der Veröffentlichung die lokale Laufzeitanforderung: ein zweiter Datenträger oder ein Remote-Ziel für wiederherstellbare Backups. Prüfe die tatsächlich eingebundenen Mounts und den Listener. Versuche anschließend, einen Bucket zu erstellen, ein Multipart-Objekt hochzuladen, es über eine presigned URL abzurufen und zu überprüfen, ob ein versionierter Löschvorgang wiederhergestellt werden kann. Fixiere das funktionierende Image, bevor der nächste Neustart erfolgt.

Domains, Proxy-Header und Port 9000

Die Ausstellung von TLS-Zertifikaten ist nur die halbe MinIO-Route. Leite die S3-API und die Console über separate Hostnames, wenn beide veröffentlicht werden. Leite den Traffic intern an Port 9000 weiter und übertrage das externe Schema, damit generierte URLs und sichere Cookies konsistent bleiben.

Nutze das vollständige MinIO-Szenario aus einem sauberen Netzwerk und nicht nur die Root-Seite. Ein 502- oder Zertifikatsfehler lässt sich mit automatischer Domain- und TLS-Einrichtung isolieren. Wenn der Traffic den Prozess erreicht und Clients Requests für die Console-URL statt für die S3-API-URL signieren, diagnostiziere diese Bedingung an ihrem tatsächlichen Entstehungsort, statt weitere Redirects aufeinanderzustapeln.

Plane die MinIO-Wiederherstellung vor dem Start

Erstelle für MinIO ein Recovery-Manifest: Bucket-Daten, Policies, Benutzer und getestete Replikate auf Objektebene. Binde /data vor dem Bootstrap ein, schreibe harmlose Testdaten und ersetze den Container, um zu beweisen, dass dieser Pfad tatsächlich persistent ist. Prüfe jetzt Eigentümer und freien Speicher, denn ein eingebundener, aber nicht beschreibbarer Pfad verhält sich praktisch wie fehlende Persistenz.

Sichere in eine vom laufenden Server getrennte Fehlerdomäne. Stelle MinIO aus seinem fixierten Image wieder her und überprüfe, ob Bucket-Versionen, Policies, Benutzer und ein repräsentatives Multipart-Objekt bei der Wiederherstellung auf einem anderen Storage erhalten bleiben. Der Leitfaden zu persistenten Volumes hilft dabei, diese Übung in eine Snapshot- und Retention-Policy zu überführen.

Lege die Vertrauensgrenze von MinIO fest

Modelliere die Bedrohungen für die Aktionen, die MinIO ausführt, und nicht nur für dessen Login-Formular. Der risikoreichste Fehler ist hier die Verwendung kurzer Standard-Root-Zugangsdaten oder die weitreichende Veröffentlichung der Admin-Console. Setze diese Grenze um: Trenne die S3-API von der administrativen Console und stelle Application Keys aus, die nicht den gesamten Server verwalten können.

Behandle MINIO_ROOT_PASSWORD entsprechend seiner Rolle in MinIO: Halte sensible Werte aus Git heraus, dokumentiere die Auswirkungen einer Rotation und ersetze ein öffentliches Beispiel niemals in der Produktion. Löse einen Berechtigungsfehler nicht dadurch, dass du den Container als Root ausführst oder den Host umfassend mountest. Auch Resource Limits gehören zum Security-Design, wenn Benutzer die Festplattenlatenz, parallele Multipart-Uploads, den freien Speicher oder den Netzwerkdurchsatz zwischen Anwendungen und dem S3-Endpunkt beeinflussen können.

Logs, die die nächste Frage beantworten

Beobachte die Arbeit, die MinIO ausführt: Festplattenlatenz, parallele Multipart-Uploads, freien Speicher und den Netzwerkdurchsatz zwischen Anwendungen und dem S3-Endpunkt. Setze Limits mit ausreichend Headroom für diese Arbeit und vermeide eine Liveness-Probe, die mit ihr konkurriert. Der Operator-Check sollte weiterhin planmäßig versuchen, einen Bucket zu erstellen, ein Multipart-Objekt hochzuladen, es über eine presigned URL abzurufen und zu überprüfen, ob ein versionierter Löschvorgang wiederhergestellt werden kann.

Denke bei Updates daran, dass Server-Releases, das Signaturverhalten der Clients und jedes Erasure-Set-Layout mit einer Kopie echter Bucket-Metadaten getestet werden müssen. Deploye den Kandidaten gegen eine wiederhergestellte Kopie und wiederhole den bekannten Test. Wenn Clients Requests für die Console-URL statt für die S3-API-URL signieren, nutze Runtime-Logs und den tatsächlichen Netzwerk-Request, um herauszufinden, welche Annahme sich geändert hat.

Belege sammeln, bevor MinIO live geht

Erstelle vor dem Zugriff echter Benutzer ein Release-Arbeitsblatt für MinIO. Es muss das fixierte Image, Port 9000, die kanonische Origin, persistente Pfade und die verantwortliche Person für einen zweiten Datenträger oder ein Remote-Ziel für wiederherstellbare Backups nennen. Füge das erwartete Ergebnis dieser Transaktion bei: einen Bucket erstellen, ein Multipart-Objekt hochladen, es über eine presigned URL abrufen und überprüfen, ob ein versionierter Löschvorgang wiederhergestellt werden kann.

Verwende das Arbeitsblatt nach einem normalen Austausch und nach einer sauberen Wiederherstellung. Die Wiederherstellung gilt nur dann als erfolgreich, wenn Bucket-Versionen, Policies, Benutzer und ein repräsentatives Multipart-Objekt bei der Wiederherstellung auf einem anderen Storage erhalten bleiben. Erfasse außerdem eine kurze Ressourcenaufzeichnung mit Festplattenlatenz, parallelen Multipart-Uploads, freiem Speicher und Netzwerkdurchsatz zwischen Anwendungen und dem S3-Endpunkt. Bewahre sie neben dem Release auf, damit künftige Kapazitätsänderungen mit derselben Auslastung verglichen werden können.

Füge einen kontrollierten Fehler hinzu: Übermittle harmlose Eingaben nahe am Ressourcen- oder Formatlimit, das mit dieser Grenze verbunden ist: Clients signieren Requests für die Console-URL statt für die S3-API-URL. Bestätige, dass MinIO das Problem an der richtigen Grenze meldet, stelle die gültige Bedingung wieder her und führe die Transaktion erneut aus. Damit wird die Sichtbarkeit von Fehlern geprüft und nicht nur der Erfolg. So verhinderst du, dass eine gesund wirkende Oberfläche einen fehlerhaften Worker, Callback oder eine unterbrochene Datenbankverbindung verbirgt.

MinIO auf Dockup deployen, ohne seine Grenzen zu verlieren

Ein Dockup-Template sollte Image, Port 9000, Mounts, Health-Timing, Domain, TLS und Secret-Bereitstellung festlegen. Dockup sollte die MinIO-Runtime-Einstellungen beibehalten, während der Operator diese lokale Anforderung bestätigt: ein zweiter Datenträger oder ein Remote-Ziel für wiederherstellbare Backups. Dasselbe Deployment kann auf Dockup-Server oder vom Kunden bereitgestellte Kapazität abzielen.

Nachdem die Route aktiv ist, wende die öffentliche Einstellung an und versuche, einen Bucket zu erstellen, ein Multipart-Objekt hochzuladen, es über eine presigned URL abzurufen und zu überprüfen, ob ein versionierter Löschvorgang wiederhergestellt werden kann. Sichere Bucket-Daten, Policies, Benutzer und getestete Replikate auf Objektebene und nimm die Wiederherstellungsübung in den Betriebsplan auf. Das sind MinIO-Verantwortlichkeiten, die auch nach der Bereitstellung der Infrastruktur sichtbar bleiben.

Häufig gestellte Fragen

Was benötigt MinIO für ein Deployment in der Produktion?

Leite den MinIO-Container über eine HTTPS-Origin auf Port 9000 weiter. Die lokale Laufzeitanforderung ist ein zweiter Datenträger oder ein Remote-Ziel für wiederherstellbare Backups. Erkläre MinIO erst dann für bereit, wenn du einen Bucket erstellen, ein Multipart-Objekt hochladen, es über eine presigned URL abrufen und überprüfen kannst, ob ein versionierter Löschvorgang wiederhergestellt werden kann.

Welche MinIO-Daten gehören in ein Backup?

Mache /data persistent und nimm Bucket-Daten, Policies, Benutzer und getestete Replikate auf Objektebene in dasselbe Recovery-Manifest auf. Eine saubere MinIO-Wiederherstellung ist erst dann erfolgreich, wenn Bucket-Versionen, Policies, Benutzer und ein repräsentatives Multipart-Objekt bei der Wiederherstellung auf einem anderen Storage erhalten bleiben.

Benötigt MinIO hinter einem Reverse Proxy HTTPS?

Verwende HTTPS für die öffentliche MinIO-Origin und belasse Port 9000 auf der internen Route. Wende die MinIO-Einstellung korrekt an: Leite die S3-API und die Console über separate Hostnames, wenn beide veröffentlicht werden. Bei MinIO schützt HTTPS Zugangsdaten oder Benutzerinhalte während der Übertragung und sorgt für konsistentes, von der Origin abhängiges Client-Verhalten.

Wie sollte ein MinIO-Upgrade getestet werden?

Stelle den aktuellen MinIO-Zustand in einem isolierten Deployment wieder her, spiele die Kandidatenversion ein und wiederhole die Abnahmetransaktion. Achte besonders darauf, dass Server-Releases, das Signaturverhalten der Clients und jedes Erasure-Set-Layout mit einer Kopie echter Bucket-Metadaten getestet werden müssen. Behalte das vorherige MinIO-Image, bis die Grenzen der Datenmigration und des Rollbacks bekannt sind.