SSD Nodes Learn Hosting plans →
Gidsen Matt ConnorDoor Matt Connor

HRConvert2 zelf hosten: handleiding voor eigen server

Host HRConvert2 op uw eigen VPS om gevoelige bestanden veilig te verwerken. Leer hoe u Docker of Apache configureert, bubblewrap sandboxing instelt en uploadlimieten beheert.

Waarom u een bestandsconverter zelf host

Een bestandsconverter die u zelf host, houdt het bestand op uw eigen schijf. Dat is de volledige reden om er een te gebruiken. Een gratis online converter neemt de upload aan en geeft u geen mogelijkheid om te weten wat er daarna mee gebeurt. Als het bestand een ondertekend klantcontract of een gescand medisch dossier is, vormt de upload zelf al het incident. HRConvert2 is een bestandsconversieserver met slepen-en-neerzettenfunctionaliteit, geschreven in PHP en uitgebracht onder de GPLv3-licentie. Deze handleiding is geschreven voor versie 3.7.4, die op 18 August 2026 is uitgebracht. Het project heeft sindsdien een snelle ontwikkeling doorgemaakt: de nieuwste release op 13 October 2026 is v3.9.1, gepubliceerd op 6 September 2026. Het project claimt ondersteuning voor 488 indelingen.

Het programma heeft geen database, accounts of cookies. Een gebruiker krijgt een tijdelijke directory. Elke conversie wordt uitgevoerd door een lokale commandlinetool: LibreOffice voor documenten, FFmpeg voor audio en video, ImageMagick voor afbeeldingen, Tesseract voor optical character recognition (OCR) en een lange reeks kleinere tools voor de overige indelingen. HRConvert2 verzorgt de uploadpagina, de verwerkingsketen en de opruimwerkzaamheden daaromheen.

Het converteert een bestand van de ene indeling naar een andere. Het is geen kantoorsoftware in de browser. Als u wilt dat mensen documenten in een tabblad bewerken, vergelijk dan in plaats daarvan zelfgehoste OnlyOffice en Collabora. Het is ook geen opslag. De geconverteerde uitvoer moet worden verwijderd. Als bestanden ergens moeten worden bewaard, hoort die taak bij een zelfgehoste bestandsbeheerder.

Wat u nodig heeft

Debian of Ubuntu, Apache 2.4, PHP 8 of hoger, en bubblewrap. Bubblewrap (bwrap) is de sandbox en is niet optioneel: een server die geen sandbox kan opbouwen, weigert de conversie in plaats van deze zonder sandbox uit te voeren. De upstream README vermeldt dat een Raspberry Pi Model B+ voldoende is, wat klopt voor het PHP-gedeelte. De converter-binaries bepalen uw werkelijke hardwarevereisten; dit wordt verderop behandeld.

Er zijn twee manieren om te beginnen. De Docker-image werkt direct. De installatie van Apache en PHP kost een avond, maar laat u precies zien wat er op de server aanwezig is.

Voer dit vanavond uit met Docker

De image bevat alle converterbinaries en is daarom groot: ongeveer 3 GB in augustus 2026. Controleer de beschikbare schijfruimte voordat u de image binnenhaalt.

Tags zijn hier belangrijk. Deze handleiding gebruikt v3.7.2 als vaste versie. Dat was op 17 augustus 2026 de nieuwste tag op Docker Hub en ook de nieuwste GitHub-release van die dag. v3.7.4 volgde op 18 augustus. Op 13 oktober 2026 is de nieuwste GitHub-release v3.9.1 (6 september 2026). De nieuwste Docker Hub-tags zijn edge (22 september 2026) en latest, namelijk v3.8.4 (31 augustus 2026). De tag latest verandert zonder waarschuwing. Deze applicatie verwerkt een groot aantal invoerformaten. Leg daarom een versie vast en voer upgrades bewust uit.

docker pull zelon88/hrconvert2:v3.7.2
docker run -d --name hrconvert2 \
  -p 127.0.0.1:8080:80 \
  --security-opt seccomp=unconfined \
  zelon88/hrconvert2:v3.7.2
