copyparty installieren: eigener Dateiserver mit Docker und Caddy
copyparty auf Debian 13 mit Docker und Caddy installieren: Benutzer, Rechte, Upload, Freigabelinks, WebDAV, Backup und Update, Schritt für Schritt.

Inhalt
copyparty 1.20.26Caddy 2.11Docker 29.9Debian 13copyparty ist ein Dateiserver, den du selbst betreibst. Du öffnest ihn im Browser, ziehst Dateien per Drag-and-drop hinein und lädst sie später wieder herunter. Dazu kommen Benutzer mit eigenen Rechten, Freigabelinks für Freunde und ein Briefkasten, in den Fremde Dateien werfen dürfen, ohne etwas zu sehen.
In dieser Anleitung installiere ich copyparty auf einem Debian-13-Server mit Docker und sichere es mit HTTPS über Caddy ab. Danach gehen wir einige Funktion einzeln durch: Konfiguration, Anmeldung, Upload, Ansichten, Freigaben, Rechte, WebDAV, Backup und Update.
Was ist copyparty?
copyparty ist ein Programm in Python, das einen Ordner deines Servers im Browser verfügbar macht. Du brauchst keine Datenbank und keine weitere Software. Alles steckt in einem Container.
Das kann copyparty:
- Dateien im Browser hochladen, herunterladen, verschieben, umbenennen und löschen.
- Ordner als ZIP herunterladen.
- Vorschaubilder für Fotos und Videos anzeigen und Musik direkt abspielen.
- Benutzer anlegen und pro Ordner festlegen, wer lesen, schreiben oder löschen darf.
- Links erzeugen, die du per Nachricht verschickst, mit Passwort und Ablaufdatum.
- Ordner einrichten, in die jeder hochladen, aber niemand hineinsehen darf.
- Sich über WebDAV als Laufwerk oder per rclone einbinden lassen. FTP und SMB beherrscht copyparty ebenfalls.
Voraussetzungen
- Ein Server mit einem Docker kompatiblem Betriebssystem. Ich nutze einen kleinen VPS von Hetzner mit Debian 13. copyparty braucht wenig Leistung, wichtig ist nur genug Speicherplatz für deine Dateien.
- Ein Benutzer mit
sudo-Rechten. - Eine Domain, zum Beispiel
{{domain}}. Sie muss mit einem A-Record auf die IP-Adresse deines Servers zeigen. - Offene Ports 80 und 443, damit Caddy sein Zertifikat holen kann.
Docker installieren
Verbinde dich per SSH mit dem Server und installiere Docker mit dem offiziellen Skript:
curl -fsSL https://get.docker.com | sudo shPrüfe danach die Installation:
docker --versionWenn curl fehlt, installierst du es vorher mit sudo apt install -y curl.
Ordner anlegen
Lege ein Verzeichnis für copyparty an und darin die Ordner cfg und daten:
mkdir -p ~/copyparty/cfg ~/copyparty/daten/gemeinsam
cd ~/copypartycfgenthält die Konfiguration und alles, was copyparty sich merkt, zum Beispiel Freigaben und Anmeldungen.datenenthält deine Dateien. Darin liegt zuerst nur der Ordnergemeinsam.
Der Container läuft später mit der Benutzer-ID 1000. Dir gehören die Ordner nur dann, wenn dein Benutzer ebenfalls die ID 1000 hat. Prüfe das:
id -uSteht dort 1000, passt alles. Steht dort eine andere Zahl, ersetzt du unten in der compose.yaml die Zeile user: "1000:1000" durch deine Zahl, zum Beispiel user: "1001:1001".
Die compose.yaml
Erstelle die Datei:
nano compose.yamlservices:
copyparty:
image: copyparty/ac:latest
container_name: copyparty
restart: unless-stopped
user: "1000:1000"
volumes:
- ./cfg:/cfg
- ./daten:/w
environment:
PYTHONUNBUFFERED: 1
stop_grace_period: 15s
caddy:
image: caddy:2
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:Was die Zeilen tun:
copyparty/acist das Image mit allen Hilfsprogrammen, zum Beispiel für Vorschaubilder../cfg:/cfgverbindet deinen Konfigurationsordner mit dem Ordner/cfgim Container. Hänge hier kein:roan. copyparty muss dort schreiben dürfen, sonst startet es später mit Freigaben nicht../daten:/wverbindet deine Dateien mit/wim Container. Im Container heißen sie also/w/....PYTHONUNBUFFEREDsorgt dafür, dass Logmeldungen sofort erscheinen.stop_grace_periodgibt copyparty beim Beenden 15 Sekunden Zeit, laufende Arbeit abzuschließen.- copyparty veröffentlicht keinen eigenen Port. Du erreichst es nur über Caddy.
Die Caddyfile
nano Caddyfile{{domain}} {
reverse_proxy copyparty:3923
}Caddy holt beim ersten Start automatisch ein Zertifikat von Let’s Encrypt und leitet alle Anfragen an copyparty weiter. Port 3923 ist der Port, auf dem copyparty im Container lauscht.
Die erste Konfiguration
copyparty liest seine Einstellungen aus einer Datei. Erstelle sie im Ordner cfg:
nano cfg/copyparty.conf[global]
e2dsa
e2ts
rproxy: 1
xff-hdr: x-forwarded-for
xff-src: 172.16.0.0/12
[accounts]
admin: AendereMich-Admin1
[/gemeinsam]
/w/gemeinsam
accs:
A: adminErsetze AendereMich-Admin1 durch ein eigenes, langes Passwort. Die Datei besteht aus drei Teilen:
[global]gilt für den ganzen Server.e2dsasorgt dafür, dass copyparty alle Dateien erfasst und die Suche funktioniert,e2tsliest zusätzlich Musik- und Videoinformationen. Die drei Zeilen darunter sorgen dafür, dass copyparty hinter Caddy die echte IP-Adresse deiner Besucher sieht und nicht die von Caddy.172.16.0.0/12ist der Adressbereich, aus dem Docker-Container sich untereinander ansprechen.[accounts]legt Benutzer an, in der Formname: passwort. Vor dem Doppelpunkt steht der Benutzername, dahinter das Passwort. Hier gibt es erst einen Benutzer.[/gemeinsam]erzeugt ein Volume. Die Überschrift in eckigen Klammern ist die Adresse im Browser,/gemeinsam. Darunter steht der Ordner im Container,/w/gemeinsam. Der Blockaccsverteilt Rechte: Der BuchstabeAsteht für alles (lesen, schreiben, verschieben, löschen, Verwaltung), undadminist der Benutzer, der es bekommt.
Wer in keinem Block vorkommt, hat keinen Zugriff. Dein Server ist damit zunächst für alle außer admin gesperrt.
copyparty starten
Starte beide Container:
sudo docker compose up -dPrüfe, ob beide laufen:
sudo docker compose psIn der Spalte STATUS muss bei caddy und copyparty ein Up stehen. Ob Caddy sein Zertifikat bekommen hat, siehst du hier:
sudo docker compose logs caddy | grep "certificate obtained"Im Log von copyparty erscheint die Warnung using default TLS certificate; https will be insecure. Du kannst sie ignorieren: Die HTTPS-Verschlüsselung übernimmt Caddy, copyparty selbst spricht nur intern mit Caddy.
sudo docker compose logs copypartyWenn copyparty stattdessen immer wieder neu startet, steht der Grund im Log. Ein Tippfehler in der copyparty.conf reicht dafür aus.
Anmelden
Öffne https://{{domain}} im Browser. Du siehst eine schlichte Seite mit dem Text “howdy stranger” und einem Feld password. Gib dort das Passwort aus der Konfiguration ein und klicke auf login. Du brauchst nur das Passwort, einen Benutzernamen fragt copyparty hier nicht ab, denn jedes Passwort gehört zu genau einem Benutzer.
Nach der Anmeldung steht oben “welcome back, admin” und darunter der Verwaltungsbereich. Klicke bei “you can browse” auf /gemeinsam/. Du landest in deinem ersten Ordner. Er ist noch leer.
Die erste Datei hochladen
Oben in der Symbolleiste klickst du auf die Rakete. Sie öffnet den Uploader up2k.
Ziehe eine Datei auf das große Feld “UPLOAD” oder klicke darauf, um sie auszuwählen. copyparty fragt noch einmal nach, wohin die Datei soll:

Klicke auf OK. Danach läuft der Upload. Im Uploader siehst du den Fortschritt, und rechts unten meldet eine grüne Box den Erfolg:

Ein Klick auf das -- ganz links schließt das Menü wieder. Deine Datei steht jetzt in der Liste.
Auf dem Server liegt sie im Ordner ~/copyparty/daten/gemeinsam. Du kannst das prüfen:
ls ~/copyparty/daten/gemeinsamDie Symbolleiste
Neben der Rakete gibt es weitere Symbole. Das jeweilige Symbol zeigt dir beim Überfahren mit der Maus einen Hinweis. Das bedeuten sie:
| Symbol | Funktion |
|---|---|
| 🔎 | Dateien nach Name, Pfad oder Musiktags suchen |
| 🧯 | Eigene Uploads löschen oder abbrechen (unpost) |
| 🚀 | Dateien hochladen (up2k) |
| 🎈 | Einfacher Uploader für sehr alte Browser |
| 📂 | Neuen Ordner anlegen |
| 📝 | Neue Textdatei anlegen |
| 📟 | Nachricht ins Serverlog schreiben |
| 🎺 | Einstellungen für den Musikplayer |
| ⚙️ | Einstellungen der Oberfläche |
Dateien ansehen
So sieht die normale Listenansicht aus:

