Zum Inhalt

PrivateBin per Docker sicher im Heimnetz betreiben

Veröffentlicht am 22. August 2026 · Geschätzte Lesezeit: 5 Minuten

PrivateBin teilt Text und kleine Dateien über zeitlich begrenzte Links. Die Verschlüsselung und Entschlüsselung findet im Browser statt; der Server speichert beim üblichen Dateisystem-Backend nur verschlüsselte Inhalte. Die Installation dauert ungefähr 15 Minuten. Für eine öffentliche Nutzung ist zusätzlich HTTPS zwingend erforderlich.

Voraussetzungen

  • Ein Linux-Server mit Docker und Docker Compose
  • Der Port 8080 ist im Heimnetz frei
  • sudo für das Setzen der Ordnerrechte
  • Eine feste IP-Adresse für den Docker-Server
  • Für externen Zugriff eine Domain und ein HTTPS-Reverse-Proxy

1. Arbeitsordner vorbereiten

Führe diesen Befehl auf dem Docker-Server aus. Er erstellt Projekt- und Datenordner und wechselt in den Projektordner:

mkdir -p ~/docker/privatebin/data && cd ~/docker/privatebin

Das offizielle Image erwartet für den eingebundenen Datenordner die Benutzer-ID 65534 und die Gruppen-ID 82. Setze deshalb die passenden Besitzrechte:

sudo chown -R 65534:82 data

Docker mit User-Namespace-Zuordnung

Verwendet dein Docker-Dienst userns-remap, müssen die zugeordneten Unter-UIDs und Unter-GIDs berücksichtigt werden. Prüfe in diesem Sonderfall die offizielle Image- Dokumentation, statt die Zahlen unverändert zu übernehmen.

2. Compose-Datei anlegen

Lege im Ordner ~/docker/privatebin eine Datei compose.yaml mit folgendem Inhalt an:

services:
  privatebin:
    image: privatebin/nginx-fpm-alpine:stable
    container_name: privatebin
    restart: unless-stopped
    read_only: true
    environment:
      TZ: Europe/Berlin
      PHP_TZ: Europe/Berlin
    ports:
      - "8080:8080"
    volumes:
      - ./data:/srv/data
    tmpfs:
      - /tmp:nodev,noexec,mode=1777
      - /run:nodev,exec,mode=1777
      - /var/lib/nginx/tmp:nodev,noexec

./data bewahrt Pastes und notwendige Dienstdaten dauerhaft auf. Das Root-Dateisystem des Containers ist schreibgeschützt; nur Daten- und temporäre Verzeichnisse bleiben beschreibbar. Die temporären Inhalte verschwinden bei einem Container-Neustart.

3. Konfiguration prüfen und starten

Prüfe im Projektordner zuerst die Compose-Syntax:

docker compose config --quiet

Starte PrivateBin im Hintergrund:

docker compose up -d

Kontrolliere den Zustand:

docker compose ps

Bei einem Fehler zeigen die letzten Protokollzeilen weitere Hinweise:

docker compose logs --tail=100 privatebin

4. Erste verschlüsselte Nachricht testen

Öffne im Heimnetz http://<server-ip>:8080. Ersetze <server-ip> durch die feste IP-Adresse des Docker-Servers. Schreibe einen harmlosen Testsatz, wähle eine kurze Ablaufzeit und erstelle den Paste. Öffne den erzeugten Link in einem privaten Browserfenster.

Aktiviere für einen zweiten Test Nach dem Lesen löschen. Nach dem ersten Abruf darf der Inhalt über denselben Link nicht erneut erscheinen.

Schlüssel steckt im geteilten Link

Der Entschlüsselungsschlüssel befindet sich im Fragment des erzeugten Links. Wer den vollständigen Link erhält, kann den Inhalt lesen. Teile Link und zusätzliches Passwort bei besonders sensiblen Daten über getrennte Kommunikationswege.

5. HTTPS für externen Zugriff verwenden

