Files
bentopdf/docs/sk/self-hosting/docker.md
T

29 KiB

Nasadenie s Docker / Podman

Najjednoduchší spôsob, ako BentoPDF hosťovať sami v produkčnom prostredí.

Important

Potrebné hlavičky pre prevod súborov Office

Nástroje založené na LibreOffice (prevod Word, Excel, PowerPoint) vyžadujú pre podporu SharedArrayBuffer tieto HTTP hlavičky:

  • Cross-Origin-Opener-Policy: same-origin
  • Cross-Origin-Embedder-Policy: require-corp

Stránka sa musí poskytovať aj v zabezpečenom kontexte. http://localhost funguje na lokálne testovanie, ale http://192.168.x.x ani iné IP adresy v LAN zvyčajne nevyhovujú, takže prevod Office cez obyčajné HTTP zlyhá, aj keď hlavičky existujú.

Oficiálne obrazy kontajnerov tieto hlavičky obsahujú. Ak používate reverznú proxy (Traefik, Caddy a pod.), zaistite, aby sa hlavičky zachovali alebo pridali, a pre prístup mimo loopback používajte HTTPS.

Tip

Používatelia Podman: Všetky príkazy docker fungujú s Podman, ak nahradíte docker za podman a docker-compose za podman-compose.

Rýchly štart

Tip

BentoPDF sa dodáva v dvoch zostaveniach:

  • Zostavenie Self-Hosted: ghcr.io/alam00000/bentopdf-simple:latest. Všetky PDF nástroje bez marketingových prvkov (bez úvodnej sekcie, FAQ, referencií a päty). Použite ho na interné, tímové a firemné nasadenia. Nie je to ochudobnená „lite“ verzia.
  • Komerčné zostavenie: ghcr.io/alam00000/bentopdf:latest. Úplná marketingová stránka, ktorú používa samotné bentopdf.com a držitelia komerčnej licencie s verejnými nasadeniami.

Ak si nie ste istí, stiahnite zostavenie Self-Hosted.

# Docker
docker run -d \
  --name bentopdf \
  -p 3000:8080 \
  --restart unless-stopped \
  ghcr.io/alam00000/bentopdf-simple:latest

# Podman
podman run -d \
  --name bentopdf \
  -p 3000:8080 \
  ghcr.io/alam00000/bentopdf-simple:latest

Docker Compose / Podman Compose

Vytvorte docker-compose.yml:

services:
  bentopdf:
    image: ghcr.io/alam00000/bentopdf-simple:latest
    container_name: bentopdf
    ports:
      - '3000:8080'
    restart: unless-stopped
    healthcheck:
      test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080']
      interval: 30s
      timeout: 10s
      retries: 3

Spustite:

# Docker Compose
docker compose up -d

# Podman Compose
podman-compose up -d

Zostavenie vlastného obrazu

# Dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM nginxinc/nginx-unprivileged:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]

Zostavte a spustite:

docker build -t bentopdf:custom .
docker run -d -p 3000:8080 bentopdf:custom

Premenné prostredia