docker ps
curl -I http://127.0.0.1:8080/

Een gezonde container blijft in de status Up en curl retourneert HTTP/1.1 200 OK. Een container die steeds opnieuw wordt gestart, heeft een probleem tijdens het opstarten. Lees daarom eerst docker logs hrconvert2 voordat u iets anders wijzigt.

Twee flags zijn belangrijk. -p 127.0.0.1:8080:80 publiceert de poort alleen op loopback. De converter is daardoor niet bereikbaar totdat u er bewust een proxy voor plaatst. Het huidige voorbeeld van het project koppelt -p 8080:80. Die poort luistert op elke interface, ook op de publieke interface. --security-opt seccomp=unconfined is nodig omdat bubblewrap zijn sandbox opbouwt met user-namespace- en mount-systeemaanroepen die het standaardseccomp-profiel van Docker blokkeert. In de opmerkingen bij 3.7 config.php staat bovendien dat sommige hosts ook --security-opt apparmor=unconfined nodig hebben. Zonder deze flag mislukken conversies. De applicatie geeft de reden als volgt weer: A sandbox blocks the required syscalls unless it was started with the correct options.

Deze flag heeft een duidelijke keerzijde. U versoepelt het syscall-filter van de container, zodat de applicatie daarin zelf een strengere sandbox kan opbouwen. De twee instellingen die dit gedrag bepalen, zijn $RequireSandbox en $RequireSandboxOnDocker in Resources/config.php. De release v3.7.4 levert deze als TRUE en FALSE. De hier vastgelegde tag v3.7.2 levert beide als FALSE, omdat de opmerkingen aangeven dat een container $RequireSandbox moet uitschakelen en $RequireSandboxOnDocker de beslissing moet laten nemen. Omdat de Docker-vereiste standaard is uitgeschakeld, kan een container zonder de seccomp-flag converteren zonder sandbox. Zodra de flag is toegevoegd, stelt u $RequireSandboxOnDocker = TRUE; in. Daarmee wordt het weigeringsgedrag binnen de container hersteld.

Nieuwere images starten anders. Het project heeft het Docker-proces gewijzigd in v3.8.0 (25 augustus 2026). De huidige README en Docker Hub-pagina starten de container met --cap-add SYS_ADMIN in plaats van de seccomp-optie. Daarbij staat vermeld dat conversies zonder deze optie worden geweigerd. Als u uw vaste versie wijzigt naar een 3.8- of 3.9-tag, gebruikt u de flags die bij die image zijn gedocumenteerd. Deze capability is ruim, dus houd de 127.0.0.1-poortbinding aan.

Als Docker nog niet op deze machine is geïnstalleerd, configureert u eerst de daemon. Docker uitvoeren op een VPS behandelt de installatie, het opslagstuurprogramma en de manier waarop Docker zijn eigen firewallregels schrijft.

Installeer het in plaats daarvan met Apache en PHP

Tot en met v3.7.4 beschreef het bestand Documentation/INSTALLATION_INSTRUCTIONS.txt in de repository een handmatige installatie in negen stappen. Deze sectie volgt die installatie. Sinds v3.8.0 beschrijft hetzelfde bestand in plaats daarvan een installatiescript. Voer sudo bash Documentation/Build/hrconvert2-setup.sh uit vanuit de gekloonde repository. Het script installeert de afhankelijkheden, schrijft de PHP-instellingen als een drop-inbestand in plaats van php.ini te bewerken en breidt het AppArmor-profiel voor bubblewrap uit. Met php convertCore.php -v en --status controleert u daarna het resultaat. De handmatige methode duurt langer, maar u weet precies wat er op het systeem is geïnstalleerd. Dit is de opbouw. Begin met de webserver, de programmeertaal en de sandbox:

sudo apt update
sudo apt install -y apache2 php libapache2-mod-php php-all-dev php8.3-zip php8.3-gd bubblewrap