Veröffentliche Port 8080 nicht direkt über eine Routerfreigabe. Das offizielle Image stellt nur HTTP bereit. Für externen Zugriff muss ein Reverse-Proxy mit gültigem HTTPS-Zertifikat davor liegen; alternativ verwendest du ein privates VPN.

HTTP schützt den Browser-Code nicht

Die Verschlüsselung im Browser ersetzt HTTPS nicht. Ohne HTTPS könnte ein Angreifer auf dem Übertragungsweg den ausgelieferten JavaScript-Code verändern und dadurch Klartext oder Schlüssel abgreifen.

Beschränke den Reverse-Proxy auf die benötigte Domain, aktiviere automatische Zertifikats- erneuerung und halte Proxy sowie PrivateBin aktuell. Trage niemals geheime Werte in die Compose-Datei oder in öffentlich sichtbare Proxy-Beispiele ein.

6. Gespeicherte Daten kontrollieren

Das Image enthält ein Verwaltungswerkzeug. Dieser Befehl zeigt Statistiken des Dateisystem- Backends, ohne Paste-Inhalte zu entschlüsseln:

docker compose exec privatebin administration --statistics

Abgelaufene Einträge kannst du bei Bedarf manuell bereinigen:

docker compose exec privatebin administration --purge

PrivateBin entfernt abgelaufene Pastes normalerweise bei Zugriffen nach seiner Konfiguration. Der manuelle Aufruf ist hilfreich, wenn die Instanz nur selten verwendet wird.

7. Backup und Rückweg

Stoppe PrivateBin kurz, damit sich während der Sicherung keine Dateien ändern:

docker compose stop privatebin

Erstelle ein datiertes Archiv aus Datenordner und Compose-Datei:

tar czf "privatebin-backup-$(date +%F).tar.gz" data compose.yaml

Starte den Dienst danach wieder:

docker compose start privatebin

Prüfe, ob das Archiv lesbar ist:

tar tzf "privatebin-backup-$(date +%F).tar.gz" | head

Bewahre das Archiv verschlüsselt auf einem zweiten System auf. Zum Zurückkehren stoppst du den Container, entpackst das Archiv in ~/docker/privatebin, setzt bei Bedarf erneut die Rechte 65534:82 für data und startest den Stack.

8. Aktualisieren

Lege zuerst das Backup aus Schritt 7 an. Lade dann das aktuelle stabile Image:

docker compose pull

Erstelle den Container mit unveränderten Daten neu:

docker compose up -d

Teste anschließend einen neuen Paste mit kurzer Ablaufzeit. Das Volume ./data darf beim Update nicht gelöscht oder durch einen leeren Pfad ersetzt werden.

9. Typische Fehler

  • Der Container meldet fehlende Schreibrechte: Setze für data erneut den Besitzer mit sudo chown -R 65534:82 data.
  • Port 8080 ist belegt: Prüfe mit sudo ss -ltnp | grep ':8080' oder ändere nur die linke Zahl, zum Beispiel auf 8081:8080.
  • Nach dem Neustart fehlen Pastes: Kontrolliere, ob ./data:/srv/data weiterhin eingebunden ist und du den Stack im richtigen Ordner gestartet hast.
  • Der Reverse-Proxy zeigt eine unsichere Seite: Prüfe Zertifikat, Domain und Weiterleitungsziel; verwende öffentlich niemals die HTTP-Adresse des Containers.
  • Ablaufzeiten wirken falsch: Ändere PHP_TZ nicht nachträglich ohne Grund, weil dies die berechneten Ablaufzeitpunkte beeinflussen kann.

10. Quellen und Videos

Fertig

PrivateBin läuft jetzt mit schreibgeschütztem Container und dauerhaftem Datenordner im Heimnetz. Erstelle über http://<server-ip>:8080 einen Paste mit kurzer Ablaufzeit, öffne ihn in einem privaten Fenster und prüfe anschließend, ob er nach der gewählten Frist oder nach dem ersten Lesen nicht mehr verfügbar ist.