Gå til indhold

Selvhostingsguide ​

BentoPDF kan selvhostes på din egen infrastruktur. Denne guide gennemgår forskellige deployment-muligheder.

Hurtig start med Docker / Podman ​

Den hurtigste måde at selvhoste BentoPDF på:

TIP

BentoPDF leveres i to builds:

  • Selvhostet build: ghcr.io/alam00000/bentopdf-simple:latest. Alle PDF-værktøjer, uden marketingelementerne (ingen hero, FAQ, udtalelser eller sidefod). Brug denne til interne deployments i teams og organisationer. Den er ikke en "lite"-version med færre funktioner.
  • Kommerciel build: ghcr.io/alam00000/bentopdf:latest. Det fulde marketingsite, brugt af bentopdf.com selv og af kommercielle licensindehavere med offentligt tilgængelige deployments.

Er du i tvivl: Hent det selvhostede build.

IMPORTANT

Konvertering af Office-filer kræver SharedArrayBuffer, hvilket betyder, at appen både skal være cross-origin-isoleret og serveres fra en sikker kontekst. Det officielle image sender allerede de nødvendige COOP/COEP-headere, men browsere deaktiverer stadig SharedArrayBuffer på almindelige HTTP-origins i lokale netværk som http://192.168.x.x.

Brug kun http://localhost til test på samme enhed. Hvis brugerne tilgår BentoPDF via en LAN-IP eller et værtsnavn, skal du afslutte forbindelsen med HTTPS.

bash
# Docker
docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest

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

Eller med Docker Compose / Podman Compose:

yaml
# docker-compose.yml
services:
  bentopdf:
    image: ghcr.io/alam00000/bentopdf-simple:latest
    ports:
      - '3000:8080'
    restart: unless-stopped
bash
# Docker Compose
docker compose up -d

# Podman Compose
podman-compose up -d

Podman Quadlet (Linux Systemd) ​

Kør BentoPDF som en systemd-tjeneste. Opret ~/.config/containers/systemd/bentopdf.container:

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

[Service]
Restart=always

[Install]
WantedBy=default.target
bash
systemctl --user daemon-reload
systemctl --user enable --now bentopdf

Se Docker-deploymentguiden for den fulde Quadlet-dokumentation.

Bygning fra kildekode ​

bash
# Clone and build
git clone https://github.com/alam00000/bentopdf.git
cd bentopdf
npm install
npm run build

# The built files are in the `dist` folder

Konfigurationsindstillinger ​

Selvhostet build (Simple Mode) ​

Det selvhostede build (imaget bentopdf-simple, også kaldet Simple Mode) er funktionelt identisk med det kommercielle build. Alle PDF-værktøjer er til stede og opfører sig på samme måde. Det skjuler blot de marketingelementer, der kun giver mening på bentopdf.com selv eller i en kommerciel, offentligt tilgængelig deployment. Det er ikke en version med færre funktioner eller en "lite"-version.

Hvad det selvhostede build skjuler (kun kosmetisk, ingen PDF-funktioner fjernes):

  • Navigationslinje, hero-sektion, funktionssektion, FAQ, udtalelser, sidefod
  • Opdaterer sidens titel til "PDF-værktøjer"

Hvad det selvhostede build beholder (alt det, der faktisk arbejder med PDF):

  • Alle PDF-værktøjer (flet, opdel, rediger, underskriv, OCR, Office-konvertering osv.)
  • Understøttelse af eget brand, al konfiguration ved build og under kørsel

Det kommercielle build (ghcr.io/alam00000/bentopdf:latest) driver bentopdf.com selv og bruges af kommercielle licensindehavere med offentligt tilgængelige deployments. Det tilføjer hero, FAQ, udtalelser og sidefod, som ikke ville give mening i et internt værktøj.

Hvis du selvhoster BentoPDF til dit team, din organisation eller som internt værktøj, skal du hente det selvhostede build:

bash
# Use the pre-built image (recommended)
docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest

