Documenso mit Docker installieren: Open-Source-Alternative zu DocuSign selbst hosten
Documenso ist die DSGVO-konforme Open-Source-Alternative zu DocuSign: digitale Signaturen nach PAdES-Standard, selbst gehostet ohne US-Cloud. Von der .env-Konfiguration bis zum ersten signierten Dokument, getestet mit Version 2.19 und mit Troubleshooting für den Produktivbetrieb.
Neue Version verfügbar: documenso 2.20.0. Diese Anleitung wird überarbeitet. Beschrieben ist documenso 2.19.0.
WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Wer rechtssichere digitale Signaturen braucht, greift meist zu DocuSign oder Adobe Acrobat Sign und sendet dabei unweigerlich sensible Verträge in US-amerikanische Rechenzentren. Documenso schließt diese Lücke: Das Projekt (AGPL-3.0, über 13.000 GitHub-Sterne, aktuelle Version v2.19.0) bietet digitale Dokumentensignaturen nach dem EU-Standard PAdES auf dem eigenen Server. Für KMU, Rechtsabteilungen, Steuerkanzleien und HR-Teams bedeutet das: keine Abhängigkeit von US-Anbietern, volle DSGVO-Kontrolle und ein Audit-Trail, der auf der eigenen Infrastruktur liegt. Diese Anleitung führt Sie Schritt für Schritt durch die Docker-Compose-Installation, von der Ordnerstruktur über das Signaturzertifikat bis zur ersten Einladung an Unterzeichner.
Voraussetzungen
- Docker Engine 20.10+ und Docker Compose v2.0+ auf dem Host installiert; falls noch nicht geschehen, hilft die Anleitung Docker und Docker Compose auf Linux installieren.
- Linux-Host, VM oder NAS mit mindestens 2 GB RAM, 2 CPU-Kernen und 20 GB freiem Speicher (Minimum: 1 GB RAM, 1 Kern, 10 GB).
- Eigene Domain mit DNS-A-Record auf den Server und ein TLS-Zertifikat, am einfachsten über Traefik oder Caddy mit automatischem Let's-Encrypt-Support. Für HTTPS ohne eigenen Reverse Proxy gilt die Anleitung Caddy als Reverse Proxy einrichten.
- OpenSSL auf dem Host (für Secret- und Zertifikatgenerierung).
- SMTP-Zugangsdaten eines E-Mail-Providers (z. B. Resend, Mailgun, eigener Postfix); ohne funktionierenden Mail-Versand können keine Signaturanfragen verschickt werden.
- Root- oder sudo-Zugang zum Host (für Verzeichnis- und Berechtigungsoperationen).
| Eigenschaft | Wert |
|---|---|
| Docker-Image | documenso/documenso:v2.19.0 (Docker Hub) · ghcr.io/documenso/documenso:v2.19.0 (GHCR) |
| Image-Größe | ca. 644 MB |
| Web-Port | 3000 (konfigurierbar über PORT) |
| Datenbank | PostgreSQL 14+ (ausschließlich; kein MySQL/SQLite) |
| Signaturstandard | PAdES (PDF Advanced Electronic Signatures, EU-konform) |
| Lizenz | AGPL-3.0 |
| RAM (Produktion) | mind. 2 GB (Minimum: 1 GB) |
Schritt 1: Projektordner und Zertifikatsverzeichnis anlegen
Legen Sie zunächst die Ordnerstruktur auf dem Host an. Der Pfad /opt/documenso ist der dokumentierte Standard-Mountpunkt für das Signaturzertifikat im Container:
sudo mkdir -p /opt/documenso
cd /opt/documensoSetzen Sie die Berechtigungen so, dass Ihr Admin-Benutzer die Dateien anlegen kann, der Container aber nur Lese-Zugriff auf das spätere Zertifikat bekommt:
sudo chown $(whoami):$(whoami) /opt/documensoVerifizieren: ls -la /opt/ | grep documenso: Das Verzeichnis muss mit Ihrem Benutzer als Eigentümer existieren.
Schritt 2: Signaturzertifikat (.p12) erstellen
Documenso benötigt ein PKCS#12-Zertifikat für PAdES-Signaturen. Das Image enthält kein Standard-Zertifikat, Sie müssen es selbst bereitstellen. Für interne Tests oder KMU-Einsatz ohne Anforderung an qualifizierte elektronische Signaturen (QES) reicht ein selbstsigniertes Zertifikat:
# Schlüssel und selbstsigniertes Zertifikat erzeugen (10 Jahre Laufzeit)
openssl req -x509 -nodes -newkey rsa:4096 \
-keyout /opt/documenso/key.pem \
-out /opt/documenso/cert.pem \
-days 3650 \
-subj "/CN=Documenso Signing/O=Mein Unternehmen/C=DE"
# PKCS#12-Bundle MIT Passwort erstellen (Pflicht, ohne Passwort schlägt Documenso fehl)
openssl pkcs12 -export \
-out /opt/documenso/cert.p12 \
-inkey /opt/documenso/key.pem \
-in /opt/documenso/cert.pem \
-passout pass:MEIN_SICHERES_ZERTPASSWORT
# Zwischendateien entfernen, Berechtigungen setzen
rm /opt/documenso/key.pem /opt/documenso/cert.pem
sudo chown 1001:1001 /opt/documenso/cert.p12
sudo chmod 400 /opt/documenso/cert.p12Notieren Sie sich das gewählte Passwort, es kommt in Schritt 3 als NEXT_PRIVATE_SIGNING_PASSPHRASE in die .env. Für rechtssichere qualifizierte Signaturen (QES) nach eIDAS benötigen Sie ein Zertifikat einer akkreditierten Vertrauensstelle (z. B. D-Trust, Bundesdruckerei).
Verifizieren: ls -la /opt/documenso/cert.p12: Die Ausgabe muss -r-------- (400) mit Eigentümer 1001 zeigen. Mit openssl pkcs12 -info -in /opt/documenso/cert.p12 -passin pass:MEIN_SICHERES_ZERTPASSWORT -nokeys 2>/dev/null | head -5 können Sie das Zertifikat inhaltlich prüfen.
Schritt 3: Secrets generieren und .env anlegen
Erzeugen Sie zunächst alle benötigten Zufalls-Secrets mit OpenSSL auf der Kommandozeile. Drei unabhängige Secrets mit je mindestens 32 Zeichen sind Pflicht:
openssl rand -base64 32 # NEXTAUTH_SECRET
openssl rand -base64 32 # NEXT_PRIVATE_ENCRYPTION_KEY
openssl rand -base64 32 # NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY
openssl rand -base64 24 # POSTGRES_PASSWORDLegen Sie anschließend die Datei /opt/documenso/.env an und füllen Sie sie mit Ihren Werten:
# ── Datenbank ────────────────────────────────────────────────
POSTGRES_USER=documenso
POSTGRES_PASSWORD=IHR_DB_PASSWORT_HIER
POSTGRES_DB=documenso
NEXT_PRIVATE_DATABASE_URL=postgresql://documenso:IHR_DB_PASSWORT_HIER@database:5432/documenso
# ── Auth & Verschlüsselung ────────────────────────────────────
NEXTAUTH_SECRET=IHR_NEXTAUTH_SECRET_HIER
NEXT_PRIVATE_ENCRYPTION_KEY=IHR_ENCRYPTION_KEY_HIER
NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=IHR_SECONDARY_KEY_HIER
# ── URLs (exakt wie im Browser erreichbar) ───────────────────
NEXT_PUBLIC_WEBAPP_URL=https://sign.example.com
NEXT_PRIVATE_INTERNAL_WEBAPP_URL=http://localhost:3000
# ── E-Mail ────────────────────────────────────────────────────
NEXT_PRIVATE_SMTP_TRANSPORT=smtp-auth
NEXT_PRIVATE_SMTP_HOST=smtp.example.com
NEXT_PRIVATE_SMTP_PORT=587
NEXT_PRIVATE_SMTP_USERNAME=absender@example.com
NEXT_PRIVATE_SMTP_PASSWORD=IHR_SMTP_PASSWORT
NEXT_PRIVATE_SMTP_FROM_ADDRESS=absender@example.com
NEXT_PRIVATE_SMTP_FROM_NAME=Documenso
# ── Signaturzertifikat ────────────────────────────────────────
NEXT_PRIVATE_SIGNING_PASSPHRASE=MEIN_SICHERES_ZERTPASSWORT
# ── Optional: Telemetrie deaktivieren ─────────────────────────
DOCUMENSO_DISABLE_TELEMETRY=true
# ── Optional: Registrierung nach Erst-Setup sperren ──────────
# NEXT_PUBLIC_DISABLE_SIGNUP=trueSchützen Sie die Datei vor fremdem Zugriff:
chmod 600 /opt/documenso/.envVerifizieren: ls -la /opt/documenso/.env muss -rw------- (600) anzeigen. Prüfen Sie kritische Werte: grep NEXT_PRIVATE_DATABASE_URL /opt/documenso/.env: Der Hostname muss database lauten (Docker-Compose-Servicename), niemals localhost.
Schritt 4: compose.yaml anlegen
Erstellen Sie die Compose-Datei unter /opt/documenso/compose.yaml. Der healthcheck beim Datenbank-Service ist wichtig: Documenso wartet damit auf eine tatsächlich startbereite PostgreSQL-Instanz, bevor es mit Migrationen beginnt.
name: documenso
services:
database:
image: postgres:15
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- database:/var/lib/postgresql/data
documenso:
image: documenso/documenso:v2.19.0
restart: unless-stopped
depends_on:
database:
condition: service_healthy
ports:
- "${PORT:-3000}:${PORT:-3000}"
environment:
PORT: ${PORT:-3000}
# Datenbank
NEXT_PRIVATE_DATABASE_URL: ${NEXT_PRIVATE_DATABASE_URL}
# Pflicht für die Migrationen beim Start (ohne PgBouncer identisch mit der URL oben)
NEXT_PRIVATE_DIRECT_DATABASE_URL: ${NEXT_PRIVATE_DIRECT_DATABASE_URL:-${NEXT_PRIVATE_DATABASE_URL}}
# Auth & Verschlüsselung
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
NEXT_PRIVATE_ENCRYPTION_KEY: ${NEXT_PRIVATE_ENCRYPTION_KEY}
NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY: ${NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY}
# URLs
NEXT_PUBLIC_WEBAPP_URL: ${NEXT_PUBLIC_WEBAPP_URL}
NEXT_PRIVATE_INTERNAL_WEBAPP_URL: ${NEXT_PRIVATE_INTERNAL_WEBAPP_URL:-http://localhost:3000}
# E-Mail
NEXT_PRIVATE_SMTP_TRANSPORT: ${NEXT_PRIVATE_SMTP_TRANSPORT:-smtp-auth}
NEXT_PRIVATE_SMTP_HOST: ${NEXT_PRIVATE_SMTP_HOST}
NEXT_PRIVATE_SMTP_PORT: ${NEXT_PRIVATE_SMTP_PORT:-587}
NEXT_PRIVATE_SMTP_USERNAME: ${NEXT_PRIVATE_SMTP_USERNAME}
NEXT_PRIVATE_SMTP_PASSWORD: ${NEXT_PRIVATE_SMTP_PASSWORD}
NEXT_PRIVATE_SMTP_FROM_ADDRESS: ${NEXT_PRIVATE_SMTP_FROM_ADDRESS}
NEXT_PRIVATE_SMTP_FROM_NAME: ${NEXT_PRIVATE_SMTP_FROM_NAME:-Documenso}
# Signaturzertifikat
NEXT_PRIVATE_SIGNING_PASSPHRASE: ${NEXT_PRIVATE_SIGNING_PASSPHRASE}
NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH: /opt/documenso/cert.p12
# Telemetrie
DOCUMENSO_DISABLE_TELEMETRY: "true"
volumes:
- /opt/documenso/cert.p12:/opt/documenso/cert.p12:ro
volumes:
database:Zwei Zeilen sind gegenüber älteren Vorlagen entscheidend: NEXT_PRIVATE_DIRECT_DATABASE_URL verlangt das Prisma-Schema für die Migrationen; fehlt sie, bricht die Migration beim Start ab und Documenso läuft danach in einer Neustartschleife mit „The table public.User does not exist“. Die offizielle Compose-Datei setzt sie deshalb standardmäßig auf NEXT_PRIVATE_DATABASE_URL. NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH teilt der Anwendung den Pfad des Zertifikats mit. Das Startskript findet die Datei zwar auch ohne diese Variable unter dem Standardpfad, die Signierfunktion selbst liest sie aber nur über die Variable; ohne sie meldet /api/certificate-status im Test "isAvailable":false.
Verifizieren: docker compose -f /opt/documenso/compose.yaml config: Compose analysiert die Datei und zeigt die aufgelöste Konfiguration ohne Fehler an. Fehlende Pflicht-Variablen werden direkt als Fehler gemeldet.
Schritt 5: Stack starten und Migrationen abwarten
Starten Sie den Stack aus dem Projektordner heraus:
cd /opt/documenso
docker compose up -dBeim ersten Start führt Documenso automatisch alle Datenbankmigrationen aus, das kann zwei bis drei Minuten dauern. Beobachten Sie den Fortschritt live:
docker compose logs -f documensoSie warten auf die Zeile All migrations have been successfully applied., danach startet der Server und meldet unter anderem [JOBS]: Started cron poller. Ab dann ist die App bereit.
Verifizieren:
docker compose psErwartete Ausgabe (beide Container müssen laufen):
NAME IMAGE STATUS
documenso-database-1 postgres:15 Up X minutes (healthy)
documenso-documenso-1 documenso/documenso:v2.19.0 Up X minutesAnschließend Health-Check-Endpunkt prüfen:
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/api/healthErwartete Antwort: 200. Der Endpunkt liefert seit den aktuellen Versionen zusätzlich ein JSON mit den Einzelprüfungen; "status":"ok" bedeutet, dass Datenbank und Zertifikat in Ordnung sind, "warning" deutet meist auf ein nicht geladenes Zertifikat hin. Den Zertifikat-Status prüfen Sie mit:
curl -s http://localhost:3000/api/certificate-statusErwartete Antwort: {"isAvailable":true,...}.
Schritt 6: Reverse Proxy und HTTPS einrichten
Für den Produktivbetrieb ist HTTPS Pflicht: NEXT_PUBLIC_WEBAPP_URL muss die https://-URL enthalten, sonst funktionieren Token-Links in E-Mails und OAuth-Callbacks nicht. Richten Sie einen Reverse Proxy vor Documenso (Port 3000) ein. Empfohlen:
- Traefik: Labels am Documenso-Service ergänzen, Traefik übernimmt Let's-Encrypt-Zertifikate automatisch. Anleitung: Traefik als Docker-Reverse-Proxy mit automatischem HTTPS einrichten.
- Caddy: Eintrag in der Caddyfile:
sign.example.com { reverse_proxy documenso:3000 }. Anleitung: Caddy als Reverse Proxy einrichten. - Nginx Proxy Manager: Proxy-Host für Port 3000 anlegen, SSL via Let's Encrypt aktivieren.
Wichtig: Setzen Sie in der .env nach dem DNS-Eintrag und dem Reverse-Proxy-Setup die korrekte öffentliche URL und die interne URL für Hintergrund-Jobs:
NEXT_PUBLIC_WEBAPP_URL=https://sign.example.com
NEXT_PRIVATE_INTERNAL_WEBAPP_URL=http://localhost:3000Die interne URL muss auf localhost:3000 zeigen (nicht auf die öffentliche Domain), damit Hintergrund-Jobs den Reverse Proxy umgehen. Starten Sie den Stack nach der Änderung neu:
docker compose up -d --force-recreate documensoVerifizieren: Rufen Sie https://sign.example.com im Browser auf; Sie sollten die Documenso-Startseite mit gültigem TLS-Zertifikat sehen. curl -I https://sign.example.com/api/health gibt HTTP 200 zurück.
Schritt 7: Erst-Einrichtung im Browser und Registrierung sperren
Öffnen Sie https://sign.example.com und erstellen Sie den ersten Admin-Account über das Registrierungsformular. Sichern Sie Passwort und E-Mail-Adresse sorgfältig, über diesen Account verwalten Sie später alle Teams und Einstellungen.
Nach dem ersten Login empfiehlt es sich, weitere Registrierungen zu sperren, wenn Sie Documenso nur für Ihr Team nutzen wollen. Ergänzen Sie in der .env:
NEXT_PUBLIC_DISABLE_SIGNUP=trueAlternativ schränken Sie die Registrierung auf bestimmte E-Mail-Domains ein:
NEXT_PRIVATE_ALLOWED_SIGNUP_DOMAINS=ihrunternehmen.de,partner.deContainer neu starten, damit die Änderung wirksam wird:
docker compose up -d --force-recreate documensoVerifizieren: Melden Sie sich als Admin an und rufen Sie https://sign.example.com/api/certificate-status im Browser auf. Die Antwort zeigt, ob das Signaturzertifikat korrekt geladen ist. Laden Sie ein Test-PDF hoch, fügen Sie sich als Unterzeichner hinzu und prüfen Sie, ob die Einladungsmail eintrifft.
Schritt 8: Updates und Datenbank-Backup
Documenso erscheint regelmäßig mit neuen Versionen. Prüfen Sie vor jedem Update die Release-Notes auf Breaking Changes. Erstellen Sie immer zuerst ein Datenbank-Backup:
# Backup erstellen
docker compose exec database pg_dump -U documenso documenso > /opt/documenso/backup_$(date +%Y%m%d).sql
# Image-Tag in compose.yaml auf neue Version anpassen, dann:
docker compose pull
docker compose up -dHinweise für das Update von v2.11 auf v2.19: Die Release Notes der Versionen 2.12 bis 2.19 nennen keine Breaking Changes für Selbsthoster; die Datenbankmigrationen laufen beim Start automatisch (prisma migrate deploy). Im Test spielte der Wechsel von v2.11.0 auf v2.19.0 sieben zusätzliche Migrationen ein. Prüfen Sie vor dem Update Ihre compose.yaml auf die beiden Variablen aus Schritt 4: Ohne NEXT_PRIVATE_DIRECT_DATABASE_URL scheitern die Migrationen, ohne NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH meldet der Zertifikatsstatus im Test mit v2.19.0 „nicht verfügbar“. Seit v2.18 basiert das Image auf Node 24 LTS. Neu sind unter anderem AES/QES-Signaturen über externe Vertrauensdiensteanbieter per CSC (v2.13), ein Betrieb unter einem Unterpfad per NEXT_PUBLIC_BASE_PATH (v2.17), einzeln abschaltbare Anmeldewege und eine automatische OIDC-Weiterleitung (v2.15) sowie Massen-Download und Inbox-Filter. Ein Zurückspielen der älteren Version ist nach den Migrationen nicht vorgesehen; halten Sie daher den Dump bereit.
Datenbankmigrationen laufen automatisch beim Neustart. Überwachen Sie den Fortschritt mit docker compose logs -f documenso. Für eine strukturierte Backup-Strategie empfiehlt sich die Anleitung zu PostgreSQL pg_dump und pg_restore: Backup und Migration. Für automatische Update-Benachrichtigungen ohne blindes :latest-Pulling hilft die Anleitung zu Docker-Container automatisch aktualisieren.
Verifizieren: Nach dem Update docker compose ps: Beide Container müssen mit dem neuen Image-Tag und Status Up laufen. curl -s http://localhost:3000/api/health gibt weiterhin HTTP 200 zurück. Im Browser zeigt die neue Versionsnummer in den Einstellungen den Erfolg.
Troubleshooting / Typische Fehler
- „Failed to get private key bags“: Das
.p12-Zertifikat wurde ohne Passwort erstellt. Lösung: Zertifikat neu erstellen und dabei-passout pass:PASSWORTübergeben;NEXT_PRIVATE_SIGNING_PASSPHRASEin der.envsetzen. - EACCES permission denied beim Signieren: Der Container läuft als UID 1001 (non-root), hat aber keinen Lesezugriff auf
cert.p12. Lösung:sudo chown 1001:1001 /opt/documenso/cert.p12 && sudo chmod 400 /opt/documenso/cert.p12auf dem Host ausführen. - Signatur läuft durch, erzeugt aber keine gültige Unterschrift: Kein Zertifikat konfiguriert, falsch gemountet oder
NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATHfehlt; Documenso startet problemlos auch ohne Zertifikat, und das Startskript meldet die Datei trotzdem als gefunden. Diagnose:/api/certificate-statusaufrufen, erwartet ist"isAvailable":true. - Neustartschleife mit „The table public.User does not exist“: Im Log steht zuvor
Environment variable not found: NEXT_PRIVATE_DIRECT_DATABASE_URL, die Migrationen sind nie gelaufen. Lösung: Variable wie in Schritt 4 ergänzen und den Container neu erstellen. - Datenbankverbindung schlägt fehl, „connection refused“:
NEXT_PRIVATE_DATABASE_URLverwendetlocalhoststatt dem Compose-Servicenamen. Lösung: URL-Hostname mussdatabaselauten, alsopostgresql://documenso:PASS@database:5432/documenso. - Token-Links in E-Mails sind falsch oder OAuth-Callback schlägt fehl:
NEXT_PUBLIC_WEBAPP_URList falsch gesetzt (z. B.http://statthttps://oder fehlender Port). Lösung: URL exakt so setzen, wie sie im Browser erreichbar ist. - Erster Start hängt oder läuft in Timeout: Datenbankmigrationen beim Erststart benötigen Zeit. Lösung:
depends_onmitcondition: service_healthyin der Compose-Datei sicherstellen unddocker compose logs -f documensoabwarten. - Hintergrund-Jobs (E-Mail-Versand) schlagen fehl:
NEXT_PRIVATE_INTERNAL_WEBAPP_URLzeigt auf die öffentliche Domain statt aufhttp://localhost:3000. Lösung: Variable auf die interne Container-URL setzen. - Breaking Changes nach Update: Verwendung von
:latest-Tag. Lösung: In dercompose.yamlimmer konkrete Versionstags wie:v2.19.0einsetzen und vor jedem Update die Release-Notes lesen.
Häufige Fragen
Benötige ich zwingend ein SSL-Zertifikat für den Betrieb?
Ja, für den Produktivbetrieb ist HTTPS Pflicht. HTTP reicht ausschließlich für lokale Tests. NEXT_PUBLIC_WEBAPP_URL muss die https://-URL enthalten, sonst funktionieren Token-Links in E-Mails, OAuth-Callbacks und viele sicherheitsrelevante Browser-Features nicht korrekt. Am einfachsten übernimmt ein vorgelagerter Reverse Proxy (Traefik, Caddy, Nginx) die TLS-Terminierung mit Let's-Encrypt-Zertifikaten.
Wie erstelle ich ein Signaturzertifikat (.p12) für rechtssichere Signaturen?
Für interne Zwecke oder fortgeschrittene elektronische Signaturen reicht ein selbstsigniertes OpenSSL-Zertifikat wie in Schritt 2 beschrieben. Für qualifizierte elektronische Signaturen (QES) nach eIDAS (die höchste Rechtsstufe, gleichwertig mit handschriftlicher Unterschrift) benötigen Sie ein Zertifikat von einer akkreditierten Vertrauensstelle (z. B. D-Trust, Bundesdruckerei). Diese Zertifikate sind kostenpflichtig und erfordern eine Identitätsprüfung.
Werden Dokumente in der Datenbank oder im Dateisystem gespeichert?
Standardmäßig in PostgreSQL (NEXT_PUBLIC_UPLOAD_TRANSPORT=database). Das ist für KMU mit moderatem Dokumentenaufkommen praktisch, da kein zusätzlicher Speicher-Service benötigt wird. Bei großen Dokumentenmengen empfiehlt sich S3-kompatible Speicherung (AWS S3, MinIO, Cloudflare R2) über die entsprechenden S3-Umgebungsvariablen.
Kann ich die Benutzerregistrierung deaktivieren?
Ja: NEXT_PUBLIC_DISABLE_SIGNUP=true sperrt alle Neuregistrierungen vollständig. Mit NEXT_PRIVATE_ALLOWED_SIGNUP_DOMAINS=ihrunternehmen.de erlauben Sie nur Registrierungen von bestimmten E-Mail-Domains. Bestehende Benutzerkonten sind von beiden Einstellungen nicht betroffen.
Benötigt Documenso Redis?
Nein. Redis ist optional. Der Standard-Jobs-Provider local nutzt PostgreSQL für die interne Jobqueue, ohne externe Abhängigkeiten. Redis (BullMQ-Provider) oder Inngest empfehlen sich erst bei sehr hohem Durchsatz oder wenn Sie eine verwaltete Job-Infrastruktur bevorzugen.
Kann ich Nicht-PDF-Dokumente (DOCX, ODT) hochladen?
Ja, wenn Sie einen Gotenberg-Container als zusätzlichen Service in den Stack einbinden und NEXT_PRIVATE_DOCUMENT_CONVERSION_URL=http://gotenberg:3000 setzen. Gotenberg konvertiert DOCX, ODT und weitere Formate serverseitig zu PDF, bevor Documenso sie verarbeitet.
Fazit
Documenso ist eine ausgereifte, aktiv gepflegte Alternative zu DocuSign, die sich mit überschaubarem Aufwand auf eigener Infrastruktur betreiben lässt. Der größte konzeptionelle Unterschied zu SaaS-Angeboten: Sie tragen die Verantwortung für Betrieb, Backups und Updates selbst. Das zahlt sich aus, wenn DSGVO-Compliance ohne US-Datenverarbeitung für Sie oder Ihre Kunden nicht verhandelbar ist. Die Pflicht-Komplexität liegt vor allem beim Signaturzertifikat (PKCS#12 mit Passwort) und der korrekten URL-Konfiguration, zwei Punkte, bei denen erfahrungsgemäß die meisten Fehler entstehen. Wer diese Stolpersteine kennt, hat eine zuverlässige, rechtssichere Signaturlösung auf dem eigenen Server, die mit dem Team wächst.
Weiterführende Anleitungen und Quellen
- Docker und Docker Compose auf Linux installieren: die Self-Hosting-Grundlage
- Traefik als Docker-Reverse-Proxy mit automatischem HTTPS einrichten
- Caddy als Reverse Proxy einrichten: Anfänger-Anleitung mit automatischem HTTPS
- Docker-Container automatisch aktualisieren: Diun, WUD und Renovate im Vergleich
- Paperless-ngx mit Docker einrichten: papierlose Dokumentenverwaltung mit OCR
- Stirling-PDF mit Docker: der lokale PDF-Werkzeugkasten
- PostgreSQL pg_dump und pg_restore: Backup und Migration per Kommandozeile
Offizielle Quellen: Documenso Docs: Docker Compose Deployment · Environment Variables Reference · Tips und Common Pitfalls · GitHub Repository