De namen in php8.3-* komen overeen met Ubuntu 24.04. Voer php -v uit en gebruik het voorvoegsel dat bij uw versie hoort. Deze pakketnamen veranderen namelijk met elke PHP-release. Met het verkeerde voorvoegsel krijgt u Unable to locate package.

Daarna volgen de converters. Dit omvat documenten, afbeeldingen, audio, video en OCR. Dat is het grootste deel van de conversies die gebruikers daadwerkelijk uitvoeren:

sudo apt install -y imagemagick ffmpeg libreoffice-common libreoffice-java-common \
  default-jre ghostscript poppler-utils libgxps-utils tesseract-ocr inkscape \
  xvfb clamav curl tar libxcb-cursor0

Voor archiefformaten, 3D-modellen, ebooks en opstartbare ISO-images zijn meer pakketten nodig. Sommige daarvan bevinden zich in de multiverse-component van Ubuntu. In v3.7.4 bevatte stap 3 van de officiële instructies de volledige apt-lijst. Stap 5 bevatte de builds vanaf de broncode. De huidige handleiding bevat geen pakketlijsten. Het installatieprogramma leest het manifest Resources/Engine/Contract/depends.php. Met php convertCore.php --setup --check-depends geeft u de actuele lijst en de status daarvan weer. Twee afhankelijkheden kunnen ook vanaf de broncode worden gebouwd. De repository levert Documentation/Build/ffmpeg-build.sh voor encoders die ontbreken in het meegeleverde FFmpeg. Daarnaast levert de repository Documentation/Build/build-imagemagick-v7.sh voor ImageMagick 7 op Ubuntu 22.04 of 24.04, waar nog de 6.9-branch wordt meegeleverd. Ubuntu 25.10 en 26.04 LTS leveren ImageMagick 7.1. Ondersteuning voor ebooks komt van het eigen installatieprogramma van calibre. De instructies voor versie 3.7 gaven daarvoor één regel:

sudo -v && wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdin

Dit is een leveranciersscript dat als root naar een shell wordt doorgestuurd. Dit is de upstream-methode en is optioneel. Sla deze stap over als u geen ebookconversie nodig hebt.

Vervolgens de limieten van PHP. Conversies duren lang en bestanden zijn groot, waardoor de standaardwaarden te laag zijn. De instructies voor versie 3.7 stelden deze waarden in php.ini in:

max_execution_time = 1200
max_input_time = 90
memory_limit = 512M
post_max_size = 5000M
upload_max_filesize = 5000M
max_file_uploads = 100
display_errors = Off
zlib.output_compression = On

Deze waarden gaan uit van een machine met voldoende capaciteit. Verlaag ze voordat u dit op een kleine VPS uitvoert. upload_max_filesize = 5000M met max_file_uploads = 100 beschrijft namelijk één aanvraag die veel meer kan schrijven dan op een schijf van 40 GB past. Herstart Apache en controleer welke waarden PHP daadwerkelijk heeft geladen:

sudo service apache2 restart
php -i | grep -E "upload_max_filesize|post_max_size|memory_limit"

Daarna stelt u de werkdirectory in. $ConvertLoc in Resources/config.php bepaalt de naam daarvan. De standaardwaarde is /DATA/HRConvert2. De gebruiker waaronder de webserver draait, moet eigenaar van deze directory zijn:

sudo mkdir -p /DATA/HRConvert2
sudo chmod -R 0755 /DATA/HRConvert2
sudo chown -R www-data:www-data /DATA/HRConvert2

Pak de release uit onder de documentroot van Apache. In de standaardindeling staat de applicatie in een map met de naam HRProprietary/HRConvert2. $InstLoc in Resources/config.php moet verwijzen naar de locatie waar u de applicatie daadwerkelijk hebt geplaatst. Voer daarna de ingebouwde diagnose uit. Dit is de snelste manier om ontbrekende afhankelijkheden te vinden voordat een gebruiker dat doet:

sudo php /path/to/HRConvert2/convertCore.php -v

