Hoppa till innehåll

Driftsätt med Docker / Podman ​

Det enklaste sättet att självhosta BentoPDF i en produktionsmiljö.

IMPORTANT

Obligatoriska rubriker för konvertering av Office-filer

LibreOffice-baserade verktyg (konvertering av Word, Excel och PowerPoint) kräver dessa HTTP-rubriker för stöd för SharedArrayBuffer:

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

Sidan måste dessutom serveras från en säker kontext. http://localhost fungerar för lokal testning, men http://192.168.x.x och andra LAN-adresser kvalificerar sig oftast inte, så Office-konvertering över vanlig HTTP misslyckas även om rubrikerna finns.

De officiella containerbilderna inkluderar dessa rubriker. Om du använder en reverse proxy (Traefik, Caddy m.fl.), se till att rubrikerna bevaras eller läggs till, och använd HTTPS för åtkomst som inte är loopback.

TIP

Podman-användare: Alla docker-kommandon fungerar med Podman om du ersätter docker med podman och docker-compose med podman-compose.

Snabbstart ​

TIP

BentoPDF levereras i två byggen:

  • Self-Hosted-bygget: ghcr.io/alam00000/bentopdf-simple:latest. Alla PDF-verktyg, utan marknadsföringsdelarna (ingen hero, FAQ, omdömen eller sidfot). Använd detta för interna driftsättningar i team och organisationer. Det är inte en "lite"-version med färre funktioner.
  • Commercial-bygget: ghcr.io/alam00000/bentopdf:latest. Hela marknadsföringssajten, som används av bentopdf.com själv och av innehavare av kommersiell licens som kör publika driftsättningar.

Är du osäker: hämta Self-Hosted-bygget.

bash
# 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 ​

Skapa docker-compose.yml:

yaml
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

Kör:

bash
# Docker Compose
docker compose up -d

# Podman Compose
podman-compose up -d

Bygg din egen image ​

dockerfile
# 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;"]

Bygg och kör:

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

Miljövariabler ​

VariabelBeskrivningStandard
SIMPLE_MODEBygg Self-Hosted-varianten (döljer marknadsföringsdelarna från bentopdf.com: hero, FAQ, omdömen, sidfot). Alla PDF-verktyg finns kvar.false
BASE_URLDriftsätt i en underkatalog/
VITE_WASM_PYMUPDF_URLURL till PyMuPDF WASM-modulenhttps://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/
VITE_WASM_GS_URLURL till Ghostscript WASM-modulenhttps://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/
VITE_WASM_CPDF_URLURL till CoherentPDF WASM-modulenhttps://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/
VITE_TESSERACT_WORKER_URLURL till OCR-workerskriptet(tom; använd Tesseract.js standard-CDN)
VITE_TESSERACT_CORE_URLKatalog för OCR-kärnkörmiljön(tom; använd Tesseract.js standard-CDN)
VITE_TESSERACT_LANG_URLKatalog för OCR traineddata(tom; använd Tesseract.js standard-CDN)
VITE_TESSERACT_AVAILABLE_LANGUAGESKommaseparerade OCR-språk som visas i gränssnittet(tom; visa hela katalogen)
VITE_OCR_FONT_BASE_URLKatalog för typsnitt till OCR-textlager(tom; använd externa Noto-typsnitts-URL:er)
VITE_DEFAULT_LANGUAGEStandardspråk för gränssnitteten
VITE_BRAND_NAMEEget varumärkesnamnBentoPDF
VITE_BRAND_LOGOLogotypens sökväg relativt public/images/favicon-no-bg.svg
VITE_FOOTER_TEXTEgen sidfots-/upphovsrättstext© 2026 BentoPDF. All rights reserved.
DISABLE_TOOLSKommaseparerade verktygs-ID:n som ska döljas(tom; alla verktyg aktiverade)
DISABLE_GITHUB_STARSHoppa över hämtningen av GitHub-stjärnor vid sidladdning och ta bort api.github.com från CSP. Simple Mode-byggen hoppar alltid över den.false
SITE_URLPublik URL som skrivs in i canonical-, hreflang- och sitemap-länkar. Behåll standardvärdet om du inte vill att sökmotorer ska behandla din driftsättning som en egen webbplats.https://www.bentopdf.com
ALLOW_INDEXINGMed en egen SITE_URL markeras varje sida noindex så att din kopia inte konkurrerar med bentopdf.com i sökresultaten. Sätt till true för att låta sökmotorer indexera den.false

