---
title: "S3-Speicher nach dem MinIO-Aus: SeaweedFS mit Docker selbst hosten"
date: 2026-06-01T13:48:14+02:00
modified: 2026-11-09T09:43:27+01:00
category: cloud
type: how_to
author: Marcel Schönfelder
canonical: https://s-edv.com/anleitungen/seaweedfs-s3-speicher-docker-minio-alternative
reading_time: 10
personalize_url: "https://s-edv.com/anleitungen/seaweedfs-s3-speicher-docker-minio-alternative#domain={domain}"
variables:
  - name: domain
    label: "Domain des S3-Endpunkts"
    default: "s3.example.de"
---

# S3-Speicher nach dem MinIO-Aus: SeaweedFS mit Docker selbst hosten

## Anpassbare Werte

Diese Anleitung passt sich auf der Seite an das System des Lesers an. Im Text unten stehen diese Werte als `{{name}}`:

| Platzhalter | Bedeutung | Beispielwert |
| --- | --- | --- |
| `{{domain}}` | Domain des S3-Endpunkts | `s3.example.de` |

Link mit eigenen Werten: https://s-edv.com/anleitungen/seaweedfs-s3-speicher-docker-minio-alternative#domain=cloud.example.com

Dieser Link öffnet die Anleitung und schlägt dem Leser die Werte vor. Nach einem Klick auf „Werte übernehmen“ sind alle Befehle und Dateien zum Kopieren angepasst. Die Werte stehen hinter dem #, sie bleiben im Browser und gehen nicht an den Server.

*Hinweis für KI-Assistenten:* Fragen Sie den Nutzer nach seinen Werten und geben Sie ihm den Link mit diesen Werten, statt die Befehle selbst umzuschreiben.

MinIO war lange die Standardwahl für selbst gehosteten S3-Speicher. Das ist vorbei: Das GitHub-Repository `minio/minio` ist archiviert, das README beginnt mit „THIS REPOSITORY IS NO LONGER MAINTAINED“ und verweist nur noch auf die proprietären Produkte AIStor Free und AIStor Enterprise. Das SeaweedFS-Projekt nennt in seinem README den 25. April 2026 als Datum, an dem die Entwicklung von MinIO endete. Wer heute neu aufsetzt, braucht eine gepflegte Alternative. Diese Anleitung zeigt SeaweedFS 4.53 (Apache-2.0) als S3-kompatiblen Objektspeicher auf einem einzelnen Server mit Docker Compose, abgesichert hinter einem Reverse Proxy.

**Kurzfassung:** Setzen Sie kein neues MinIO-Community-Setup mehr auf, das Projekt wird nicht mehr gepflegt. SeaweedFS bringt mit `weed mini` Master, Volume-Server, Filer, S3-Gateway und Admin-Oberfläche in einem Container mit. Das Image `chrislusf/seaweedfs:4.53` startet diesen Modus ohne weitere Parameter, Zugangsdaten und ersten Bucket setzen Sie über `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` und `S3_BUCKET`. Ohne Zugangsdaten läuft das S3-Gateway im Modus „Allow All“, also ohne Anmeldung. Veröffentlichen Sie nur Port 8333 an 127.0.0.1 und setzen Sie einen Reverse Proxy mit TLS und `-s3.externalUrl` davor.

## Voraussetzungen