-v doorloopt de volledige installatie: coreversies, controles van afhankelijkheden, de status van de sandbox en taalpakketten. Bestandsconversies worden niet vanaf de opdrachtregel ondersteund. Deze argumenten zijn daarom alleen bedoeld voor beheer.

Waarom mislukt elke conversie op een nieuwe installatie van Ubuntu 24.04?

Dat komt door de sandbox. Dit is het meest voorkomende probleem op de eerste dag. Ubuntu 24.04 beperkt standaard naamruimten voor onbevoegde gebruikers via AppArmor. Bubblewrap heeft een gebruikersnaamruimte nodig om zijn sandbox op te bouwen. Daarom kan bwrap niet starten. Omdat de applicatie zonder sandbox geen conversies uitvoert, mislukt elke taak.

Controleer dit rechtstreeks:

bwrap --ro-bind / / --dev /dev /bin/true && echo sandbox ok

Een foutmelding over geweigerde toegang betekent dat de naamruimte is geblokkeerd. De oplossing is een AppArmor-profiel voor het binaire bestand bwrap. Geef eerst de ABI-bestanden weer en noteer het hoogste aanwezige nummer:

ls /etc/apparmor.d/abi/

Schrijf vervolgens /etc/apparmor.d/bwrap en vervang 4.0 door dat hoogste nummer:

abi <abi/4.0>,
include <tunables/global>

profile bwrap /usr/bin/bwrap flags=(unconfined) {
  userns,
  include if exists <local/bwrap>
}

Laad het profiel:

sudo apparmor_parser -r /etc/apparmor.d/bwrap

Geen uitvoer betekent dat het profiel is geladen. Voer de controle met bwrap opnieuw uit. De uitvoer moet dan sandbox ok zijn. Vanaf dat moment werken conversies.

Debian 12 heeft dit probleem niet. De kernel staat daar naamruimten voor onbevoegde gebruikers toe. Bovendien stelt het pakket bubblewrap bij het opstarten kernel.unprivileged_userns_clone in op 1. Daardoor slaagt de bovenstaande controle daar zonder profiel. Vanaf v3.8.0 breidt het installatiescript het AppArmor-profiel van bubblewrap voor de distributie automatisch voor u uit.

Een publieke converter is een parser die toegankelijk is voor onbekenden

Dit is de sectie waarvoor de rest van dit bericht is geschreven. Een bestandsconverter die bereikbaar is vanaf het internet accepteert een willekeurig bestand van een anonieme gebruiker en geeft dit door aan LibreOffice, ImageMagick, FFmpeg of Ghostscript. Dit zijn omvangrijke C- en C++-codebases met een lange geschiedenis van parser-fouten. De persoon die het bestand uploadt, kiest het formaat; dit betekent dat de gebruiker bepaalt welke parser wordt uitgevoerd en welk codepad daarbinnen wordt geactiveerd.

De oplossing van HRConvert2 is om elke afhankelijkheid uit te voeren binnen een bubblewrap-namespace. Elke conversie ziet twee mappen: de map met de invoer, die alleen-lezen is aangekoppeld, en de map die de uitvoer ontvangt. Het netwerk is niet gedeeld, wat volgens de bewoordingen van het project closes every URL handler in every dependency at once is. Dat is belangrijker dan het lijkt. ImageMagick en Ghostscript accepteren beide verwijzingen die een URL ophalen; op die manier verandert een converter in een tool voor server-side request forgery (SSRF) om een cloud-metadata-eindpunt vanaf uw interne netwerk te bereiken. Zonder netwerk in de namespace kan het ophalen niet plaatsvinden.

De weigering vormt de andere helft: A server that cannot build a sandbox refuses the conversion rather than quietly running without one. Een tool die veilig faalt (fail-closed) is waardevoller dan een tool die u waarschuwt in een logbestand dat niemand leest. Dit is ook de reden waarom de bovenstaande AppArmor-stap niet optioneel is, en waarom $RequireSandboxOnDocker het bekijken waard is voordat u de container blootstelt aan het internet.