WASM-modulernas URL:er är förkonfigurerade med CDN-standardvärden, så alla avancerade funktioner fungerar direkt. Åsidosätt dem för luftgappade eller självhostade driftsättningar.

Sökmotorer ​

Som standard pekar varje sida sökmotorer till bentopdf.com som originalet, så att din driftsättning inte visas som en dubblett. Du behöver inte ändra något för en privat eller intern instans.

  • Håll din instans helt borta från sökresultat: kör containern med -e ROBOTS_NOINDEX=true. Det kräver bara en omstart, inte ett nytt bygge.
  • Gör din instans till en egen webbplats i sökresultaten: bygg med --build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true. Utan ALLOW_INDEXING=true markerar en egen SITE_URL varje sida noindex.

Content-Security-Policy ​

Nginx-imagen levereras med en tillämpad Content-Security-Policy-rubrik. CSP:ns direktiv script-src, connect-src och font-src genereras vid bygget från URL-variablerna VITE_* ovan: alla värdar du anger via --build-arg läggs automatiskt till i policyn.

Det innebär att:

  • Om du åsidosätter VITE_CORS_PROXY_URL eller VITE_WASM_*_URL vid bygget tillåter CSP dessa ursprung automatiskt, ingen extra konfiguration behövs.
  • För URL:er på cdn.jsdelivr.net tillåter script-src bara den exakta versionerade paketmappen, till exempel https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/, inte hela CDN:et. jsDelivr serverar alla publika npm-paket och GitHub-repositorier, så om hela värden tilläts kunde vilket som helst av dem köras på din instans. URL:er på andra värdar tillåts per ursprung.
  • Om du konfigurerar egna WASM-URL:er vid körning via sidan Avancerade inställningar i appen finns dessa ursprung inte i CSP och webbläsaren blockerar hämtningar från dem. Detta gäller även en annan version av samma paket på cdn.jsdelivr.net, eftersom bara den version som angavs vid bygget tillåts. Konfiguration vid körning är avsedd för experiment; för permanenta egna URL:er, ange motsvarande VITE_* build arg.
  • Luftgappade driftsättningar som åsidosätter alla tre VITE_WASM_*_URL-värden får även dessa paketmappar på cdn.jsdelivr.net borttagna från CSP (varje standardvärde ersätts, läggs inte till). Tesseract OCR-standardvärdena på cdn.jsdelivr.net finns kvar i policyn tills du även anger de tre VITE_TESSERACT_*-värdena. På samma sätt ersätter VITE_CORS_PROXY_URL den publika standardadressen bentopdf-cors-proxy.bentopdf.workers.dev.

CSP innehåller 'unsafe-eval' i script-src eftersom LibreOffice WASM-körmiljön (som används av verktygen för konvertering av Word/Excel/PowerPoint) och bildbiblioteket wasm-vips (som används av PDF till TIFF) kompilerar intern dispatch-kod via new Function(). Att ta bort det skulle bryta dessa verktyg. Om du bygger i SIMPLE_MODE (utan LibreOffice) och inte behöver PDF till TIFF kan du manuellt redigera den genererade security-headers.conf och ta bort 'unsafe-eval' för en striktare policy.

För OCR, lämna variablerna VITE_TESSERACT_* tomma för att använda de förvalda onlineresurserna, eller ange alla tre tillsammans för självhostad/offline-OCR. Partiella OCR-åsidosättningar avvisas eftersom workern, kärnkörmiljön och traineddata-katalogen måste matcha varandra. För sökbara PDF-filer helt offline, ange även VITE_OCR_FONT_BASE_URL så att OCR-textlagrets typsnitt laddas från din interna server i stället för de publika Noto-typsnitts-URL:erna.

VITE_DEFAULT_LANGUAGE anger gränssnittsspråk för förstagångsbesökare. Värden som stöds: en, ar, be, fr, de, es, zh, zh-TW, vi, tr, id, it, pt, nl, da. Användare kan fortfarande byta språk, det är bara standardvärdet som ändras.

