Zum Inhalt springen
Serverküche
Suche

Die Suche wird geladen … (nur in der veröffentlichten Seite verfügbar).

Anwendungen Schwierigkeit: Fortgeschritten

Pingvin Share X: große Dateien teilen ohne WeTransfer

Dateien selbst hosten statt hochladen: Pingvin Share X 2.0 hinter Traefik, mit Ablaufdatum, Passwort und Abrufzähler – plus den Einstellungen, die zählen.

· 10 Min. Lesezeit ·Dauer: ca. 45 Minuten
Inhaltsverzeichnis

Ein 800-MB-Video an eine Kollegin schicken – und dafür einen fremden Dienst benutzen, der die Datei für dich behält, so lange er mag. Es geht auch anders: ein Upload-Feld auf deinem eigenen Server, ein Link mit Ablaufdatum, danach ist die Datei weg.

Was bauen wir?

Wir betreiben Pingvin Share X 2.0.0 hinter Traefik. Du lädst Dateien hoch, bekommst einen kurzen Link, und die Freigabe kann ablaufen, ein Passwort verlangen und nach einer festgelegten Zahl von Abrufen verschwinden. Wer den Link bekommt, braucht kein Konto und keine App.

Genauso wichtig ist der zweite Teil: Ein Upload-Dienst im offenen Netz ist eine Einladung, wenn er falsch konfiguriert ist. Wir schalten deshalb die offene Registrierung ab, begrenzen die Dateigröße und schauen uns an, wie die Daten tatsächlich auf der Platte liegen.

Warum das X im Namen steht

Das ursprüngliche Pingvin Share von stonith404 ist seit Juni 2025 archiviert – der Entwickler konzentriert sich auf sein anderes Projekt und empfiehlt im eigenen README den Fork Pingvin Share X als gepflegte Fortsetzung. Genau den nehmen wir, in der Version 2.0.0 vom 3. Oktober 2026. Findest du im Netz eine Anleitung mit stonith404/pingvin-share, setzt du unwartete Software auf – für einen Dienst, der öffentlich Uploads annimmt, ist das keine gute Idee.

Voraussetzungen

  • Traefik als Reverse Proxy mit funktionierendem Let’s-Encrypt-Resolver und einer Domain, die auf den Server zeigt
  • Genug Plattenplatz für das, was du teilen willst – die Dateien liegen unkomprimiert auf dem Server, bis die Freigabe abläuft
  • Ein aufgeräumtes Verständnis davon, wem du Links schickst; mehr dazu in Schritt 3
🍳 Empfehlung Anzeige

VPS 1000 G12.5

4 vCore · 8 GB RAM · 128 GB SSD

ab 14,50 €/Monat

Pingvin Share X ist genügsam – entscheidend ist der Plattenplatz, nicht die CPU.

Zu netcup →

💶 1 Monat gratis:

Einmal einlösbar, gilt für VPS 1000 G12.5. Im Warenkorb einlösen →

💶 5,95 € Gutschein für netcup-Neukunden: immer gültig · nicht für Domains und VPS Lite

Alle netcup-Gutscheine →

Schritt für Schritt

Schritt 1: Den Stack anlegen

Terminal
mkdir -p /opt/pingvin/data/images && cd /opt/pingvin

Die Unterordner legen wir gleich mit an, weil Pingvin sonst beim ersten Start ins Leere greift.

YAML
# /opt/pingvin/compose.yaml
services:
  pingvin:
    image: ghcr.io/smp46/pingvin-share-x:v2.0.0
    container_name: pingvin
    restart: unless-stopped
    environment:
      TRUST_PROXY: "true"
    volumes:
      - ./data:/opt/app/backend/data:rw
      - ./data/images:/opt/app/frontend/public/img:rw
    networks: [proxy]
    labels:
      - traefik.enable=true
      - traefik.http.routers.pingvin.rule=Host(`DEINE_DOMAIN`)
      - traefik.http.routers.pingvin.entrypoints=websecure
      - traefik.http.routers.pingvin.tls.certresolver=le
      - traefik.http.services.pingvin.loadbalancer.server.port=3000

networks:
  proxy:
    external: true

TRUST_PROXY: "true" ist der Eintrag, den man leicht übersieht: Ohne ihn protokolliert Pingvin jeden Zugriff mit der IP von Traefik statt der des Besuchers. Steht kein Proxy davor, muss der Wert false bleiben – sonst darf jeder Client seine Quell-IP selbst behaupten.