# Or build it yourself
SIMPLE_MODE=true npm run build

Se SIMPLE_MODE.md for alle detaljer.

Kommerciel build (offentligt tilgængelige deployments med dit eget brand) ​

Det kommercielle build (imaget bentopdf, uden suffikset -simple) driver bentopdf.com selv. Det indeholder det fulde marketingsite (hero, funktioner, FAQ, udtalelser, sidefod) oven på alle PDF-værktøjer. Brug dette build, når du vil deploye BentoPDF som en offentligt tilgængelig PDF-tjeneste under dit eget brand, for eksempel:

  • Du kører BentoPDF som hostet SaaS for slutbrugere på dit eget domæne
  • Du vil have landingsside-oplevelsen (marketingsektioner + værktøjer), ikke kun selve værktøjsfladen
  • Du er kommerciel licensindehaver og indlejrer BentoPDF i et kommercielt produkt

Kør det som det er (BentoPDF-branding, nyttigt til at få vist buildet):

bash
docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest

Byg med dit eget brand (den typiske kommercielle arbejdsgang):

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. All rights reserved." \
  -t acmepdf .

docker run -p 3000:8080 acmepdf

Alle andre build-indstillinger (BASE_URL, VITE_DEFAULT_LANGUAGE, DISABLE_TOOLS, WASM-URL-overstyringer osv.) virker på samme måde som i det selvhostede build.

Licensering

Det er tilladt at køre det kommercielle build under begge af BentoPDF's to licensmuligheder:

  • AGPL-3.0 (gratis): tilladt, hvis din deployment udgiver hele sin kildekode under AGPL, inklusive eventuelle branding-ændringer og omkringliggende forretningslogik.
  • Kommerciel licens ($79 livstid): påkrævet til lukkede/proprietære deployments, hvor du ikke gør din branding-fork eller forretningskode open source.

Se licenssiden for den fulde sammenligning. AGPL-licenserede WASM-moduler (PyMuPDF, Ghostscript, CoherentPDF) indlæses fra et CDN under kørsel, så de indgår ikke i dit image og ændrer ikke din licensmæssige stilling.

Base-URL ​

Deploy til en undermappe:

bash
BASE_URL=/pdf-tools/ npm run build

Eget brand ​

Erstat BentoPDF's standardlogo, -navn og sidefodstekst med dine egne ved build:

VariabelBeskrivelseStandard
VITE_BRAND_NAMEBrandnavn vist i sidehoved og sidefodBentoPDF
VITE_BRAND_LOGOLogosti relativt til public/images/favicon-no-bg.svg
VITE_FOOTER_TEXTBrugerdefineret sidefods-/ophavsretstekst© 2026 BentoPDF. All rights reserved.
bash
# Place your logo in public/, then build
VITE_BRAND_NAME="AcmePDF" \
VITE_BRAND_LOGO="images/acme-logo.svg" \
VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \
npm run build

Eller via Docker:

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 .

Branding virker i både fuld tilstand og Simple Mode og kan kombineres med alle andre build-indstillinger (BASE_URL, SIMPLE_MODE, VITE_DEFAULT_LANGUAGE).

Deaktivering af bestemte værktøjer ​

Skjul enkelte værktøjer af hensyn til compliance eller sikkerhed. Deaktiverede værktøjer fjernes fra startsiden, søgning, genveje, workflow-builderen og direkte URL-adgang.

Værktøjs-id'er er sidens URL uden .html. Åbn et værktøj, og se på URL'en (f.eks. edit-pdf, sign-pdf, encrypt-pdf).

Ved build (indbygget i bundlen):

bash
DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build

Under kørsel (ingen genopbygning nødvendig, montér en config.json):

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

Begge metoder kan kombineres, og listerne bliver slået sammen.

Du kan også deaktivere bestemte funktioner i PDF-editoren (f.eks. redigering af indhold) uden at deaktivere hele værktøjet ved at tilføje editorDisabledCategories til config.json. Se Docker-guiden for den fulde liste over kategorier.