Exempel:

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

Eget varumärke ​

Ersätt standardlogotypen, namnet och sidfotstexten för BentoPDF med dina egna. Lägg din logotypfil i mappen public/ (eller använd en befintlig bild) och ange sedan varumärkesvariablerna vid bygget:

bash
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 .

Varumärkesanpassning fungerar i både fullt läge och Simple Mode och kan kombineras med alla andra alternativ vid bygget.

Inaktivera specifika verktyg ​

Dölj verktyg i gränssnittet av efterlevnads- eller säkerhetsskäl. Inaktiverade verktyg tas bort från startsidan, sökresultat, kortkommandon och arbetsflödesbyggaren. Direkt åtkomst via URL visar en sida om att verktyget inte är tillgängligt.

Verktygs-ID:n är sidans URL utan .html. Om verktyget till exempel finns på bentopdf.com/edit-pdf.html är ID:t edit-pdf.

Hitta verktygs-ID:n ​

Det enklaste sättet: öppna ett verktyg i BentoPDF och titta på URL:en. Sista delen av sökvägen (utan .html) är verktygets ID.

Fullständig lista över verktygs-ID:n

Redigera och kommentera: 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

Konvertera till 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

Konvertera från 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

Organisera och hantera: 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

Optimera och reparera: compress-pdf, pdf-to-pdfa, fix-page-size, linearize-pdf, remove-restrictions, repair-pdf, rasterize-pdf, deskew-pdf, font-to-outline

Säkerhet: encrypt-pdf, sanitize-pdf, decrypt-pdf, flatten-pdf, remove-metadata, change-permissions, digital-sign-pdf, validate-signature-pdf, timestamp-pdf

Alternativ 1: Vid bygget (Docker build arg) ​

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

Detta bakar in listan över inaktiverade verktyg i JavaScript-paketet. Ändringar kräver ett nytt bygge.

Alternativ 2: Vid körning (config.json) ​

Montera en config.json-fil i den serverade katalogen, inget nytt bygge behövs:

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

Eller med Docker Compose:

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

Båda metoderna kan kombineras, listorna slås ihop. Om ett verktyg finns i någon av dem inaktiveras det.

Inaktivera redigeringsfunktioner ​

Du kan också inaktivera specifika funktioner i PDF-redigeraren (t.ex. maskering, kommentarer, formulär) utan att inaktivera hela redigeringsverktyget. Lägg till editorDisabledCategories i din config.json:

json
{
  "editorDisabledCategories": ["redaction", "annotation-stamp"]
}
Fullständig lista över redigerarkategorier

Zoom: zoom, zoom-in, zoom-out, zoom-fit-page, zoom-fit-width, zoom-marquee, zoom-level

Kommentarer: annotation, annotation-markup, annotation-highlight, annotation-underline, annotation-strikeout, annotation-squiggly, annotation-ink, annotation-text, annotation-stamp

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

Formulär: form, form-textfield, form-checkbox, form-radio, form-select, form-listbox, form-fill-mode

Maskering: 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

Sida: page, spread, rotate, scroll, navigation

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

Verktyg: tools, pan, pointer, capture

Markering: selection, selection-copy

Historik: history, history-undo, history-redo

Kategorierna är hierarkiska: om du inaktiverar en överordnad kategori (t.ex. annotation) inaktiveras alla underordnade.

Inaktivera GitHub-stjärnräknaren ​

Navigeringsfältet visar ett live-antal GitHub-stjärnor som hämtas från api.github.com vid sidladdning. Det är den enda externa förfrågan som inte tjänar en PDF-funktion. Inaktivera den vid bygget för att ta bort hämtningskoden från paketet och ta bort api.github.com från Content-Security-Policy:

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

Simple Mode-byggen (bentopdf-simple) hoppar alltid över stjärnräknaren, flaggan behövs bara för Commercial-bygget eller egna fullständiga byggen.

Egna WASM-URL:er (luftgappat / självhostat) ​

IMPORTANT

WASM-URL:erna bakas in i JavaScript vid bygget. WASM-filerna laddas ned av användarens webbläsare vid körning, Docker laddar inte ned dem under bygget. För luftgappade nätverk måste du hosta WASM-filerna på en intern server som webbläsare kan nå.