ImageMagick beveiligen met policy.xml

Het eigen policy-bestand van ImageMagick vormt een tweede beveiligingslaag onder de sandbox en is het configureren waard. Op Ubuntu 24.04 met ImageMagick 6 bevindt het bestand zich op /etc/ImageMagick-6/policy.xml. Toon de huidige actieve configuratie:

identify -list policy

Het project levert een policy op Documentation/Build/policy.xml die als goed voorbeeld dient. Deze blokkeert de coders PS, PS2, PS3, EPS, XPS en MVG, en weigert de delegates URL, HTTPS, HTTP en gs, terwijl PDF is toegestaan:

<policy domain="coder" rights="none" pattern="PS" />
<policy domain="coder" rights="none" pattern="MVG" />
<policy domain="delegate" rights="none" pattern="URL" />
<policy domain="delegate" rights="none" pattern="gs" />
<policy domain="coder" rights="read|write" pattern="PDF" />

De regel gs is hierbij van belang. ImageMagick parseert zelf geen PostScript. Het roept Ghostscript aan, en die delegate is de bron van bekende remote code execution-kwetsbaarheden in ImageMagick. Door de delegate te weigeren, stuurt ImageMagick geüploade bestanden in het geheel niet door naar gs, ongeacht wat het bestand beweert te zijn.

Dezelfde policy stelt resource-limieten in, waarmee wordt voorkomen dat een specifiek geprepareerde afbeelding de server overbelast:

<policy domain="resource" name="memory" value="256MiB"/>
<policy domain="resource" name="map" value="512MiB"/>
<policy domain="resource" name="disk" value="1GiB"/>
<policy domain="resource" name="width" value="16KP"/>
<policy domain="resource" name="height" value="16KP"/>
<policy domain="resource" name="area" value="128MP"/>

Een decompressiebom is een klein bestand dat enorme afmetingen claimt. De limieten width, height en area weigeren dit bestand voordat de allocatie plaatsvindt, waardoor het proces afsluit in plaats van dat de kernel een proces moet beëindigen.

Er is een valkuil in de andere richting. De standaard policy van Ubuntu blokkeert de coder PDF volledig, waardoor PDF-verwerking op een onaangepast systeem faalt met attempt to perform an operation not allowed by the security policy 'PDF'. Deze melding is de policy die zijn werk doet. Het opnieuw toestaan van de coder is een bewuste keuze; zorg er in dat geval voor dat de delegate gs geblokkeerd blijft.

Wat de afhankelijkheidsketen kost op een kleine VPS

In ruststand is dit alles niet kostbaar. Apache en PHP verbruiken enkele tientallen megabytes en de converter-binaries draaien helemaal niet. De volledige kosten worden in één keer zichtbaar zodra er een bestand binnenkomt.

Een documentconversie start LibreOffice, wat op zijn beurt een Java-runtime opstart. Een beeldconversie geeft ImageMagick 256 MiB aan geheugen plus een 512 MiB memory map volgens het bovenstaande beleid. Een videoconversie geeft FFmpeg elke core die u heeft, omdat dat is wat FFmpeg doet met video. De eigen memory_limit van PHP staat in de configuratie van het project op 512M. Die getallen stapelen zich op tijdens een enkele taak, bovenop het besturingssysteem en de webserver.

Een 1 GB VPS gaat dus swappen bij het eerste echte document en raakt vervolgens overbelast. Wanneer het geheugen opraakt, beëindigt de out of memory killer van de kernel het proces met de grootste resident size. Meestal is dat soffice.bin, en de gebruiker ziet een conversie die is mislukt zonder nuttige melding. Soms is het apache2, en gaat de hele site plat. Bevestig dit achteraf met dmesg -T | grep -i "killed process".