Der Image-Tag ist bewusst festgenagelt. Es gibt auch einen :beta-Kanal des Projekts – für einen Dienst, der fremde Uploads annimmt, ist die stabile Version die richtige Wahl.

Terminal
docker compose up -d
docker compose ps
Ausgabe
NAME      STATUS
pingvin   Up 25 seconds (healthy)

Das (healthy) kommt vom mitgelieferten Healthcheck – der Container meldet sich also nicht nur als gestartet, sondern antwortet auch. Ein Blick in die Logs bestätigt den sauberen Start:

Terminal
docker compose logs --tail 1
Ausgabe
LOG [NestApplication] Nest application successfully started

Beim ersten Start legt Pingvin vorher die SQLite-Datenbank an und spielt gut 40 Migrationen ein; das dauert ein paar Sekunden. Optional kann Pingvin hochgeladene Dateien von einem ClamAV-Container prüfen lassen. Für ein privates Setup, bei dem nur du hochlädst, ist das verzichtbar; sobald Fremde bei dir ablegen dürfen (siehe Reverse Shares weiter unten), lohnt es sich.

Prüf von außen, dass die Kette steht:

Terminal
curl -s -o /dev/null -w "%{http_code}\n" https://DEINE_DOMAIN/
Ausgabe
200

Schritt 2: Das erste Konto anlegen – und die Tür danach zumachen

Ruf https://DEINE_DOMAIN/auth/signUp auf. Der erste registrierte Benutzer wird automatisch Administrator – es gibt kein Standardpasswort, das man vergessen könnte zu ändern.

Jetzt sofort weiterlesen

Ab Werk ist die Registrierung offen. Zwischen deinem eigenen Signup und dem nächsten Schritt kann sich jeder ein Konto auf deinem Server anlegen und Speicherplatz belegen. Mach den nächsten Schritt direkt im Anschluss, nicht morgen.

Schritt 3: Die Einstellungen, die wirklich zählen

Unter Configuration → General trägst du zuerst die App URL ein – also https://DEINE_DOMAIN. Das ist keine Kosmetik: Aus diesem Wert baut Pingvin die Links, die du verschickst. Steht dort der Standard http://localhost:3000, bekommen deine Empfänger Links, die bei ihnen ins Nichts zeigen.

Der wichtigere Teil steht unter Configuration → Security & Access:

Die Einstellungsseite „Security & Access“ von Pingvin Share X mit eingeschalteten Secure cookies und abgeschalteter Registrierung.
Secure cookies an, Allow registration aus – die beiden Schalter, die zählen

  • Allow registration – aus. Du bist der einzige, der Freigaben anlegt. Danach leitet /auth/signUp nur noch weiter, und auch die API lehnt neue Konten ab („Registration is not allowed“).
  • Secure cookies – an. Damit setzt Pingvin das Secure-Flag auf seinen Cookies, sie werden also nie über unverschlüsseltes HTTP übertragen. Das geht nur, weil Traefik davor sauberes HTTPS liefert.
  • Allow unauthenticated shares – ab Werk aus, und das bleibt es. Sonst kann jeder Besucher Dateien auf deinem Server ablegen.

Jede Seite hat ihren eigenen Save-Knopf, also vor dem Wechseln speichern. Unter Configuration → Share stehen dann noch zwei Werte, die du bewusst entscheiden solltest:

  • Default share ID length – Standard 8. Pingvin schreibt selbst dazu: „A value below 8 is not considered secure." Der Link ist das Passwort, solange du keines setzt; kürzere IDs lassen sich durchprobieren.
  • Max size – Standard 1 GB. Setz das auf einen Wert, den dein Plattenplatz verträgt, und bedenke, dass mehrere Freigaben gleichzeitig offen sein können.

Interessant ist außerdem die Chunk size (Standard 10 MB): Pingvin lädt große Dateien in Stücken hoch. Deshalb funktionieren Multi-Gigabyte-Uploads auch durch einen Reverse Proxy hindurch, ohne dass du an Timeouts oder Größenlimits schrauben musst.

Schritt 4: Eine Freigabe mit Ablauf, Passwort und Abruflimit

Auf Upload ziehst du eine Datei ins Feld – danach öffnet sich der Dialog:

Der Dialog „Create Share" mit generierter Link-ID, sieben Tagen Ablauf, gesetztem Passwort und einem Abruflimit von fünf.
Drei unabhängige Bremsen: Ablaufdatum, Passwort und maximale Abrufe