Deployment-guider ​

Vælg din platform:

Almindelige problemer ​

Word / ODT / Excel / PowerPoint til PDF hænger (SharedArrayBuffer utilgængelig) ​

Symptom: LibreOffice-baserede dokumentkonverteringer (Word, ODT, Excel, PowerPoint til PDF) hænger ved ca. 55 % eller starter ikke. Browserens konsol kan vise:

ReferenceError: SharedArrayBuffer is not defined

…eller window.crossOriginIsolated rapporterer false, eller WASM-kompileringen rapporterer expected magic word 00 61 73 6d, found 1f 8b 08 08.

Årsag: LibreOffice WASM kræver SharedArrayBuffer, som browseren kun aktiverer, når siden er cross-origin-isoleret OG serveres fra en sikker kontekst. Det betyder, at to ting skal være opfyldt:

  1. Hvert svar indeholder begge headere:
    • Cross-Origin-Embedder-Policy: require-corp
    • Cross-Origin-Opener-Policy: same-origin
  2. Siden serveres fra https://... eller http://localhost. Almindelig HTTP på en LAN-IP (f.eks. http://192.168.x.x) tæller IKKE som sikker, og browsere deaktiverer SharedArrayBuffer dér.

Uoverensstemmelsen 00 61 73 6d / 1f 8b 08 08 er et separat undersymptom: De forkomprimerede .wasm.gz- / .data.gz-filer mangler svarheaderen Content-Encoding: gzip, så browseren modtager rå gzip-bytes i stedet for dekomprimeret WASM.

Løsning: Se din platformspecifikke deployment-guide for den præcise konfiguration:

Kontrollér: Åbn DevTools Console på en vilkårlig BentoPDF-side, og kør:

js
console.log(window.crossOriginIsolated); // should be true
console.log(typeof SharedArrayBuffer); // should be "function"

Hvis siden er HTTPS eller http://localhost OG begge COEP/COOP-headere findes på hvert svar, består begge kontroller. Hvis du er på http://192.168.x.x eller en anden HTTP-origin, der ikke er loopback, skal du afslutte den med HTTPS. Der findes ingen løsning, der kun bruger headere.

.mjs-filer serveres som application/octet-stream ​

Symptom: Underskriv PDF / Formularudfylder / visse andre værktøjer viser en tom læser eller kan ikke indlæses. Browserens konsol rapporterer:

Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.

Årsag: Din webserver eller reverse proxy har ingen MIME-type-tilknytning til .mjs-filer (den indbyggede PDF-læser leverer ES-moduler med den filendelse). Mange standardkonfigurationer bruger som standard application/octet-stream til ukendte filendelser, og browsere nægter at køre dem som ES-moduler.

Løsning: Se din platformspecifikke deployment-guide for det præcise udsnit:

Kontrollér: Åbn DevTools → fanen Network, find den mislykkede .mjs-anmodning, og kontrollér svarheaderen Content-Type. Den skal være application/javascript. Hvis den stadig er application/octet-stream, er det muligt, at en ydre reverse proxy eller et CDN gætter typen igen. Tjek hvert led i din serveringskæde.

WASM-konfiguration (AGPL-komponenter) ​

BentoPDF bundler ikke AGPL-licenserede behandlingsbiblioteker i sin kildekode, men forhåndskonfigurerer CDN-URL'er, så alle funktioner virker ud af boksen, uden manuel opsætning.

Nul konfiguration som standard

Fra og med v2.0.0 er WASM-moduler forhåndskonfigureret til at blive indlæst fra jsDelivr CDN via miljøvariabler. Alle avancerede funktioner virker med det samme uden brugerkonfiguration.

KomponentLicensFunktioner
PyMuPDFAGPL-3.0EPUB/MOBI/FB2/XPS-konvertering, udtrækning af billeder, udtrækning af tabeller
GhostscriptAGPL-3.0PDF/A-konvertering, komprimering, udretning af skæve sider, rasterisering
CoherentPDFAGPL-3.0Indholdsfortegnelse, vedhæftninger, PDF-sammenfletning med bogmærker