Dit is eerder een richtlijn voor dimensionering dan een benchmark: 4 GB RAM en twee cores is comfortabel voor een klein team, en 2 GB met een swap-bestand werkt als de belasting uit documenten en afbeeldingen bestaat en u de wachttijd accepteert. Een swap-bestand maakt een conversie niet sneller. Het maakt een piek traag in plaats van fataal, wat het verschil is tussen een vertraagde pagina en een uitval. Geef de schijf meer ruimte dan nodig lijkt, want het 3 GB-bestand, een ruime uploadlimiet en de geconverteerde output vullen samen een schijf lang voordat u iets anders tekortkomt.

Conversies zijn van nature piekbelastingen. Twee mensen die op hetzelfde moment video uploaden, zullen elke core gebruiken, en het volgende verzoek wacht daarachter. Er is geen wachtrij voor taken aanwezig, dus de enige controle die u heeft, is via limieten.

Stel limieten in om te voorkomen dat één upload de schijf vult

Pas eerst de PHP-waarden aan. Iets als upload_max_filesize = 512M, post_max_size = 512M en max_file_uploads = 20 is een redelijk uitgangspunt voor een gedeelde server met 4 GB geheugen. Houd er rekening mee dat max_execution_time = 1200 toestaat dat één PHP-verzoek twintig minuten draait; dit is nodig voor een lange videoconversie, maar betekent ook dat één trage upload een worker twintig minuten bezet houdt.

Dwing vervolgens de grootte en snelheid af bij de proxy, voordat het verzoek PHP bereikt:

limit_req_zone $binary_remote_addr zone=convert:10m rate=6r/m;

