Przejdź do treści
Hosting własny

Hostuj Pluma samodzielnie z Dockerem

Uruchom Pluma na własnej infrastrukturze. Jeden kontener, jeden plik compose, pięć minut od czystego serwera do działającej aplikacji.

Linux · 2 vCPU · 4 GBDocker + Compose v2Licencja (tylko plany płatne)
Szybki start

Szybki start (5 minut)

1

Wybierz katalog

sudo mkdir -p /opt/pluma && sudo chown $USER:$USER /opt/pluma
cd /opt/pluma
2

Utwórz plik compose

Zapisz jako 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:
3

Utwórz plik env

Zapisz jako .env. Liczą się tylko cztery wartości — reszta jest generowana automatycznie przy pierwszym uruchomieniu.

# 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_URLGdzie żyje instalacja
LICENSE_KEYTylko plany płatne — pozostaw puste dla Free
4

Uruchom stos

docker compose up -d
docker compose logs -f pluma
5

Zweryfikuj

Jeśli oba endpointy odpowiadają, działa.

curl http://127.0.0.1:4100/health
# → {"ok":true,"service":"builder"}

Otwórz http://your-host:4100 i zarejestruj się e-mailem ustawionym jako

Integracje opcjonalne

Podłącz tylko to, czego potrzebujesz

Podstawowa instalacja działa offline — nie wymaga żadnych usług zewnętrznych. Poniższe integracje są opcjonalne, konfiguruje się je przez .env i uruchamiają wyłącznie powiązaną z nimi funkcję.

SMTP — proces podpisu elektronicznego

Wymagane tylko dla obiegu podpisu elektronicznego na instalacjach Enterprise. Zadziała każdy standardowy adres SMTP:

# ── Transactional email (optional; needed for /sign-requests) ──
SMTP_URL=smtp://user:[email protected]:587
EMAIL_FROM=Pluma <[email protected]>
[email protected]

Marka — dopasuj wygląd do siebie

Po pierwszym logowaniu na stronie Ustawienia → Marka w panelu możesz zastąpić „Pluma” nazwą swojego produktu, wstawić własne logo (nagłówek + e-mail) i favicon, ustawić kolor akcentu oraz dodać stopkę prawną do każdego e-maila transakcyjnego. Zmiany działają natychmiast — bez restartu i bez żonglowania zmiennymi środowiskowymi. Tylko w wersji self-hosted; marka hostowanego SaaS należy do Plumy.

Object storage — współdzielenie stanu między węzłami

Domyślnie wgrane pliki PDF i obrazy znajdują się w wolumenie builder-data. Skieruj STORAGE_BACKEND na dowolną usługę zgodną z S3 (MinIO, Hetzner, R2, B2, AWS), gdy chcesz skalować się poziomo, uruchomić wiele replik buildera albo przenieść wolumen danych poza host aplikacji.

STORAGE_BACKEND=s3
S3_BUCKET=pluma
S3_ENDPOINT=https://your-s3-endpoint
S3_REGION=eu-central-1
S3_ACCESS_KEY=...
S3_SECRET_KEY=...
Aktualizacja

Aktualizacja

docker compose pull
docker compose up -d

Migracje bazy danych wykonują się automatycznie przy starcie buildera, zanim serwer HTTP przyjmie ruch. Bez kroku manualnego.

Uwagi operacyjne

  • Przypnij obraz. Zamień `latest` w pliku compose na tag wersji (`mertdalbudak/pluma:<wersja>`), aby aktualizacje odbywały się wtedy, gdy zdecydujesz. Aby wrócić do poprzedniej wersji, ustaw poprzedni tag i ponownie uruchom oba polecenia aktualizacji; jeśli nowsza wersja zmieniła schemat bazy danych, przywróć kopię zapasową wykonaną przed aktualizacją.
  • Gniazdo Dockera. Opcjonalne zamontowanie gniazda Dockera w pliku compose daje kontenerowi kontrolę nad hostem Dockera — w praktyce uprawnienia roota. Pomiń je, jeśli nie korzystasz z przepływu Publish, i nigdy nie zostawiaj go na współdzielonym hoście.
  • Heartbeat licencji. Plany płatne wywołują usługę licencyjną raz dziennie (POST /api/v1/licenses/heartbeat na hoście licencji wbudowanym w obraz) z hashem klucza i wersją oprogramowania — nic więcej. Jeśli usługa jest niedostępna, limity płatne obowiązują jeszcze 14 dni (PLUMA_LICENSE_GRACE_DAYS), a potem spadają do Free, aż heartbeat się powiedzie. Instalacje Free nigdy nie łączą się z nami.

Potrzebujesz licencji?

Plan Free działa bez licencji. Plany Advanced i Pro wymagają klucza licencyjnego — kup go na naszej stronie hostowanej, wklej do .env jako LICENSE_KEY i wdróż ponownie.