Die Link-ID wird zufällig erzeugt; über Generate bekommst du eine neue, und du kannst sie auch durch etwas Sprechendes ersetzen – nur eben nicht durch etwas Ratbares. Darunter stehen drei Begrenzungen, die unabhängig voneinander wirken:

  • Expiration – nach Ablauf ist die Freigabe weg, standardmäßig nach sieben Tagen. „Permanent share" gibt es auch; benutz es sparsam, sonst füllt sich die Platte mit Dingen, an die sich niemand mehr erinnert.
  • Password protection – ein zusätzliches Passwort. Verschick es über einen anderen Kanal als den Link, sonst ist es Theater.
  • Maximum views – nach der eingestellten Zahl von Abrufen schließt sich die Freigabe. Praktisch für „genau einmal, genau diese Person".

Ein Klick auf Share legt die Freigabe an und zeigt den fertigen Link mit dem Ablaufdatum.

Schritt 5: Die Empfängersicht – und die Gegenprobe

So sieht es aus, wenn jemand den Link ohne Passwort öffnet:

Die Empfängerseite von Pingvin Share X mit dem Dialog „Password required" über der ausgegrauten Dateiliste.
Ohne Passwort bleibt die Dateiliste verdeckt

Dass das nicht nur die Oberfläche ist, zeigt die API. Frag die Freigabe direkt ab, ohne Passwort:

Terminal
curl -s https://DEINE_DOMAIN/api/shares/DEINE_SHARE_ID
Ausgabe
{"message":"This share is password protected","error":"share_password_required","statusCode":403}

Kein Dateiname, keine Größe, keine Liste – der Server gibt vor der Passworteingabe nichts preis. Nach der Eingabe erscheint der Inhalt:

Die Empfängerseite mit einer Datei namens menue-oktober.txt und 177 Byte Größe, dazu Schaltflächen zum Kopieren des Links, zur Vorschau und zum Herunterladen.
Nach dem Passwort: Link kopieren, Vorschau oder herunterladen

Einzelne Dateien lassen sich direkt herunterladen, mehrere packt Pingvin auf Wunsch in ein ZIP.

Die Dateien liegen im Klartext

Das Passwort schützt den Link, nicht die Ablage. Auf dem Server liegen die Dateien unverschlüsselt unter data/uploads/shares/<share-id>/<uuid>, eine Textdatei lässt sich dort mit cat lesen. Wer Zugriff auf den Server oder dein Backup hat, liest alles mit. Für wirklich vertrauliche Inhalte verschlüsselst du die Datei vorher selbst, etwa mit einem passwortgeschützten Archiv.

Schritt 6: Reverse Shares – wenn andere dir etwas schicken sollen

Der Weg zurück ist der eigentlich unterschätzte Teil. Unter Reverse shares in deinem Konto erzeugst du mit einem Klick auf Create einen Upload-Link der Form https://DEINE_DOMAIN/upload/EINE_ID. Den schickst du jemandem, die Person lädt hoch – ohne Konto, ohne Anmeldung – und die entstehende Freigabe landet bei dir.