Premenná Popis Predvolené
SIMPLE_MODE Zostaví variant Self-Hosted (skryje marketingové prvky bentopdf.com: úvodnú sekciu, FAQ, referencie, pätu). Všetky PDF nástroje zostanú. false
BASE_URL Nasadenie do podadresára /
VITE_WASM_PYMUPDF_URL URL modulu PyMuPDF WASM https://cdn.jsdelivr.net/npm/@bentopdf/[email protected]/
VITE_WASM_GS_URL URL modulu Ghostscript WASM https://cdn.jsdelivr.net/npm/@bentopdf/[email protected]/assets/
VITE_WASM_CPDF_URL URL modulu CoherentPDF WASM https://cdn.jsdelivr.net/npm/[email protected]/dist/
VITE_TESSERACT_WORKER_URL URL skriptu OCR workera (prázdne; použije sa predvolené CDN Tesseract.js)
VITE_TESSERACT_CORE_URL Priečinok základného runtime OCR (prázdne; použije sa predvolené CDN Tesseract.js)
VITE_TESSERACT_LANG_URL Priečinok OCR traineddata (prázdne; použije sa predvolené CDN Tesseract.js)
VITE_TESSERACT_AVAILABLE_LANGUAGES Jazyky OCR zobrazené v rozhraní, oddelené čiarkou (prázdne; zobrazí sa celý katalóg)
VITE_OCR_FONT_BASE_URL Priečinok písiem textovej vrstvy OCR (prázdne; použijú sa vzdialené URL písiem Noto)
VITE_DEFAULT_LANGUAGE Predvolený jazyk rozhrania en
VITE_BRAND_NAME Vlastný názov značky BentoPDF
VITE_BRAND_LOGO Cesta k logu relatívne k public/ images/favicon-no-bg.svg
VITE_FOOTER_TEXT Vlastný text päty/copyrightu © 2026 BentoPDF. All rights reserved.
DISABLE_TOOLS ID nástrojov na skrytie, oddelené čiarkou (prázdne; všetky nástroje zapnuté)
DISABLE_GITHUB_STARS Vynechá získanie počtu hviezdičiek GitHub pri načítaní stránky a odstráni api.github.com z CSP. Zostavenia Simple Mode ho vynechávajú vždy. false
SITE_URL Verejná URL zapísaná do odkazov canonical, hreflang a sitemap. Nechajte predvolenú hodnotu, pokiaľ nechcete, aby vyhľadávače považovali vaše nasadenie za samostatnú stránku. https://www.bentopdf.com
ALLOW_INDEXING S vlastnou SITE_URL je každá stránka označená noindex, aby vaša kópia nekonkurovala bentopdf.com vo výsledkoch vyhľadávania. Nastavte na true, ak ju majú vyhľadávače indexovať. false

URL WASM modulov sú vopred nastavené na predvolené CDN, takže všetky pokročilé funkcie fungujú hneď. Pri izolovaných (air-gapped) alebo vlastných nasadeniach ich prepíšte.

Vyhľadávače

Predvolene každá stránka označuje pre vyhľadávače bentopdf.com ako originál, takže sa vaše nasadenie nezobrazí ako duplikát. Pri súkromnej alebo internej inštancii nemusíte nič meniť.

  • Úplne vylúčiť inštanciu z výsledkov vyhľadávania: spustite kontajner s -e ROBOTS_NOINDEX=true. Stačí reštart, nie nové zostavenie.
  • Zobrazovať inštanciu vo výsledkoch vyhľadávania ako samostatnú stránku: zostavte s --build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true. Bez ALLOW_INDEXING=true vlastná SITE_URL označí každú stránku ako noindex.

Content-Security-Policy

Obraz nginx obsahuje vynucovanú hlavičku Content-Security-Policy. Direktívy CSP script-src, connect-src a font-src sa generujú pri zostavení z vyššie uvedených URL premenných VITE_*, takže hostitelia, ktorých odovzdáte cez --build-arg, sa do politiky pridajú automaticky.

Výsledok:

  • Ak pri zostavení prepíšete VITE_CORS_PROXY_URL alebo VITE_WASM_*_URL, CSP tieto pôvody automaticky povolí, bez ďalšej konfigurácie.
  • Pri URL na cdn.jsdelivr.net povoľuje script-src len presný priečinok balíka s verziou, napríklad https://cdn.jsdelivr.net/npm/@bentopdf/[email protected]/, nie celé CDN. jsDelivr poskytuje akýkoľvek verejný npm balík alebo GitHub repozitár, takže povolenie celého hostiteľa by umožnilo spustiť na vašej inštancii ktorýkoľvek z nich. URL na iných hostiteľoch sa povoľujú podľa pôvodu.
  • Ak nastavíte vlastné WASM URL za behu na stránke Rozšírené nastavenia v aplikácii, tieto pôvody nie sú v CSP a prehliadač požiadavky na ne zablokuje. Platí to aj pre inú verziu toho istého balíka na cdn.jsdelivr.net, pretože povolená je len verzia nastavená pri zostavení. Konfigurácia za behu je určená na experimenty; pre trvalé vlastné URL nastavte zodpovedajúci build arg VITE_*.
  • Izolované nasadenia, ktoré prepíšu všetky tri hodnoty VITE_WASM_*_URL, majú tieto priečinky balíkov na cdn.jsdelivr.net z CSP odstránené (každá predvolená hodnota sa nahradí, nepridá). Predvolené hodnoty Tesseract OCR na cdn.jsdelivr.net zostávajú v politike, kým nenastavíte aj tri hodnoty VITE_TESSERACT_*. Podobne nastavenie VITE_CORS_PROXY_URL nahradí verejnú predvolenú bentopdf-cors-proxy.bentopdf.workers.dev.