server {
    listen 443 ssl;
    server_name convert.example.com;

    client_max_body_size 512M;
    client_body_timeout 300s;

    location / {
        limit_req zone=convert burst=4 nodelay;
        proxy_pass http://127.0.0.1:8080;
        proxy_read_timeout 1200s;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

client_max_body_size moet minstens zo groot zijn als het grootste bestand dat u wilt laten converteren, anders antwoordt nginx met 413 Request Entity Too Large en ziet PHP de upload nooit. proxy_read_timeout moet langer zijn dan uw langste conversie, anders geeft een taak die achter de proxy perfect draait een 504 Gateway Time-out terug aan de browser. De rest van dat server-blok, inclusief TLS (transport layer security) termination, wordt behandeld in een nginx reverse proxy configuratie regel voor regel uitgelegd.

Verwijder de geconverteerde bestanden

Elke conversie laat een kopie van een gevoelig bestand achter in een map die de webserver kan lezen. Opschoning is wat een converter onderscheidt van een archief met alles wat er ooit op is geconverteerd.

$DeleteThreshold in Resources/config.php is de leeftijd in minuten waarna een sessie verloopt; de standaardwaarde is 60. Verlaag dit naar 15 wanneer de inhoud gevoelig is. De opschoning zelf is een command-line argument op de core:

sudo -u www-data php /path/to/HRConvert2/convertCore.php -c
sudo -u www-data php /path/to/HRConvert2/convertCore.php -c=15

-c verwijdert verlopen sessies uit beide datalocaties op basis van de geconfigureerde drempelwaarde. -c=15 gebruikt vijftien minuten voor alleen die uitvoering. -c=now verwijdert elke sessie ongeacht de leeftijd, inclusief de sessie die een gebruiker op dat moment aan het converteren is; bewaar dit dus voor onderhoud. Dezelfde argumenten werken binnen de container via docker exec.

Plaats de opschoning op een timer zodat het opschonen nooit afhankelijk is van het laden van een pagina door een gebruiker. Een regel in /etc/cron.d/hrconvert2 volstaat:

*/10 * * * * www-data php /path/to/HRConvert2/convertCore.php -c

Controleer het enkele minuten later met ls /DATA/HRConvert2 en zie hoe oude sessiemappen verdwijnen. Omdat de webservergebruiker eigenaar is van die map, is dat precies het account dat een gecompromitteerde parser zou verkrijgen; het account zou daarom niets anders in bezit moeten hebben dat waardevol is. Accounts met minimale rechten op een VPS is het algemene patroon, en dit is hier meer dan gebruikelijk van toepassing.

Plaats het achter authenticatie, tenzij het publiek toegankelijk moet zijn

De standaardinstallatie bevat bewust geen accounts. Iedereen die de pagina kan bereiken, kan een bestand uploaden en uw converter-binaries uitvoeren; rate limits vertragen dit proces slechts. Bepaal daarom in welke situatie u zich bevindt.

Als het voor u en enkele collega's is, stel het dan helemaal niet bloot aan het internet. Bind de container aan loopback zoals hierboven getoond en benader deze via een privénetwerk of een SSH-tunnel. Niets op het openbare internet kan dan een bestand naar de service sturen, wat het volledige aanvalsoppervlak wegneemt in plaats van het enkel te filteren. Als die collega's de service in een browser moeten openen zonder dat u een hostnaam publiceert of een poort opent, zorgt het aanbieden als een v3 onion service ervoor dat de converter aan loopback gebonden blijft, terwijl zij toch een adres hebben om te bezoeken.

Als het bereikbaar moet zijn vanuit een browser, plaats dan authenticatie voor de proxy. Basic auth vereist slechts twee commando's en houdt het uploadformulier weg bij onbevoegden:

sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd alice
location / {
    auth_basic "Converter";
    auth_basic_user_file /etc/nginx/.htpasswd;
    proxy_pass http://127.0.0.1:8080;
}

Herlaad nginx en open de pagina. Een inlogprompt betekent dat het werkt; als er geen prompt verschijnt, is het location-blok dat u heeft bewerkt niet degene die het verzoek afhandelt. Voor echte accounts in plaats van een gedeeld wachtwoord, kunt u authenticatie afhandelen via een single sign-on provider: een zelfgehoste Authentik SSO server biedt forward authentication voor een applicatie die zelf geen inlogfunctionaliteit heeft.

Als een daadwerkelijk publieke converter het doel is, accepteer dan de consequenties en bereid u daarop voor. Ga ervan uit dat de sandbox zal worden onderzocht. Houd de image-tag vastgepind, houd het ImageMagick-beleid strikt, houd de uploadlimieten klein en draai de service op een VPS waar verder niets op staat dat voor u van belang is.

Storingsbeelden en de meldingen die u ziet

Elke conversie mislukt onmiddellijk. De sandbox kan niet worden opgebouwd. Op een normale Ubuntu 24.04-installatie wordt dit veroorzaakt door het AppArmor-profiel. In de vastgelegde Docker-image 3.7 ontbreekt --security-opt seccomp=unconfined. De applicatie meldt dit als: A sandbox blocks the required syscalls unless it was started with the correct options. en verwijst naar See --Require Sandbox-- & --Require Sandbox On Docker-- in config.php.

Alleen conversies van afbeeldingen mislukken. Bubblewrap is missing or non functional, so this image conversion cannot be isolated! betekent dat bwrap ontbreekt of niet bereikbaar is via het pad waarover de webservergebruiker beschikt.

Eén indeling mislukt en de rest werkt. Dit is een ontbrekend binair bestand, dat expliciet wordt gemeld: ImageMagick may not be installed, or may not be reachable on the system path used by the web server user. Dezelfde melding bestaat voor FFmpeg en LibreOffice. Voer convertCore.php -v uit om te zien welke installatiebestanden beschikbaar zijn. Houd er rekening mee dat de PATH van het Apache-workerproces niet dezelfde is als de PATH van uw login-shell.

PDF-verwerking mislukt met een beleidsfout. attempt to perform an operation not allowed by the security policy 'PDF' is afkomstig van policy.xml van ImageMagick, niet van HRConvert2.

Grote uploads geven 413 terug. De waarde van nginx client_max_body_size is kleiner dan het bestand. In de keten zijn er drie limieten: één in nginx en twee in PHP. De kleinste limiet is bepalend.

Conversies stoppen zonder dat er iets zichtbaars is gewijzigd. The device where data is stored has an insufficient amount of storage space available. Controleer de beschikbare schijfruimte en controleer of de opruimtaak daadwerkelijk wordt uitgevoerd.

De opruimtaak geeft een melding in het logboek. Could not clean the temporary location! en Could not clean the convert location! zijn eigendomsproblemen. De webservergebruiker moet eigenaar zijn van de map die door $ConvertLoc wordt genoemd.

FAQ

Is het veilig om een zelfgehoste bestandsconverter op internet beschikbaar te maken?

Dat is alleen voldoende veilig als u de converter behandelt als een parser die aan onbekenden wordt blootgesteld. Elke upload wordt aan LibreOffice, ImageMagick, FFmpeg of Ghostscript doorgegeven. De uploader bepaalt welke van deze programma's wordt gebruikt. HRConvert2 voert deze programma's uit binnen een bubblewrap-namespace zonder netwerktoegang en met een alleen-lezen invoermap. Het weigert elke conversie die niet in een sandbox kan worden uitgevoerd. Dat is een veilige standaardinstelling. Het blijft beter om authenticatie te vereisen, uploadlimieten laag te houden en de converter uit te voeren op een VPS waarop geen andere waardevolle gegevens staan.

Waarom mislukt elke conversie op een nieuwe installatie van Ubuntu 24.04?

Ubuntu 24.04 beperkt onbevoegde user namespaces via AppArmor. bubblewrap heeft zo'n namespace nodig om zijn sandbox op te bouwen. Omdat de applicatie zonder sandbox geen conversie uitvoert, mislukt elke taak in plaats van slechts een deel ervan. Maak met /usr/bin/bwrap een AppArmor-profiel voor flags=(unconfined) en laad dit met sudo apparmor_parser -r /etc/apparmor.d/bwrap. Controleer dit daarna met bwrap --ro-bind / / --dev /dev /bin/true. Debian 12 staat onbevoegde user namespaces standaard toe en vereist deze stap niet.

Waarom mislukken conversies in Docker, maar werken ze op een normale installatie?

Het standaard-seccomp-profiel van Docker blokkeert de systeemaanroepen die bubblewrap gebruikt. Daardoor kan de sandbox niet binnen de container worden aangemaakt. Start voor de hier vastgelegde 3.7-image de container met --security-opt seccomp=unconfined. Dat is wat de opmerkingen in config.php voor die release voorschrijven. Vanaf v3.8.0 documenteert het project in plaats daarvan --cap-add SYS_ADMIN. Let op: $RequireSandboxOnDocker is standaard FALSE. Een container zonder deze optie kan daardoor zonder sandbox converteren. Stel deze optie in op TRUE zodra de seccomp-optie is toegevoegd.

Hoeveel RAM heeft een server voor bestandsconversie nodig?

In rust gebruikt de server weinig geheugen, maar een actieve conversie niet. LibreOffice start een Java-runtime. ImageMagick gebruikt onder het meegeleverde beleid 256 MiB geheugen en een map van 512 MiB. De eigen limiet van PHP is 512M. Op een VPS met 1 GB veroorzaakt die combinatie swapactiviteit en beëindigt de out-of-memory-killer soffice.bin of apache2. Reken voor een klein team op 4 GB en twee cores. Controleer dmesg -T | grep -i "killed process" wanneer een conversie zonder melding wordt beëindigd.

Waar worden geconverteerde bestanden opgeslagen en wanneer worden ze verwijderd?

Ze worden opgeslagen in de werkmap die in Resources/config.php met $ConvertLoc wordt opgegeven. De standaardwaarde is /DATA/HRConvert2. Met $DeleteThreshold stelt u de leeftijd in minuten in waarop een sessie verloopt. De standaardwaarde is 60. De opruimactie wordt vanaf de opdrachtregel uitgevoerd: php convertCore.php -c verwijdert verlopen sessies en -c=now verwijdert alle sessies onmiddellijk, ook actieve sessies. Voeg -c toe aan een cron-item of een systemd-timer, zodat het verwijderen niet afhankelijk is van bezoekers van de site.