Der Dialog hat dieselbe Sorgfalt verdient wie die normale Freigabe. Neben dem Ablaufdatum gibt es Max share size, Max uses („The maximum number of times this URL can be used.") sowie Simple mode und Public access. Max uses steht ab Werk auf 1 – lass es dabei, wenn du genau eine Lieferung erwartest. Jeder höhere Wert (bis 1000) heißt: Bis dahin kann jeder, an den der Link weitergereicht wird, auf deinem Plattenplatz ablegen. Public access ist ab Werk an; dann kann jeder mit dem Link der entstandenen Freigabe sie auch ansehen. Schaltest du es ab, sehen sie nur du und die Person, die hochgeladen hat.

Für die Link-Länge gilt hier dasselbe wie oben: Pingvin benutzt die eingestellte Default share ID length ausdrücklich auch für Reverse Shares. Und weil jetzt fremde Dateien auf deinem Server landen, ist das der Moment, an dem sich die ClamAV-Anbindung tatsächlich lohnt.

Wenn es nicht funktioniert

Die verschickten Links zeigen auf http://localhost:3000. Die App URL unter Configuration → General steht noch auf dem Standardwert. Pingvin kennt seine öffentliche Adresse nicht von allein – der Reverse Proxy sagt sie ihm nicht. Trag https://DEINE_DOMAIN ein und speichere; bereits verschickte Links musst du neu erzeugen.

In den Zugriffsprotokollen steht bei jedem Besucher dieselbe IP. Das ist die Adresse aus dem Docker-Proxy-Netz, und es fehlt TRUST_PROXY: "true" in der Compose-Datei. Erst damit wertet Pingvin die X-Forwarded-For-Header aus. Setz den Wert aber wirklich nur, wenn ein Proxy davorsteht – ohne einen kann sich sonst jeder Client eine beliebige Quell-IP ausdenken.

Ein großer Upload bricht mittendrin ab. Prüf zuerst die Max size unter Configuration → Share; ab Werk sind das 1 GB, und die Oberfläche sagt es dir schon vor dem Hochladen („Maximum total upload size: 1 GB."). Bleibt es dabei, ist die Chunk size der nächste Hebel: Kleinere Stücke als die voreingestellten 10 MB sind bei wackligen Verbindungen zuverlässiger, größere bei stabilen schneller.

Fremde legen Konten auf deiner Instanz an. Dann steht Allow registration noch auf an – der Auslieferungszustand. Schalte es unter Configuration → Security & Access ab und lösch die fremden Konten unter Administration → User management. Zur Kontrolle: curl -s -o /dev/null -w "%{http_code}\n" https://DEINE_DOMAIN/auth/signUp muss danach 307 liefern und nicht 200.

Nach dem Anmelden wirst du sofort wieder ausgeloggt. Meist ist Secure cookies eingeschaltet, während der Aufruf über http:// läuft – dann verwirft der Browser das Cookie. Ruf die Seite über HTTPS auf. Wenn du Pingvin bewusst ohne TLS betreibst, muss der Schalter aus bleiben; die Einstellung sagt das selbst: „If enabled, the site will not function when accessed over HTTP."

Dein Problem ist nicht dabei? Alle Fehlermeldungen durchsuchen →

Wartung & Backups

Updates sind ein Tag-Wechsel. Schau vorher in die Release Notes, weil der Fork aktiv entwickelt wird und in kurzen Abständen Versionen erscheinen:

Terminal
cd /opt/pingvin
cp -a data data-backup-$(date +%F)
sed -i 's/pingvin-share-x:v2.0.0/pingvin-share-x:vNEUE_VERSION/' compose.yaml
docker compose pull && docker compose up -d
docker compose logs --tail 5

Die Kopie vorher ist wichtig, weil beim Start Datenbankmigrationen laufen. Ein Update pro Quartal reicht in der Praxis, sofern nichts Sicherheitsrelevantes gemeldet wird.

Sichern musst du zwei Dinge, und beide liegen unter data/:

Ausgabe
/opt/pingvin/data/pingvin-share.db     # Konten, Freigaben, Einstellungen (SQLite)
/opt/pingvin/data/uploads/             # die eigentlichen Dateien

Hier lohnt sich eine Überlegung, die man bei anderen Diensten nicht anstellt: Willst du die Uploads überhaupt sichern? Der Sinn der Sache ist, dass die Dateien nach dem Ablaufdatum verschwinden. Ein Backup, das sie festhält, macht genau das rückgängig – und weil sie unverschlüsselt liegen, wandern sie im Klartext in dein Backup-Ziel. Für die meisten reicht es, die Datenbank zu sichern und die Uploads bewusst wegzulassen. Wenn du beides mitnimmst, gehört das Backup verschlüsselt, so wie es Restic ohnehin macht.

Aufräumen passiert nicht von allein, wenn du „Permanent share" benutzt. Abgelaufene Freigaben räumt Pingvin selbst weg; dauerhafte bleiben liegen, bis du sie löschst. Ein Blick alle paar Monate auf du -sh /opt/pingvin/data/uploads sagt dir, ob sich etwas angesammelt hat.

Realistischer Aufwand: Nach dem Aufsetzen fast nichts – ein Update pro Quartal und der gelegentliche Blick auf den Plattenplatz. Der einzige Punkt, der Disziplin braucht, ist der Umgang mit den Links: Jeder verschickte Link ist ein Zugang, und anders als ein Passwort lässt er sich nicht zurückrufen. Dafür gibt es das Ablaufdatum.

Noch privater

Wenn Pingvin nur für dich und ein paar Bekannte da ist, muss es nicht im offenen Netz stehen. Hinter einer IP-Beschränkung oder komplett im VPN ist der Dienst von außen unsichtbar – das Muster dafür steht in Dienste nur im VPN erreichbar machen. Für Freigaben an Außenstehende brauchst du dann allerdings weiterhin den öffentlichen Weg.

Feedback per E-Mail: feedback@serverkueche.de

Das könnte dir auch schmecken