Standardmiljøvariabler ​

Disse er sat i .env.production og indbygget i buildet:

bash
VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/
VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/
VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/
VITE_TESSERACT_WORKER_URL=
VITE_TESSERACT_CORE_URL=
VITE_TESSERACT_LANG_URL=
VITE_TESSERACT_AVAILABLE_LANGUAGES=
VITE_OCR_FONT_BASE_URL=

Overstyring af WASM-URL'er ​

Du kan overstyre standardværdierne ved build til brugerdefinerede deployments:

bash
# Via Docker build args
docker build \
  --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \
  --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \
  --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \
  --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \
  --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \
  --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \
  --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \
  --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \
  -t bentopdf .

# Or via .env.production before building from source
VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build

For at deaktivere et modul helt (kræver manuel brugerkonfiguration via Avancerede indstillinger) skal du sætte dets variabel til en tom streng.

Til OCR skal du enten lade alle VITE_TESSERACT_*-variabler være tomme og beholde de online standardressourcer, eller angive worker-, core- og lang-URL'erne sammen til selvhostet/offline OCR. Hvis du kun bundler bestemte OCR-sprog, skal du også sætte VITE_TESSERACT_AVAILABLE_LANGUAGES til de samme kommaseparerede koder, så brugerfladen kun tilbyder installerede sprog, og ikke-understøttede valg fejler med en beskrivende fejl. Til fuldt offline PDF-output med søgbar tekst skal du desuden sætte VITE_OCR_FONT_BASE_URL til den interne mappe, der serverer de bundlede OCR-skrifttyper.

Brugere kan også til enhver tid overstyre disse standardværdier via Avancerede indstillinger i brugerfladen. Brugeroverstyringer gemt i browseren har forrang over miljøstandarderne.

Air-gapped / offline deployment ​

Til netværk uden internetadgang (offentlig sektor, sundhed, finans osv.). WASM-URL'erne er indbygget i JavaScript ved build. De egentlige WASM-filer downloades af brugerens browser under kørsel. Du skal derfor forberede alt på en maskine med internet og derefter overføre det til det isolerede netværk.

Automatiseret script (anbefalet) ​

Det medfølgende script prepare-airgap.sh automatiserer hele processen: det downloader WASM-pakker, bygger Docker-imaget og producerer en selvstændig bundle med et opsætningsscript.

bash
git clone https://github.com/alam00000/bentopdf.git
cd bentopdf

# Show supported OCR language codes (for --ocr-languages)
bash scripts/prepare-airgap.sh --list-ocr-languages

# Search OCR language codes by name or abbreviation
bash scripts/prepare-airgap.sh --search-ocr-language german

# Interactive mode — prompts for all options
bash scripts/prepare-airgap.sh

# Or fully automated
bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm

Dette producerer en bundle-mappe:

bentopdf-airgap-bundle/
  bentopdf.tar              # Docker image
  *.tgz                     # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract)
  tesseract-langdata/       # OCR traineddata files
  ocr-fonts/                # OCR text-layer font files
  setup.sh                  # Setup script for the air-gapped side
  README.md                 # Instructions

Overfør bundlen til det air-gappede netværk via USB, internt artefaktlager eller en godkendt metode. Kør derefter det medfølgende opsætningsscript:

bash
cd bentopdf-airgap-bundle
bash setup.sh

Opsætningsscriptet indlæser Docker-imaget, udpakker WASM-filer og starter eventuelt containeren.

Script-indstillinger:

FlagBeskrivelseStandard
--wasm-base-url <url>Hvor WASM-filerne hostes internt(påkrævet, spørges om, hvis mangler)
--image-name <name>Docker image-tagbentopdf
--output-dir <path>Output-mappe til bundlen./bentopdf-airgap-bundle
--simple-modeAktivér Simple Modefra
--base-url <path>Base-URL til undermappe (f.eks. /pdf/)/
--language <code>Standardsprog i brugerfladen (f.eks. fr, de)(ingen)
--brand-name <name>Brugerdefineret brandnavn(ingen)
--brand-logo <path>Logosti relativt til public/(ingen)
--footer-text <text>Brugerdefineret sidefodstekst(ingen)
--ocr-languages <list>Kommasepareret liste over OCR-sprog, der skal bundleseng
--list-ocr-languagesUdskriv understøttede OCR-koder og navne, og afslutfra
--search-ocr-language <term>Søg efter OCR-koder via navn eller forkortelsefra
--dockerfile <path>Dockerfile, der skal brugesDockerfile
--skip-dockerSpring Docker-build og eksport overfra
--skip-wasmSpring WASM-download over (genbrug eksisterende .tgz-filer)fra

Den interaktive prompt accepterer også list for at udskrive den fulde liste over understøttede Tesseract-koder og search <term> for at finde match som search german eller search chi.

Krav om samme origin

WASM-filer skal serveres fra samme origin som BentoPDF-appen. Web Workers bruger importScripts(), som ikke kan indlæse scripts på tværs af origins. Hvis BentoPDF for eksempel kører på https://internal.example.com, skal WASM-base-URL'en også være https://internal.example.com/wasm.

Manuelle trin ​

Hvis du foretrækker at gøre det manuelt uden scriptet

Trin 1: Download WASM- og OCR-pakkerne (på en maskine med internet)

bash
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

Trin 2: Byg Docker-imaget med interne URL'er

bash
git clone https://github.com/alam00000/bentopdf.git
cd bentopdf

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_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \
  -t bentopdf .

Trin 3: Eksportér Docker-imaget

bash
docker save bentopdf -o bentopdf.tar

Trin 4: Overfør til det air-gappede netværk

Kopiér via USB, internt artefaktlager eller en godkendt overførselsmetode:

  • bentopdf.tar: Docker-imaget
  • De fem .tgz WASM/OCR-pakker fra trin 1
  • Mappen tesseract-langdata/ fra trin 1
  • Mappen ocr-fonts/ fra trin 1

Trin 5: Opsætning inde i det air-gappede netværk

bash
# Load the Docker image
docker load -i bentopdf.tar

# Extract WASM packages
mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts
tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1
tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1
tar xzf coherentpdf-*.tgz -C ./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" ./wasm/ocr/worker.min.js
rm -rf "$TEMP_TESS"
tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1
cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/
cp ./ocr-fonts/* ./wasm/ocr/fonts/

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

Sørg for, at filerne er tilgængelige på de URL'er, du konfigurerede i trin 2, herunder .../ocr/worker.min.js, .../ocr/core, .../ocr/lang-data og .../ocr/fonts.

Bygger du fra kildekode i stedet for Docker?

Sæt variablerne i .env.production, før du kører npm run build:

bash
VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/
VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/
VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/
VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js
VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core
VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data
VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts

Hosting af din egen WASM-proxy ​

Hvis du skal servere AGPL WASM-filer med korrekte CORS-headere, kan du deploye en simpel proxy. Se Cloudflare WASM Proxy-guiden for et eksempel på en implementering.

Hvorfor adskilt?

Denne adskillelse sikrer:

  • Klar juridisk compliance for kommercielle brugere
  • BentoPDF's kerne forbliver under sin dobbeltlicens (AGPL-3.0 / kommerciel)
  • WASM-filer indlæses under kørsel og bundles ikke i kildekoden

Systemkrav ​

KravMinimum
Lagerplads~100 MB (kerne uden AGPL-moduler)
RAM512 MB
CPUEnhver moderne processor

TIP

BentoPDF er et statisk site, så der kræves ingen database eller backend-server!

Dobbelt licenseret under AGPL-3.0 og Kommerciel licens.