Auto-hébergez Pluma avec Docker
Faites tourner Pluma sur votre propre infrastructure. Un conteneur, un fichier compose, cinq minutes d'un serveur vierge à l'application en marche.
Démarrage rapide (5 minutes)
Choisissez un répertoire
Choisissez un répertoire
sudo mkdir -p /opt/pluma && sudo chown $USER:$USER /opt/pluma
cd /opt/plumaCréez le fichier compose
Créez le fichier compose
Enregistrer sous 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:
Créez le fichier env
Créez le fichier env
Enregistrer sous .env. Seulement quatre valeurs comptent — le reste est généré automatiquement au premier démarrage.
# 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_URLOù l’installation est hébergéeLICENSE_KEYOffres payantes seulement — laissez vide pour FreeDémarrez la stack
Démarrez la stack
docker compose up -d
docker compose logs -f plumaVérifiez
Vérifiez
Si les deux endpoints répondent, c’est en ligne.
curl http://127.0.0.1:4100/health
# → {"ok":true,"service":"builder"}Ouvrez http://your-host:4100 et inscrivez-vous avec l’e-mail défini dans
N'activez que ce dont vous avez besoin
L’installation de base fonctionne hors ligne — aucun service externe requis. Les intégrations ci-dessous sont facultatives, se configurent via .env et n’activent que la fonctionnalité à laquelle elles sont associées.
SMTP — flux de signature électronique
Nécessaire uniquement pour le flux de signature électronique sur les installations Enterprise. Toute URL SMTP standard convient :
# ── Transactional email (optional; needed for /sign-requests) ──
SMTP_URL=smtp://user:[email protected]:587
EMAIL_FROM=Pluma <[email protected]>
[email protected]Marque — à votre image
Après la première connexion, la page Paramètres → Marque du tableau de bord vous permet de remplacer « Pluma » par le nom de votre produit, d’utiliser votre propre logo (en-tête + e-mail) et favicon, de définir une couleur d’accent et d’ajouter un pied de page légal à chaque e-mail transactionnel. Les changements sont appliqués immédiatement — sans redémarrage ni manipulation de variables d’environnement. Auto-hébergé uniquement ; la marque du SaaS hébergé appartient à Pluma.
Stockage objet — partager l’état entre les nœuds
Par défaut, les PDF et images téléversés résident dans le volume builder-data. Pointez STORAGE_BACKEND vers n’importe quel service compatible S3 (MinIO, Hetzner, R2, B2, AWS) si vous souhaitez évoluer horizontalement, exécuter plusieurs réplicas du builder ou sortir le volume de données de l’hôte applicatif.
STORAGE_BACKEND=s3
S3_BUCKET=pluma
S3_ENDPOINT=https://your-s3-endpoint
S3_REGION=eu-central-1
S3_ACCESS_KEY=...
S3_SECRET_KEY=...Mise à jour
docker compose pull
docker compose up -dLes migrations de base de données s'exécutent automatiquement au démarrage du builder, avant que le serveur HTTP n'accepte le trafic. Aucune étape manuelle.
Notes d’exploitation
- Épinglez l’image. Remplacez `latest` dans le fichier compose par un tag de version (`mertdalbudak/pluma:<version>`) pour que les mises à jour n’aient lieu que lorsque vous le décidez. Pour revenir en arrière, remettez le tag précédent et relancez les deux commandes de mise à jour ; si la nouvelle version a modifié le schéma de la base, restaurez la sauvegarde prise avant la mise à jour.
- Socket Docker. Le montage optionnel du socket Docker dans le fichier compose donne au conteneur le contrôle de l’hôte Docker — l’équivalent de root. Omettez-le sauf si vous utilisez le flux Publish, et jamais sur un hôte partagé.
- Battement de licence. Les offres payantes appellent le service de licence une fois par jour (POST /api/v1/licenses/heartbeat sur l’hôte de licence intégré à l’image) avec le hash de la clé et la version du logiciel — rien d’autre. Si le service est injoignable, les plafonds payants restent en vigueur 14 jours (PLUMA_LICENSE_GRACE_DAYS), puis retombent à Free jusqu’à ce qu’un battement réussisse. Les installations Free n’appellent jamais.
Besoin d'une licence ?
L'offre Free fonctionne sans licence. Les offres Advanced et Pro nécessitent une clé de licence — achetez-en une sur notre site hébergé, collez-la dans votre .env comme LICENSE_KEY et redéployez.