Links steht der Ordnerbaum, in der Mitte die Dateien mit Größe und Datum. Rechts unten schaltet das Quadrat-Symbol auf die Rasteransicht um. Dort siehst du Vorschaubilder:

Die Einstellung merkt sich dein Browser. Über sort by sortierst du nach Name, Größe, Datum oder Typ, über zoom änderst du die Größe der Bilder.
Musik abspielen
Ein Klick auf eine Audiodatei startet den Player. Er erscheint unten am Rand mit Vor- und Zurücktasten, Pause und einer Zeitleiste, auf der du springen kannst:

Der Player läuft weiter, wenn du den Ordner wechselst.
Markdown-Dateien lesen
Textdateien im Markdown-Format zeigt copyparty fertig formatiert an. Hänge dazu ?v an die Adresse der Datei, zum Beispiel https://{{domain}}/gemeinsam/einkauf.md?v:

Oben stehen die Links edit (basic) und edit (fancy). Damit bearbeitest du die Datei im Browser, wenn du Schreibrechte hast. view raw zeigt den Rohtext.
Mehrere Dateien auswählen
Klicke in der Rasteransicht auf multiselect. Danach markierst du Dateien mit einem Klick:

Unten erscheint eine Leiste. Links davon steht, wie viel du markiert hast: im Beispiel 32,7 KiB in 2 Dateien. Die Knöpfe bedeuten:
share: Freigabelink erzeugen.name: umbenennen.del.: löschen.cut,copy,paste: ausschneiden, kopieren und in einem anderen Ordner einfügen.sel. allundsel. inv.: alles auswählen oder die Auswahl umkehren.zip: alle markierten Dateien als ZIP herunterladen.dl: die Auswahl herunterladen.
Freigabelinks erzeugen
Mit einem Link gibst du Dateien an Personen weiter, die kein Konto haben. Dafür schaltest du die Funktion zuerst in der Konfiguration ein. Öffne die Datei:
nano cfg/copyparty.confFüge im Block [global] zwei Zeilen hinzu:
[global]
e2dsa
e2ts
rproxy: 1
xff-hdr: x-forwarded-for
xff-src: 172.16.0.0/12
shr: /freigaben
shr-adm: adminshr: /freigaben aktiviert die Funktion. Alle Links liegen unter der Adresse /freigaben. Mit shr-adm: admin darf der Benutzer admin alle Links sehen und löschen.
Änderungen im Block [global] übernimmt copyparty nur nach einem Neustart:
sudo docker compose restart copypartyMelde dich erneut an, markiere in einem Ordner zwei Dateien und klicke unten auf share. Es öffnet sich ein Formular:

Die Felder:
name: Der Name des Links. Bleibt das Feld leer, wählt copyparty einen zufälligen.source: Das, was du teilst. Das Feld ist schon ausgefüllt.passwd: Ein optionales Passwort, das der Empfänger eingeben muss.expiry: Wie lange der Link gilt. Voreingestellt sind 24 Stunden.eternalhebt die Frist auf.perms:readerlaubt das Ansehen,getnur das Herunterladen einzelner Dateien.
Ich habe den Namen urlaub eingetragen und auf create share geklickt. copyparty zeigt den Link und einen QR-Code:

Mit OK kopierst du den Link in die Zwischenablage, mit Cancel schließt du das Fenster. Der Link lautet in diesem Beispiel https://{{domain}}/freigaben/urlaub/. Wer ihn öffnet, sieht genau die zwei geteilten Dateien und sonst nichts, auch ohne Anmeldung.
Deine Links verwaltest und löschst du im control-panel. Das ist der Link unter der Dateiliste.
Mehr Benutzer und Rechte
Bis jetzt gibt es nur den Benutzer admin. Jetzt baust du eine Struktur mit vier Ordnern für verschiedene Zwecke:
| Adresse | Wer darf was |
|---|---|
/gemeinsam |
Alle angemeldeten Benutzer dürfen lesen, schreiben, verschieben, löschen |
/oeffentlich |
Jeder darf lesen, nur admin darf ändern |
/upload |
Jeder darf Dateien hochladen, aber nichts sehen. Nur admin sieht sie |
/privat |
Nur admin |
Lege zuerst die Ordner auf dem Server an:
mkdir -p ~/copyparty/daten/oeffentlich ~/copyparty/daten/upload ~/copyparty/daten/privatErsetze dann die komplette cfg/copyparty.conf:
nano cfg/copyparty.conf[global]
e2dsa
e2ts
rproxy: 1
xff-hdr: x-forwarded-for
xff-src: 172.16.0.0/12
shr: /freigaben
shr-adm: admin
[accounts]
admin: AendereMich-Admin1
anna: AendereMich-Anna2
[/gemeinsam]
/w/gemeinsam
accs:
rwmd: @acct
[/oeffentlich]
/w/oeffentlich
accs:
r: *
A: admin
[/upload]
/w/upload
accs:
w: *
A: admin
[/privat]
/w/privat
accs:
A: adminVergib für admin und anna eigene Passwörter. Das ist neu:
- Unter
[accounts]gibt es jetzt die Benutzerinanna. @acctist eine Gruppe, die automatisch jeden angemeldeten Benutzer enthält.rwmd: @acctgibt allen die Rechter,w,mundd.*bedeutet “jeder”, auch ohne Anmeldung.
Die Buchstaben der Rechte:
| Buchstabe | Recht |
|---|---|
r |
Lesen: Ordner ansehen, herunterladen, als ZIP laden |
w |
Schreiben: Dateien hochladen |
m |
Verschieben: Dateien aus diesem Ordner heraus verschieben |
d |
Löschen |
a |
Admin: sieht Upload-Zeit und IP-Adressen und darf die Konfiguration laden |
A |
Alles auf einmal: rwmda plus Punkt-Dateien |
Die Konfiguration lädt copyparty beim Start. Starte also neu:
sudo docker compose restart copypartySpäter genügt für neue Benutzer und Rechte der Knopf reload cfg im Verwaltungsbereich. Nur der Block [global] braucht weiterhin einen Neustart. Das Neuladen geht auch per Befehl, wenn du das Passwort von admin mitgibst:
curl -H "PW: AendereMich-Admin1" "https://{{domain}}/?reload=cfg"So sieht die Startseite für Besucher ohne Anmeldung aus. Sie sehen nur, was sie lesen oder hochladen dürfen:

Als admin siehst du alle vier Ordner und den Verwaltungsbereich mit den Knöpfen rescan und reload cfg:

Rechte prüfen
Prüfe, ob die Rechte stimmen. Der folgende Befehl fragt jeden Ordner ab und zeigt nur den Statuscode. 200 bedeutet Zugriff, 403 bedeutet gesperrt:
for p in privat gemeinsam oeffentlich upload; do
echo -n "ohne Anmeldung /$p: "
curl -s -o /dev/null -w "%{http_code}\n" "https://{{domain}}/$p/?ls"
doneBei mir kam das heraus:
| Ordner | Ohne Anmeldung | Als anna | Als admin |
|---|---|---|---|
/privat |
403 | 403 | 200 |
/gemeinsam |
403 | 200 | 200 |
/oeffentlich |
200 | 200 | 200 |
/upload |
200 | 200 | 200 |
Bei /upload ist die 200 nur die Seite zum Hochladen. Besucher ohne Anmeldung sehen dort keine Dateien. Ein Gast kann die Datei gast.txt hochladen, danach nicht mehr aufrufen, und sie taucht nur bei admin in der Liste auf.
Als anna testest du mit dem Header PW:
curl -s -o /dev/null -w "%{http_code}\n" -H "PW: AendereMich-Anna2" "https://{{domain}}/gemeinsam/?ls"Wer sich zu oft mit falschem Passwort anmeldet, sperrt copyparty standardmäßig für 24 Stunden (nach 9 Fehlversuchen innerhalb einer Stunde). Das funktioniert nur, weil die echte IP-Adresse über die Zeilen rproxy und xff ankommt.
Den Server als Laufwerk einbinden: WebDAV
copyparty spricht WebDAV. Das ist ein Standard, über den viele Programme Dateien auf einem Server wie auf einem lokalen Laufwerk behandeln. Du musst dafür nichts einschalten.
Prüfe es mit curl. Der Befehl listet den Inhalt von /gemeinsam auf. 207 ist die richtige Antwort:
curl -s -u anna:AendereMich-Anna2 -X PROPFIND -H "Depth: 1" "https://{{domain}}/gemeinsam/" -o /dev/null -w "%{http_code}\n"Eine Datei lädst du so hoch. Die Antwort 201 heißt, dass sie angelegt wurde:
echo "per webdav" | curl -s -u anna:AendereMich-Anna2 -T - "https://{{domain}}/gemeinsam/webdav-test.txt" -o /dev/null -w "%{http_code}\n"Mit rclone kopierst du Ordner auf deinen Rechner oder sicherst sie. Der Befehl listet die Dateien in /gemeinsam auf:
rclone lsf :webdav: --webdav-url=https://{{domain}}/gemeinsam --webdav-vendor=other --webdav-user=anna --webdav-pass="$(rclone obscure AendereMich-Anna2)"Bei mir erschienen Fotos/, einkauf.md, notizen.txt und die Testdatei. Das Passwort schreibst du dabei nicht im Klartext, sondern über rclone obscure. Mit rclone copy statt rclone lsf lädst du Dateien herunter oder hoch.
Backup
Alles Wichtige liegt im Ordner copyparty: deine Dateien in daten, die Konfiguration samt Freigaben in cfg. Sichere ihn als Ganzes:
cd ~
sudo tar czf copyparty-backup.tar.gz copypartyKopiere die Datei danach auf einen anderen Rechner. Sie enthält deine Passwörter aus der copyparty.conf, bewahre sie also nicht offen auf. Bei großen Dateimengen nutzt du stattdessen rclone oder rsync auf den daten-Ordner.
copyparty aktualisieren
cd ~/copyparty
sudo docker compose pull
sudo docker compose up -dDeine Dateien und die Konfiguration bleiben erhalten, denn sie liegen in daten und cfg außerhalb des Containers. Nach dem Update prüfst du, ob du dich weiter anmelden kannst und die Ordner sichtbar sind.
Wenn etwas nicht klappt
- Caddy zeigt
502 Bad Gateway: copyparty läuft nicht. Prüfe mitsudo docker compose psden Status und mitsudo docker compose logs copypartyden Grund. Ich hatte einen Fehler, als ichcfgmit:roeingebunden hatte. Im Log stand dann, dass die Konfiguration nicht gespeichert werden kann. 403im Browser: Du hast an dieser Adresse kein Recht, oder du bist nicht angemeldet. Prüfe in dercopyparty.conf, ob dein Benutzer im Blockaccsdes Ordners steht.- Eine neue Einstellung wirkt nicht: Änderungen im Block
[global]brauchensudo docker compose restart copyparty. Alles andere übernimmtreload cfg. - Hochladen schlägt fehl: Der Ordner auf dem Server muss dem Benutzer gehören, der im Container läuft. Prüfe mit
ls -ln ~/copyparty/daten, ob in der Besitzer-Spalte deine Benutzer-ID ausid -usteht. - Die Passwörter stehen im Klartext in der Datei: Das ist so gewollt. Schütze die Datei, sichere sie nur verschlüsselt und nutze für jeden Benutzer ein eigenes Passwort.
Für wen lohnt sich copyparty?
copyparty passt, wenn du Dateien auf deinem eigenen Server ablegen, teilen und per Browser erreichen willst, ohne eine große Plattform zu betreiben. Es ist schnell eingerichtet und braucht kaum Ressourcen.
Ein paar Punkte, die du wissen solltest:
- Die Oberfläche ist funktional, aber nicht schick. Sie richtet sich an Leute, die Tastenkürzel und Symbole mögen.
- Kalender, Kontakte und Office-Dokumente kennt copyparty nicht. Dafür ist Nextcloud besser geeignet.
- Du kümmerst dich selbst um Updates und Backups.
Fazit
Mit Docker und Caddy läuft copyparty in wenigen Minuten. Die eigentliche Arbeit steckt in der copyparty.conf: Dort legst du Benutzer an und bestimmst pro Ordner, wer lesen, schreiben oder löschen darf. Danach nutzt du die Weboberfläche für Uploads, Vorschauen und Freigabelinks, und per WebDAV oder rclone sprichst du den Server auch aus anderen Programmen an.
Wofür nutzt du einen eigenen Dateiserver? Schreib es gern in die Kommentare.
FAQ
Häufige Fragen
Ist copyparty kostenlos?
Ja. copyparty ist Open Source und kostenlos. Für den Betrieb zahlst du nur den Server und deine Domain.
Ist copyparty sicher?
Die Verbindung läuft über HTTPS, Rechte vergibst du pro Ordner, und wiederholte Falscheingaben führen zu einer Sperre. Halte das Image aktuell, vergib starke Passwörter und gib nur Ordner frei, die wirklich öffentlich sein sollen.
Wie ändere ich ein Passwort in copyparty?
Ändere das Passwort in der Datei cfg/copyparty.conf im Block [accounts] und klicke als Admin auf reload cfg. Ein Neustart ist dafür nicht nötig.
Wie lege ich einen neuen Benutzer an?
Trage unter [accounts] eine Zeile im Format name: passwort ein, nimm den Benutzer in den accs-Block der gewünschten Ordner auf und lade die Konfiguration mit reload cfg neu.
Wo speichert copyparty meine Dateien?
Im Ordner, den du in der compose.yaml nach /w einbindest, hier ./daten. Die Konfiguration und gespeicherte Freigaben liegen im Ordner cfg.
Kann ich Dateien teilen, ohne dass der Empfänger ein Konto braucht?
Ja, mit Freigabelinks. Dafür aktivierst du in der Konfiguration die Zeile shr, markierst Dateien und klickst auf share. Optional vergibst du ein Passwort und ein Ablaufdatum.
Wie binde ich copyparty als Laufwerk ein?
Über WebDAV. Die Adresse ist die URL des Ordners, zum Beispiel https://deinedomain.de/gemeinsam, dazu Benutzername und Passwort. Mit rclone kannst du Ordner außerdem kopieren und synchronisieren.
Wie aktualisiere ich copyparty?
Im Ordner mit der compose.yaml führst du sudo docker compose pull und danach sudo docker compose up -d aus. Deine Dateien und die Konfiguration bleiben erhalten.