CSP obsahuje 'unsafe-eval' v script-src, pretože runtime LibreOffice WASM (používaný nástrojmi na prevod Word/Excel/PowerPoint) a knižnica obrázkov wasm-vips (používaná pri PDF do TIFF) kompilujú interný kód cez new Function(). Jeho odstránenie by tieto nástroje pokazilo. Ak zostavujete v SIMPLE_MODE (bez LibreOffice) a nepotrebujete PDF do TIFF, môžete ručne upraviť vygenerovaný security-headers.conf a 'unsafe-eval' odstrániť pre prísnejšiu politiku.

Pre OCR nechajte premenné VITE_TESSERACT_* prázdne, ak chcete použiť predvolené online zdroje, alebo nastavte všetky tri naraz pre vlastné či offline OCR. Čiastočné prepísanie OCR sa odmietne, pretože worker, základný runtime a priečinok traineddata musia zodpovedať. Pre úplne offline prehľadávateľné PDF nastavte aj VITE_OCR_FONT_BASE_URL, aby sa písma textovej vrstvy OCR načítali z vášho interného servera namiesto verejných URL písiem Noto.

VITE_DEFAULT_LANGUAGE nastavuje jazyk rozhrania pre nových návštevníkov. Podporované hodnoty: en, ar, be, fr, de, es, zh, zh-TW, vi, tr, id, it, pt, nl, da. Používatelia môžu jazyk stále prepnúť, mení sa len predvolená hodnota.

Príklad:

# Build with French as the default language
docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf .
docker run -d -p 3000:8080 bentopdf

Vlastná značka

Nahraďte predvolené logo, názov a text päty BentoPDF vlastnými. Vložte súbor loga do priečinka public/ (alebo použite existujúci obrázok) a pri zostavení odovzdajte premenné značky:

docker build \
  --build-arg VITE_BRAND_NAME="AcmePDF" \
  --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \
  --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \
  -t acmepdf .

Značka funguje v plnom režime aj v Simple Mode a dá sa kombinovať so všetkými ostatnými možnosťami zostavenia.

Vypnutie konkrétnych nástrojov

Skryte nástroje z rozhrania kvôli požiadavkám na súlad alebo bezpečnosť. Vypnuté nástroje sa odstránia z domovskej stránky, výsledkov vyhľadávania, klávesových skratiek a tvorcu pracovných postupov. Priamy prístup cez URL zobrazí stránku „nástroj nie je dostupný“.

ID nástroja je URL stránky bez .html. Napríklad ak je nástroj na bentopdf.com/edit-pdf.html, ID je edit-pdf.

Zistenie ID nástrojov

Najjednoduchšie: otvorte ľubovoľný nástroj v BentoPDF a pozrite sa na URL. Posledná časť cesty (bez .html) je ID nástroja.

Úplný zoznam ID nástrojov

Úpravy a anotácie: edit-pdf, bookmark, table-of-contents, page-numbers, add-page-labels, bates-numbering, add-watermark, header-footer, invert-colors, scanner-effect, adjust-colors, background-color, text-color, sign-pdf, add-stamps, remove-annotations, crop-pdf, form-filler, form-creator, remove-blank-pages

Prevod do PDF: image-to-pdf, jpg-to-pdf, png-to-pdf, webp-to-pdf, svg-to-pdf, bmp-to-pdf, heic-to-pdf, tiff-to-pdf, txt-to-pdf, markdown-to-pdf, json-to-pdf, csv-to-pdf, rtf-to-pdf, odt-to-pdf, word-to-pdf, excel-to-pdf, powerpoint-to-pdf, xps-to-pdf, mobi-to-pdf, epub-to-pdf, fb2-to-pdf, cbz-to-pdf, wpd-to-pdf, wps-to-pdf, xml-to-pdf, pages-to-pdf, odg-to-pdf, ods-to-pdf, odp-to-pdf, pub-to-pdf, vsd-to-pdf, psd-to-pdf, email-to-pdf

