Pluma mit Docker selbst hosten
Pluma auf deiner eigenen Infrastruktur. Zwei Container, eine Compose-Datei, fünf Minuten vom leeren Server bis zur laufenden App.
Schnellstart (5 Minuten)
Verzeichnis anlegen
Verzeichnis anlegen
sudo mkdir -p /opt/pluma && sudo chown $USER:$USER /opt/pluma
cd /opt/plumaCompose-Datei anlegen
Compose-Datei anlegen
Speichern als docker-compose.yml.
services:
pluma:
# Pin a version tag (e.g. mertdalbudak/pluma:<version>) so updates happen
# when you decide; `latest` follows every release.
image: mertdalbudak/pluma:latest
container_name: pluma
restart: unless-stopped
env_file: .env
ports:
- "4100:4100"
volumes:
- builder-data:/app/builder/data
# Lets the Pro+ Publish flow drive `docker buildx`. WARNING: mounting
# the Docker socket hands the container control over the Docker host
# (root-equivalent). Remove this line unless you use Publish, and
# never keep it on a shared host.
- /var/run/docker.sock:/var/run/docker.sock
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:4100/health"]
interval: 30s
timeout: 5s
retries: 5
volumes:
builder-data:
.env-Datei anlegen
.env-Datei anlegen
Speichern als .env. Nur vier Werte zählen — der Rest wird beim ersten Boot automatisch erzeugt.
# Where Pluma is reachable (use https://… when fronted by TLS).
PUBLIC_URL=http://localhost:4100
# Paid tiers: paste your license key. Free tier: leave blank.
LICENSE_KEY=
# Database (optional) — unset uses a bundled SQLite file; point at your
# own PostgreSQL to back it up and scale it yourself.
# DATABASE_URL=postgresql://USER:PASS@host:5432/pluma
# Object storage (optional) — defaults to the local data volume; set these
# for S3-compatible storage (MinIO, R2, S3, B2, …).
# STORAGE_BACKEND=s3
# S3_BUCKET=pluma
# S3_ENDPOINT=https://your-s3-endpoint
# S3_REGION=eu-central-1
# S3_ACCESS_KEY=...
# S3_SECRET_KEY=...
# Email (optional) — only for the enterprise e-signature workflow. Any SMTP
# URL works; without it /sign-requests is disabled and everything else runs
# offline.
# SMTP_URL=smtp://user:[email protected]:587
# EMAIL_FROM=Pluma <[email protected]>
# [email protected]
# Document seal for signed PDFs. A self-signed seal is generated on first use
# and kept next to the data directory; point these at a certificate from an
# Adobe-trusted CA (or a qualified seal certificate) to make PDF readers show
# the seal as trusted. PLUMA_SEAL_TSA_URL adds an RFC 3161 timestamp.
# PLUMA_SEAL_CERT_FILE=/etc/pluma/seal.crt
# PLUMA_SEAL_KEY_FILE=/etc/pluma/seal.key
# PLUMA_SEAL_NAME=Your Company Document Seal
# PLUMA_SEAL_TSA_URL=http://timestamp.digicert.com
PUBLIC_URLWo die Installation läuftLICENSE_KEYNur kostenpflichtige Tarife — für Free leer lassenStack starten
Stack starten
docker compose up -d
docker compose logs -f plumaPrüfen
Prüfen
Wenn beide Endpunkte antworten, läuft es.
curl http://127.0.0.1:4100/health
# → {"ok":true,"service":"builder"}Öffnen http://your-host:4100 und registrieren mit der E-Mail aus
Binde nur ein, was du brauchst
Die Kerninstallation läuft offline — externe Dienste sind nicht erforderlich. Die folgenden Integrationen sind optional, werden über .env konfiguriert und aktivieren jeweils nur die zugehörige Funktion.
SMTP — E-Signatur-Workflow
Nur für den E-Signatur-Workflow auf Enterprise-Installationen nötig. Jede Standard-SMTP-URL funktioniert:
# ── Transactional email (optional; needed for /sign-requests) ──
SMTP_URL=smtp://user:[email protected]:587
EMAIL_FROM=Pluma <[email protected]>
[email protected]Branding — dein Look
Nach der ersten Anmeldung kannst du unter Einstellungen → Branding „Pluma“ durch deinen Produktnamen ersetzen, dein eigenes Logo (Kopfzeile + E-Mail) und Favicon hinterlegen, eine Akzentfarbe setzen und jeder Transaktions-E-Mail eine rechtliche Fußzeile hinzufügen. Änderungen greifen sofort — kein Neustart, kein Hantieren mit Umgebungsvariablen. Nur self-hosted; das Branding der gehosteten SaaS gehört Pluma.
Object Storage — Zustand über mehrere Knoten teilen
Standardmäßig liegen hochgeladene PDFs und Bilder im builder-data-Volume. Richte STORAGE_BACKEND auf einen beliebigen S3-kompatiblen Dienst (MinIO, Hetzner, R2, B2, AWS), wenn du horizontal skalieren, mehrere Builder-Replikate betreiben oder das Daten-Volume vom Anwendungs-Host trennen willst.
STORAGE_BACKEND=s3
S3_BUCKET=pluma
S3_ENDPOINT=https://your-s3-endpoint
S3_REGION=eu-central-1
S3_ACCESS_KEY=...
S3_SECRET_KEY=...Aktualisieren
docker compose pull
docker compose up -dDatenbank-Migrationen laufen automatisch beim Boot, bevor der HTTP-Server Traffic annimmt. Kein manueller Schritt nötig.
Betriebshinweise
- Image festpinnen. Ersetzen Sie `latest` in der Compose-Datei durch einen Versions-Tag (`mertdalbudak/pluma:<Version>`), damit Updates nur stattfinden, wenn Sie es entscheiden. Für ein Rollback setzen Sie den vorherigen Tag und führen die beiden Update-Befehle erneut aus; hat die neuere Version das Datenbankschema geändert, spielen Sie das vor dem Update erstellte Datenbank-Backup ein.
- Docker-Socket. Das optionale Einbinden des Docker-Sockets in der Compose-Datei gibt dem Container die Kontrolle über den Docker-Host — faktisch Root-Rechte. Lassen Sie es weg, sofern Sie den Publish-Workflow nicht nutzen, und niemals auf einem gemeinsam genutzten Host.
- Lizenz-Heartbeat. Bezahlte Tarife rufen den Lizenzdienst einmal täglich auf (POST /api/v1/licenses/heartbeat beim im Image hinterlegten Lizenz-Host) und senden nur den Hash des Lizenzschlüssels und die Softwareversion. Ist der Dienst nicht erreichbar, bleiben die bezahlten Limits 14 Tage in Kraft (PLUMA_LICENSE_GRACE_DAYS) und fallen danach auf Free zurück, bis ein Heartbeat gelingt. Free-Installationen funken nie nach Hause.
Lizenz nötig?
Free-Tier läuft ohne Lizenz. Advanced und Pro brauchen einen Lizenzschlüssel — auf unserer Hosted-Seite kaufen, als LICENSE_KEY in die .env eintragen und neu starten.