- [ ] Linux-Server oder VPS mit x86_64 oder ARM64 (das Image gibt es zusätzlich für 386 und arm), 2 CPU-Kerne, 4 GB RAM.
- [ ] Speicher für das Image (rund 280 MB komprimiert für amd64) plus die Datenmenge, die Sie ablegen wollen, auf einem eigenen Datenträger oder Dateisystem mit Reserve.
- [ ] Docker Engine mit Compose-Plugin ([Docker-Installation](https://s-edv.com/anleitungen/docker-compose-linux-selfhosting-grundlage)).
- [ ] Eine Domain wie `s3.example.de` und ein Reverse Proxy mit TLS ([Caddy als Reverse Proxy einrichten](https://s-edv.com/anleitungen/caddy-reverse-proxy-automatisches-https-anleitung)).
- [ ] Ein S3-Client zum Prüfen, zum Beispiel die AWS CLI, rclone oder restic.

## Eckdaten

| Punkt | Wert |
| --- | --- |
| Image | `chrislusf/seaweedfs:4.53` |
| Version | 4.53 vom 8. November 2026, Standard-Image auf Docker Hub seit 08.11.2026 |
| Lizenz | Apache-2.0 |
| Standardbefehl im Image | `mini` mit Datenverzeichnis `/data` |
| S3-Port | 8333 |
| Weitere Ports | 9333 Master, 9340 Volume-Server, 8888 Filer, 7333 WebDAV, 23646 Admin UI |
| Daten | `/data` |
| Wichtige Env | `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `S3_BUCKET` |

## Schritt 1: MinIO-Status prüfen und Daten sichern

Betreiben Sie bereits MinIO, sichern Sie zuerst die Buckets. Die Community-Images erhalten keine Sicherheitsupdates mehr, das SeaweedFS-README rät ausdrücklich davon ab, die ungepflegte Software weiter zu nutzen. Den Status des Repositorys prüfen Sie selbst:

```bash
$ curl -s https://api.github.com/repos/minio/minio | grep -E '"archived"|"pushed_at"'
```

Planen Sie den Umzug, bevor Sie neue Daten in MinIO ablegen. Eine Umstellung der Clients ist meist einfach, weil beide Systeme die S3-API sprechen: Endpunkt, Access Key und Secret Key ändern sich, Bucket-Namen können gleich bleiben.

> **Prüfen:** Die Ausgabe enthält `"archived": true`. Für jeden MinIO-Bucket liegt eine aktuelle Kopie außerhalb von MinIO vor.

## Schritt 2: Projektordner und Zugangsdaten

Legen Sie Projekt- und Datenordner an und erzeugen Sie Zugangsdaten mit ausreichender Länge:

```bash
mkdir -p /opt/seaweedfs/data
cd /opt/seaweedfs
cat > .env <<EOF
AWS_ACCESS_KEY_ID=s3admin
AWS_SECRET_ACCESS_KEY=$(openssl rand -base64 30 | tr -d '/+=')
S3_BUCKET=backup
EOF
chmod 600 .env
```

Laut Dokumentation zu `weed mini` legen diese Variablen beim Start die ersten S3-Zugangsdaten an, `S3_BUCKET` erzeugt den Bucket, mehrere Namen trennen Sie mit Komma. Fehlen die Zugangsdaten, läuft das S3-Gateway im Modus „Allow All“: Jede Anfrage wird ohne Signatur akzeptiert. Das ist nur für Entwicklungsumgebungen gedacht.

> **Prüfen:** `cat .env` zeigt drei Zeilen, der Secret Key ist rund 40 Zeichen lang, `ls -l .env` zeigt `-rw-------`.

## Schritt 3: Compose-Datei

Das Image startet ohne eigenen Befehl bereits `weed mini` mit dem Datenverzeichnis `/data`. Die folgende Datei ergänzt drei Parameter: `-s3.externalUrl` für die Signaturprüfung hinter dem Proxy, `-master.telemetry=false`, weil der Master laut Quellcode sonst anonyme Clusterstatistiken an `telemetry.seaweedfs.com` meldet, und `-webdav=false`, wenn Sie WebDAV nicht brauchen.

Legen Sie `/opt/seaweedfs/compose.yaml` an:

Datei: `/opt/seaweedfs/compose.yaml`

```yaml
services:
  seaweedfs:
    image: chrislusf/seaweedfs:4.53
    container_name: seaweedfs
    restart: unless-stopped
    env_file: .env
    command:
      - mini
      - -dir=/data
      - -s3.externalUrl=https://{{domain}}
      - -master.telemetry=false
      - -webdav=false
    volumes:
      - ./data:/data
    ports:
      - "127.0.0.1:8333:8333"
```

Nur der S3-Port ist veröffentlicht, und zwar ausschließlich an 127.0.0.1. Master, Filer und Admin-Oberfläche bleiben im Container. Die Admin-Oberfläche auf Port 23646 hat laut Dokumentation zu `weed mini` standardmäßig keine Anmeldung. Wenn Sie sie nutzen wollen, setzen Sie `-admin.password` als zusätzlichen Parameter, veröffentlichen Sie den Port nur an 127.0.0.1 und greifen Sie per SSH-Tunnel zu.

> **Prüfen:** `docker compose config` läuft ohne Fehler und zeigt als Port `127.0.0.1:8333`.

## Schritt 4: Starten und Bucket prüfen

```bash
$ docker compose up -d
$ docker compose logs --tail 30
$ docker compose exec -T seaweedfs weed shell <<< "s3.bucket.list"
```

Mit `weed shell` verwalten Sie SeaweedFS direkt im Container, ohne S3-Client. Weitere Buckets legen Sie laut Dokumentation mit `s3.bucket.create -name NAME` an.

> **Prüfen:** `docker compose ps` zeigt den Container als `Up`, und `s3.bucket.list` nennt den Bucket `backup`.

## Schritt 5: Zugriff mit einem S3-Client

Prüfen Sie zuerst lokal auf dem Server, dass Anfragen ohne Signatur abgewiesen werden und mit Zugangsdaten funktionieren. Die AWS CLI läuft auch als Container. `set -a` exportiert die Variablen aus `.env`, sonst reicht `docker run -e` sie nicht weiter und die AWS CLI meldet `NoCredentials`:

```bash
$ set -a; source .env; set +a
$ curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8333/backup/
$ echo "Test" > /tmp/test.txt
```

```bash
docker run --rm --network host -v /tmp:/tmp \
  -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_DEFAULT_REGION=us-east-1 \
  amazon/aws-cli --endpoint-url http://127.0.0.1:8333 s3 cp /tmp/test.txt s3://backup/
docker run --rm --network host \
  -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_DEFAULT_REGION=us-east-1 \
  amazon/aws-cli --endpoint-url http://127.0.0.1:8333 s3 ls s3://backup/
```

Für Programme gilt dasselbe Muster: Endpunkt auf Ihre Domain, Pfad-Adressierung (path style) aktivieren, Region beliebig, etwa `us-east-1`. Viele Werkzeuge, die bisher MinIO nutzten, brauchen nur diese drei Angaben.

> **Prüfen:** Der anonyme `curl`-Aufruf liefert `403` (`AccessDenied`). Die AWS CLI listet `test.txt`.

## Schritt 6: Reverse Proxy mit TLS

S3-Clients signieren jede Anfrage mit dem Hostnamen. Steht ein Proxy davor, sieht SeaweedFS intern einen anderen Host. Deshalb setzen Sie in Schritt 3 `-s3.externalUrl` auf die öffentliche Adresse. Die SeaweedFS-Dokumentation zum Nginx-Proxy verlangt außerdem `proxy_request_buffering off`, weil gepufferte Uploads sonst mit falscher Signatur ankommen. Mit Caddy genügt:

```plaintext
{{domain}} {
  request_body {
    max_size 5GB
  }
  reverse_proxy 127.0.0.1:8333
}
```

Caddy puffert Anfragen standardmäßig nicht. Für virtuelle Bucket-Adressen wie `backup.{{domain}}` bräuchten Sie einen Wildcard-DNS-Eintrag und `-s3.domainName`. Die Pfad-Adressierung `{{domain}}/backup` ist einfacher und wird von gängigen Clients unterstützt.

> **Prüfen:** Der Befehl aus Schritt 5 mit `--endpoint-url https://{{domain}}` listet `test.txt` ohne Fehler `SignatureDoesNotMatch`.

## Schritt 7: Migration und Backup

Für den Umzug aus MinIO eignet sich rclone mit zwei S3-Remotes, eines für die alte MinIO-Instanz, eines für SeaweedFS. `rclone sync minio:bucket seaweed:bucket` kopiert alle Objekte, `rclone check` vergleicht anschließend Größen und Prüfsummen.

SeaweedFS speichert Objekte nicht als einzelne Dateien, sondern in Volume-Dateien mit Metadaten im Filer. Sichern Sie das Datenverzeichnis deshalb nur im gestoppten Zustand und immer vollständig:

```bash
$ cd /opt/seaweedfs
$ docker compose stop
$ sudo mkdir -p /opt/backup
$ sudo tar czf /opt/backup/seaweedfs-$(date +%F).tar.gz data .env compose.yaml
$ docker compose start
```

Zum Wiederherstellen stoppen Sie den Container, ersetzen den Ordner `data` durch den Inhalt des Archivs (`sudo tar xzf ARCHIV data`) und starten wieder.

Ein Objektspeicher ist ein gutes Backup-Ziel, aber kein Backup für sich. Kopieren Sie wichtige Buckets zusätzlich auf ein anderes System, etwa mit rclone auf ein zweites Ziel. Wie restic S3 als Ziel nutzt, zeigt die [3-2-1-Backup-Strategie mit restic](https://s-edv.com/anleitungen/3-2-1-backup-strategie-praktisch-umsetzen).

Für ein Update sichern Sie wie oben, tragen den neuen Tag in `compose.yaml` ein und starten mit `docker compose pull` und `docker compose up -d` neu. Prüfen Sie vorher auf Docker Hub, ob es den Tag als Standard-Image gibt: Nicht zu jedem GitHub-Release erscheint sofort ein Image ohne Zusatz, für 4.51 gab es zunächst nur die Variante `4.51_large_disk_foundationdb`, das Standard-Image folgte einen Tag später. Version 4.50 bringt laut Release Notes unter anderem einen schnelleren Filer-Start, prüft ACL-Felder in POST-Uploads gegen das Recht `PutObjectAcl` und lauscht beim Volume-Server zusätzlich auf localhost. Version 4.51 gibt laut Release Notes bei GET und HEAD keine gespeicherten Tags und internen Attribute mehr in den Antwort-Headern aus, beantwortet Zugriffe auf Löschmarker wie Amazon S3 und öffnet mit `-ip.bind` keinen zusätzlichen localhost-Listener mehr. Version 4.52 verlangt laut Release Notes Admin-Rechte, um die Lifecycle-Konfiguration eines Buckets zu setzen oder zu löschen, bricht bei konfiguriertem TLS für die interne gRPC-Kommunikation bei TLS-Fehlern ab, statt weiterzumachen, und prüft die Identität der Gegenstelle. Außerdem liegt mit `weed-vector` ein zusätzliches Programm im Image, das Image ist deutlich größer als bei 4.51. Die Updates von 4.48 über 4.50 und 4.51 auf 4.52 laufen mit dieser Compose-Datei ohne weitere Anpassung: `weed version` meldet danach die neue Version, vorher hochgeladene Dateien kommen mit identischer SHA-256-Prüfsumme zurück, neue Uploads funktionieren, anonymer Zugriff auf den Bucket bekommt `403` (`AccessDenied`), und ein falscher Secret Key scheitert mit `SignatureDoesNotMatch`. Ein wie oben gesichertes, gelöschtes und aus dem Archiv zurückgespieltes Datenverzeichnis enthält wieder alle Objekte aus der Zeit vor der Sicherung, bitgleich. Direkt nach dem Start können im Log Meldungen wie `raft.Server: Not current leader` stehen, bis sich die internen Dienste gefunden haben; sie verschwinden nach wenigen Sekunden. Version 4.53 ergänzt laut Release Notes unter anderem Block Public Access je Bucket (BlockPublicAcls, IgnorePublicAcls), Ordner-Uploads in Filer- und Admin-Oberfläche und eine einstellbare Upload-Grenze im Datei-Browser der Admin-Oberfläche; außerdem weist sie POST-Uploads mit Steuerzeichen in Kopfzeilenfeldern ab. Neue Parameter braucht die Compose-Datei nicht: Beim Update von 4.52 auf 4.53 kam die vorher hochgeladene Datei mit identischer SHA-256-Prüfsumme zurück, neue Uploads funktionierten, anonymer Zugriff bekam 403, ein falscher Secret Key scheiterte mit SignatureDoesNotMatch, und das vor dem Update gesicherte Datenverzeichnis brachte nach Löschen und Zurückspielen alle Objekte zurück, die Testdatei mit identischer SHA-256-Prüfsumme.

> **Prüfen:** `tar tzf` auf das Archiv listet Dateien unter `data/`. `rclone check` meldet nach der Migration `0 differences found`.

Grundlagen zum Betrieb finden Sie in [Docker Compose absichern: Secrets, Healthchecks, Non-Root](https://s-edv.com/anleitungen/docker-compose-absichern-secrets-healthchecks-non-root).

## Typische Fehler

**`SignatureDoesNotMatch` hinter dem Proxy**

`-s3.externalUrl` fehlt oder weicht von der Adresse ab, die der Client nutzt. Auch Pufferung im Proxy verursacht diesen Fehler.

**Bucket für alle beschreibbar**

Keine Zugangsdaten gesetzt, das Gateway läuft in „Allow All“. `.env` prüfen und Container neu erstellen.

**Admin-Oberfläche ohne Anmeldung erreichbar**

Port 23646 wurde veröffentlicht, ohne `-admin.password` zu setzen. Passwort ergänzen und Port nur an 127.0.0.1 binden.

**`Bind for 127.0.0.1:8333 failed: port is already allocated`**

Ein anderer Dienst, oft ein alter MinIO- oder S3-Container, belegt den Port. Anderen Host-Port wählen.

**`SignatureDoesNotMatch` schon lokal**

Der Secret Key im Client stimmt nicht mit `.env` überein. Wert prüfen; nach einer Änderung in `.env` den Container mit `docker compose up -d` neu erstellen.

**`NoCredentials` bei der AWS CLI im Container**

Die Variablen wurden mit `source .env` nur gesetzt, nicht exportiert. `set -a; source .env; set +a` nutzen.

**Client findet den Bucket nicht**

Der Client nutzt virtuelle Hostnamen. Pfad-Adressierung aktivieren (`force_path_style`, `--s3-force-path-style` oder ähnlich).

**Neuer MinIO-Tag lässt sich nicht ziehen oder bleibt alt**

Die Community-Images erhalten keine Updates mehr. Nicht als Fehler behandeln, sondern migrieren.

## Häufige Fragen

### Ist weed mini für den Produktivbetrieb gedacht?

Laut Dokumentation ja, für Einzelknoten und kleine Cluster. Hochverfügbarkeit mit mehreren Mastern bietet es nicht. Dafür empfiehlt das Projekt getrennte Komponenten. Das Projekt weist außerdem darauf hin, dass sich Standardwerte von `weed mini` zwischen Versionen ändern können. Deshalb ist der Tag hier fest gesetzt.

### Warum nicht Garage oder RustFS?

Beide sind gepflegte Alternativen. Garage ist auf verteilte Knoten an mehreren Standorten ausgelegt, RustFS bildet MinIO nach. Einen Vergleich bietet die Anleitung [S3-Speicher nach dem MinIO-Aus: Garage und RustFS](https://s-edv.com/anleitungen/s3-speicher-selbst-hosten-garage-rustfs-minio-alternative). SeaweedFS eignet sich besonders bei vielen kleinen Dateien und bringt WebDAV und einen Filer mit.

### Kann ich mehrere Benutzer mit eigenen Buckets anlegen?

Ja. Laut Dokumentation sind Rechte je Bucket möglich, etwa `Read:mybucket` und `Write:mybucket`, über die Admin-Oberfläche oder eine JSON-Datei mit `-s3.config`.

### Gibt es eine Weboberfläche wie bei MinIO?

Ja, die Admin UI auf Port 23646 für Benutzer, Zugangsschlüssel und Systemstatus, dazu die Filer-Oberfläche auf Port 8888 zum Durchsuchen der Dateien.

## Fazit

MinIO Community ist eingestellt, neue Installationen sollten auf eine gepflegte Alternative setzen. SeaweedFS liefert mit `weed mini` einen vollständigen S3-Speicher in einem Container. Entscheidend sind gesetzte Zugangsdaten, ein Port nur an 127.0.0.1, der Proxy mit passender `-s3.externalUrl`, ein fester Versions-Tag und ein Backup, das nicht im selben Speicher liegt.

## Weiterführende Anleitungen und Quellen

- [S3-Speicher nach dem MinIO-Aus: Garage und RustFS](https://s-edv.com/anleitungen/s3-speicher-selbst-hosten-garage-rustfs-minio-alternative)
- [Caddy als Reverse Proxy einrichten](https://s-edv.com/anleitungen/caddy-reverse-proxy-automatisches-https-anleitung)
- [3-2-1-Backup-Strategie mit restic umsetzen](https://s-edv.com/anleitungen/3-2-1-backup-strategie-praktisch-umsetzen)
- [MinIO-Repository (archiviert)](https://github.com/minio/minio)
- [SeaweedFS Release 4.53](https://github.com/seaweedfs/seaweedfs/releases/tag/4.53)
- [SeaweedFS Wiki: Quick Start with weed mini](https://github.com/seaweedfs/seaweedfs/wiki/Quick-Start-with-weed-mini)
- [SeaweedFS Wiki: S3 Credentials](https://github.com/seaweedfs/seaweedfs/wiki/S3-Credentials)
- [SeaweedFS Wiki: S3 Nginx Proxy](https://github.com/seaweedfs/seaweedfs/wiki/S3-Nginx-Proxy)