Prevod z PDF: pdf-to-jpg, pdf-to-png, pdf-to-webp, pdf-to-bmp, pdf-to-tiff, pdf-to-cbz, pdf-to-svg, pdf-to-csv, pdf-to-excel, pdf-to-greyscale, pdf-to-json, pdf-to-docx, extract-images, pdf-to-markdown, prepare-pdf-for-ai, pdf-to-text

Organizácia a správa: ocr-pdf, merge-pdf, alternate-merge, organize-pdf, add-attachments, extract-attachments, edit-attachments, pdf-multi-tool, pdf-layers, extract-tables, split-pdf, divide-pages, extract-pages, delete-pages, add-blank-page, reverse-pages, rotate-pdf, rotate-custom, n-up-pdf, pdf-booklet, combine-single-page, view-metadata, edit-metadata, pdf-to-zip, compare-pdfs, posterize-pdf, page-dimensions

Optimalizácia a oprava: compress-pdf, pdf-to-pdfa, fix-page-size, linearize-pdf, remove-restrictions, repair-pdf, rasterize-pdf, deskew-pdf, font-to-outline

Zabezpečenie: encrypt-pdf, sanitize-pdf, decrypt-pdf, flatten-pdf, remove-metadata, change-permissions, digital-sign-pdf, validate-signature-pdf, timestamp-pdf

Možnosť 1: Pri zostavení (Docker build arg)

docker build \
  --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \
  -t bentopdf .

Zoznam vypnutých nástrojov sa zapečie do JavaScript balíka. Zmena vyžaduje nové zostavenie.

Možnosť 2: Za behu (config.json)

Pripojte súbor config.json do poskytovaného priečinka, nové zostavenie netreba:

{
  "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"]
}
docker run -d \
  -p 3000:8080 \
  -v ./config.json:/usr/share/nginx/html/config.json:ro \
  ghcr.io/alam00000/bentopdf-simple:latest

Alebo s Docker Compose:

services:
  bentopdf:
    image: ghcr.io/alam00000/bentopdf-simple:latest
    ports:
      - '3000:8080'
    volumes:
      - ./config.json:/usr/share/nginx/html/config.json:ro

Obe metódy sa dajú kombinovať, zoznamy sa zlúčia. Ak je nástroj v ktoromkoľvek z nich, je vypnutý.

Vypnutie funkcií editora

Môžete vypnúť aj konkrétne funkcie v PDF editore (napr. začiernenie, anotácie, formuláre) bez vypnutia celého editora. Pridajte editorDisabledCategories do svojho config.json:

{
  "editorDisabledCategories": ["redaction", "annotation-stamp"]
}
Úplný zoznam kategórií editora

Priblíženie: zoom, zoom-in, zoom-out, zoom-fit-page, zoom-fit-width, zoom-marquee, zoom-level

Anotácie: annotation, annotation-markup, annotation-highlight, annotation-underline, annotation-strikeout, annotation-squiggly, annotation-ink, annotation-text, annotation-stamp

Tvary: annotation-shape, annotation-rectangle, annotation-circle, annotation-line, annotation-arrow, annotation-polygon, annotation-polyline

Formuláre: form, form-textfield, form-checkbox, form-radio, form-select, form-listbox, form-fill-mode

Začiernenie: redaction, redaction-area, redaction-text, redaction-apply, redaction-clear

Dokument: document, document-open, document-close, document-print, document-capture, document-export, document-fullscreen, document-protect

Strana: page, spread, rotate, scroll, navigation

Panel: panel, panel-sidebar, panel-search, panel-comment

Nástroje: tools, pan, pointer, capture

Výber: selection, selection-copy

História: history, history-undo, history-redo

Kategórie sú hierarchické: vypnutie nadradenej (napr. annotation) vypne všetky podradené.

Vypnutie počítadla hviezdičiek GitHub

Navigačná lišta zobrazuje aktuálny počet hviezdičiek na GitHub, ktorý sa pri načítaní stránky získava z api.github.com. Je to jediná externá požiadavka, ktorá neslúži žiadnej PDF funkcii. Vypnite ju pri zostavení, čím sa kód požiadavky odstráni z balíka a api.github.com z Content-Security-Policy:

docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf .

Zostavenia Simple Mode (bentopdf-simple) počítadlo hviezdičiek vždy vynechávajú, tento prepínač je potrebný len pri komerčnom zostavení alebo vlastných plných zostaveniach.