Fullständigt arbetsflöde för luftgappade miljöer:

bash
# 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/pymupdf-wasm@0.11.14
npm pack @bentopdf/gs-wasm
npm pack coherentpdf
npm pack tesseract.js@7.0.0
npm pack tesseract.js-core@7.0.0
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

Använd koderna som skrivs ut av bash scripts/prepare-airgap.sh --list-ocr-languages, eller sök på namn med bash scripts/prepare-airgap.sh --search-ocr-language <term>, för --ocr-languages. När du bygger med en begränsad uppsättning OCR-språk, ange samma koder till VITE_TESSERACT_AVAILABLE_LANGUAGES så att appen bara visar medföljande språk. För fullständig OCR offline, hosta även den medföljande katalogen ocr-fonts/ och peka VITE_OCR_FONT_BASE_URL mot den.

Sätt en variabel till en tom sträng för att inaktivera den modulen (användare måste då konfigurera manuellt via Avancerade inställningar).

Egen port ​

Som standard lyssnar BentoPDF på port 8080 i containern. För att ändra detta, ange miljövariabeln PORT vid körning:

bash
docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest
VariabelBeskrivningStandard
PORTNginx lyssningsport i containern8080

Detta fungerar med både standard-Dockerfile och nonroot-Dockerfile.

Eget användar-ID (PUID/PGID) ​

För miljöer som kräver att köra som en specifik icke-root-användare (NAS-enheter, Kubernetes med säkerhetskontexter, organisationspolicyer) tillhandahåller BentoPDF en separat Dockerfile med PUID/PGID-stöd i LSIO-stil.

Bygg och kör ​

bash
# 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

Miljövariabler ​

VariabelBeskrivningStandard
PUIDAnvändar-ID att köra som1000
PGIDGrupp-ID att köra som1000
PORTNginx lyssningsport8080
DISABLE_IPV6Inaktivera IPv6-lyssnarefalse

Docker Compose ​

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

Så fungerar det ​

Containern startar som root, skapar en användare med angivet PUID/PGID, justerar ägarskapet för alla skrivbara kataloger och släpper sedan behörigheter med su-exec. Nginx-processen körs helt som din angivna användare.

NOTE

Standard-Dockerfile använder nginx-unprivileged (UID 101) och rekommenderas för de flesta driftsättningar. Använd Dockerfile.nonroot bara när du behöver ett specifikt UID/GID.

WARNING

PUID/PGID kan inte vara 0 (root). Entrypoint validerar indata och avslutas med ett fel vid ogiltiga värden.

Med Traefik (reverse proxy) ​

yaml
services:
  traefik:
    image: traefik:v2.10
    command:
      - '--providers.docker=true'
      - '--entrypoints.web.address=:80'
      - '--entrypoints.websecure.address=:443'
      - '--certificatesresolvers.letsencrypt.acme.email=you@example.com'
      - '--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

Med Caddy (reverse proxy) ​

yaml
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"
}

Resursgränser ​

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

Podman Quadlet (Systemd-integration) ​

Quadlet låter dig köra Podman-containrar som systemd-tjänster. Det är idealiskt för produktionsdriftsättningar på Linux-system.

Grundläggande Quadlet-uppsättning ​

Skapa en container unit-fil i ~/.config/containers/systemd/bentopdf.container (användare) eller /etc/containers/systemd/bentopdf.container (system):

ini
[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

Aktivera och starta ​

bash
# 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

För driftsättning på systemnivå, använd systemctl utan flaggan --user och placera filen i /etc/containers/systemd/.

Quadlet med hälsokontroll ​

ini
[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

Automatisk uppdatering med Quadlet ​

Podman kan uppdatera containrar automatiskt när nya images finns:

bash
# 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

Nätverkskonfiguration för Quadlet ​

För egen nätverkskonfiguration, skapa en nätverksfil bentopdf.network:

ini
[Network]
Subnet=10.89.0.0/24
Gateway=10.89.0.1

Referera sedan till den i din containerfil:

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

Uppdatera ​

bash
# Pull latest image
docker compose pull

# Recreate container
docker compose up -d

Dubbellicensierad under AGPL-3.0 och kommersiell licens.