Vlastné WASM URL (izolované / vlastné hosťovanie)

Important

WASM URL sa zapečú do JavaScriptu pri zostavení. Súbory WASM sťahuje za behu prehliadač používateľa, Docker ich počas zostavenia nesťahuje. V izolovaných sieťach musíte súbory WASM hosťovať na internom serveri, ktorý je pre prehliadače dostupný.

Úplný postup pre izolované prostredie:

# 1. On a machine WITH internet — download WASM packages
bash scripts/prepare-airgap.sh --list-ocr-languages
bash scripts/prepare-airgap.sh --search-ocr-language german

# 2. Download WASM/OCR packages
npm pack @bentopdf/[email protected]
npm pack @bentopdf/gs-wasm
npm pack coherentpdf
npm pack [email protected]
npm pack [email protected]
mkdir -p tesseract-langdata
curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz
mkdir -p ocr-fonts
curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf

# 3. Build the image with your internal server URLs
docker build \
  --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \
  --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \
  --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \
  --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \
  --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \
  --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \
  --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \
  --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \
  -t bentopdf .

# 4. Export the image
docker save bentopdf -o bentopdf.tar

# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network

# 6. Inside the air-gapped network — load and run
docker load -i bentopdf.tar

# Extract WASM packages to your internal web server
mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts
tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1
tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1
tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1
TEMP_TESS=$(mktemp -d)
tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS"
cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js
rm -rf "$TEMP_TESS"
tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1
cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/
cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/

# Run BentoPDF
docker run -d -p 3000:8080 --restart unless-stopped bentopdf

Pre --ocr-languages použite kódy, ktoré vypíše bash scripts/prepare-airgap.sh --list-ocr-languages, alebo vyhľadávajte podľa názvu cez bash scripts/prepare-airgap.sh --search-ocr-language <term>. Keď zostavujete s obmedzenou podmnožinou OCR, odovzdajte rovnaké kódy do VITE_TESSERACT_AVAILABLE_LANGUAGES, aby aplikácia zobrazovala len pribalené jazyky. Pre úplne offline výstup OCR hosťujte aj pribalený priečinok ocr-fonts/ a nasmerujte naň VITE_OCR_FONT_BASE_URL.

Nastavením premennej na prázdny reťazec daný modul vypnete (používatelia ho musia nastaviť ručne v Rozšírených nastaveniach).

Vlastný port

Predvolene BentoPDF v kontajneri počúva na porte 8080. Ak to chcete zmeniť, nastavte za behu premennú prostredia PORT:

docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest
Premenná Popis Predvolené
PORT Port, na ktorom nginx počúva v kontajneri 8080

Funguje to so štandardným aj s nonroot Dockerfile.

Vlastné ID používateľa (PUID/PGID)

Pre prostredia, ktoré vyžadujú beh pod konkrétnym používateľom bez root práv (zariadenia NAS, Kubernetes s bezpečnostnými kontextmi, firemné politiky), BentoPDF poskytuje samostatný Dockerfile s podporou PUID/PGID v štýle LSIO.

Zostavenie a spustenie

# Build the non-root image
docker build -f Dockerfile.nonroot -t bentopdf-nonroot .

# Run with custom UID/GID
docker run -d \
  --name bentopdf \
  -p 3000:8080 \
  -e PUID=1000 \
  -e PGID=1000 \
  --restart unless-stopped \
  bentopdf-nonroot

Premenné prostredia

Premenná Popis Predvolené
PUID ID používateľa pre beh 1000
PGID ID skupiny pre beh 1000
PORT Port, na ktorom nginx počúva 8080
DISABLE_IPV6 Vypne IPv6 listener false

Docker Compose

services:
  bentopdf:
    build:
      context: .
      dockerfile: Dockerfile.nonroot
    container_name: bentopdf
    ports:
      - '3000:8080'
    environment:
      - PUID=1000
      - PGID=1000
    restart: unless-stopped

Ako to funguje

Kontajner sa spustí ako root, vytvorí používateľa so zadaným PUID/PGID, upraví vlastníctvo všetkých zapisovateľných priečinkov a potom sa cez su-exec vzdá oprávnení. Proces nginx beží celý pod vami zadaným používateľom.

Note

Štandardný Dockerfile používa nginx-unprivileged (UID 101) a odporúča sa pre väčšinu nasadení. Dockerfile.nonroot použite, len ak potrebujete konkrétne UID/GID.

Warning

PUID/PGID nemôže byť 0 (root). Vstupný bod overuje vstupy a pri neplatných hodnotách skončí s chybou.

S Traefik (reverzná proxy)

services:
  traefik:
    image: traefik:v2.10
    command:
      - '--providers.docker=true'
      - '--entrypoints.web.address=:80'
      - '--entrypoints.websecure.address=:443'
      - '[email protected]'
      - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json'
      - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web'
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt

  bentopdf:
    image: ghcr.io/alam00000/bentopdf-simple:latest
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)'
      - 'traefik.http.routers.bentopdf.entrypoints=websecure'
      - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt'
      - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080'
      # Required headers for SharedArrayBuffer (LibreOffice WASM)
      - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers'
      - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin'
      - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp'
    restart: unless-stopped

S Caddy (reverzná proxy)

services:
  caddy:
    image: caddy:2
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data

  bentopdf:
    image: ghcr.io/alam00000/bentopdf-simple:latest
    restart: unless-stopped

volumes:
  caddy_data:

Caddyfile:

pdf.example.com {
    reverse_proxy bentopdf:8080
    header Cross-Origin-Opener-Policy "same-origin"
    header Cross-Origin-Embedder-Policy "require-corp"
}

Limity zdrojov

services:
  bentopdf:
    image: ghcr.io/alam00000/bentopdf-simple:latest
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 128M

Podman Quadlet (integrácia so systemd)

Quadlet umožňuje spúšťať kontajnery Podman ako služby systemd. Je to ideálne pre produkčné nasadenia na systémoch Linux.

Základné nastavenie Quadlet

Vytvorte súbor jednotky kontajnera v ~/.config/containers/systemd/bentopdf.container (používateľ) alebo /etc/containers/systemd/bentopdf.container (systém):

[Unit]
Description=BentoPDF - Privacy-first PDF toolkit
After=network-online.target
Wants=network-online.target

[Container]
Image=ghcr.io/alam00000/bentopdf-simple:latest
ContainerName=bentopdf
PublishPort=3000:8080
AutoUpdate=registry

[Service]
Restart=always
TimeoutStartSec=300

[Install]
WantedBy=default.target

Zapnutie a spustenie

# Reload systemd to detect new unit
systemctl --user daemon-reload

# Start the service
systemctl --user start bentopdf

# Enable on boot
systemctl --user enable bentopdf

# Check status
systemctl --user status bentopdf

# View logs
journalctl --user -u bentopdf -f

Tip

Pri celosystémovom nasadení použite systemctl bez prepínača --user a súbor umiestnite do /etc/containers/systemd/.

Quadlet s kontrolou stavu

[Unit]
Description=BentoPDF with health monitoring
After=network-online.target
Wants=network-online.target

[Container]
Image=ghcr.io/alam00000/bentopdf-simple:latest
ContainerName=bentopdf
PublishPort=3000:8080
AutoUpdate=registry
HealthCmd=wget --spider -q http://localhost:8080 || exit 1
HealthInterval=30s
HealthTimeout=10s
HealthRetries=3

[Service]
Restart=always
TimeoutStartSec=300

[Install]
WantedBy=default.target

Automatická aktualizácia s Quadlet

Podman dokáže automaticky aktualizovať kontajnery, keď sú dostupné nové obrazy:

# Enable auto-update timer
systemctl --user enable --now podman-auto-update.timer

# Check for updates manually
podman auto-update

# Dry run (check without updating)
podman auto-update --dry-run

Sieťová konfigurácia Quadlet

Pre vlastnú sieťovú konfiguráciu vytvorte sieťový súbor bentopdf.network:

[Network]
Subnet=10.89.0.0/24
Gateway=10.89.0.1

Potom sa naň odkážte v súbore kontajnera:

[Container]
Image=ghcr.io/alam00000/bentopdf-simple:latest
ContainerName=bentopdf
PublishPort=3000:8080
Network=bentopdf.network

Aktualizácia

# Pull latest image
docker compose pull

# Recreate container
docker compose up -d