Zelf HRConvert2 hosten voor veilige bestandsconversie
Host HRConvert2 op uw eigen server om privacygevoelige bestanden veilig te verwerken. Leer hoe u via Docker of Apache 488 formaten converteert zonder externe cloudservices.
Waarom een eigen file converter hosten
Een zelfgehoste file converter houdt het bestand op uw eigen schijf. Dat is de enige reden om er een te draaien. Een gratis converter-website neemt de upload in ontvangst en biedt geen enkele garantie over wat er daarna met het bestand gebeurt. Wanneer het bestand een ondertekend klantcontract of een gescand medisch dossier is, vormt de upload zelf al een beveiligingsincident. HRConvert2 is een drag-and-drop file conversion server, geschreven in PHP en gelicentieerd onder de GPLv3. Versie 3.7.4 werd uitgebracht op 18 augustus 2026 en het project ondersteunt naar eigen zeggen 488 formaten.
Het systeem gebruikt geen database, geen accounts en geen cookies. Een gebruiker is in dit geval een tijdelijke map. Elke conversie wordt uitgevoerd door een lokaal command-line tool: LibreOffice voor documenten, FFmpeg voor audio en video, ImageMagick voor afbeeldingen, Tesseract voor optische tekenherkenning (OCR), en een reeks kleinere tools voor de overige formaten. HRConvert2 fungeert als de uploadpagina, de pipeline en de bijbehorende opschoning.
Het zet een bestand om van het ene naar het andere formaat. Het is geen office-suite voor in de browser; als u wilt dat gebruikers documenten in een tabblad bewerken, vergelijk dan zelfgehoste OnlyOffice en Collabora. Het is ook geen opslagoplossing. Geconverteerde output is bedoeld om te worden verwijderd; als bestanden ergens moeten blijven staan, hoort die taak thuis bij een zelfgehoste file manager.
Wat u nodig heeft
Debian of Ubuntu, Apache 2.4, PHP 8 of nieuwer, en bubblewrap. Bubblewrap (bwrap) fungeert als 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 binaire bestanden van de converter bepalen uw werkelijke hardwarebehoefte; 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 tijd en laat u precies zien wat er op het systeem staat.
Voer het vanavond uit met Docker
De image bevat elk converter-binary, waardoor deze groot is: ongeveer 3 GB per augustus 2026. Controleer de vrije schijfruimte voordat u de image ophaalt.
Tags zijn hier van belang. De nieuwste tag die op 17 augustus 2026 op Docker Hub is gepubliceerd, is v3.7.2, terwijl de nieuwste GitHub-release v3.7.4 is. De latest-tag wijzigt onder uw voeten, en aangezien deze applicatie een groot parser-oppervlak heeft, dient u een versie vast te pinnen en bewust te upgraden.
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.2docker ps
curl -I http://127.0.0.1:8080/Een gezonde container blijft in de Up-status en de curl geeft HTTP/1.1 200 OK terug. Een container die blijft herstarten heeft een opstartprobleem; lees daarom docker logs hrconvert2 voordat u andere wijzigingen aanbrengt.
Twee vlaggen zijn van groot belang. -p 127.0.0.1:8080:80 publiceert de poort alleen op de loopback-interface, waardoor de converter onbereikbaar is totdat u er bewust een proxy voor plaatst. Het voorbeeld van het project zelf mapt -p 8080:80 -p 8443:443, wat op elke interface luistert, inclusief de publieke. --security-opt seccomp=unconfined is noodzakelijk omdat bubblewrap zijn sandbox opbouwt met user namespace- en mount-systeemaanroepen die door het standaard seccomp-profiel van Docker worden geblokkeerd. Zonder deze vlag mislukken conversies en geeft de applicatie de reden aan: A sandbox blocks the required syscalls unless it was started with the correct options.
Die vlag is een bewuste afweging. U versoepelt het syscall-filter van de container zodat de applicatie daarbinnen een eigen, strengere sandbox kan opbouwen. De twee instellingen die dit gedrag bepalen zijn $RequireSandbox en $RequireSandboxOnDocker in Resources/config.php, die standaard op TRUE en FALSE staan. Omdat de Docker-vereiste standaard uitgeschakeld is, kan een container zonder de seccomp-vlag converteren zonder enige sandbox. Zodra de vlag is toegepast, stelt u $RequireSandboxOnDocker = TRUE; in om het weigeringsgedrag binnen de container te herstellen.
Als Docker nieuw is op deze machine, configureer dan eerst de daemon. Docker draaien op een VPS behandelt de installatie, de storage driver en de manier waarop Docker zijn eigen firewallregels schrijft.
Installatie op Apache en PHP
Het bestand Documentation/INSTALLATION_INSTRUCTIONS.txt in de repository is leidend en bevat negen stappen. Dit is de opzet. Begin met de webserver, de taal en de sandbox:
sudo apt update
sudo apt install -y apache2 php libapache2-mod-php php-all-dev php8.3-zip php8.3-gd bubblewrapDe php8.3-* namen komen overeen met Ubuntu 24.04. Voer php -v uit en gebruik het voorvoegsel dat bij uw versie past, omdat die pakketnamen met elke PHP-release veranderen en de verkeerde keuze leidt tot Unable to locate package.
Vervolgens de converters. Dit dekt documenten, afbeeldingen, audio, video en OCR; dit is het merendeel van wat gebruikers daadwerkelijk converteren:
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-cursor0Archiefformaten, 3D-modellen, e-books en opstartbare ISO-images vereisen meer pakketten dan dit, en sommige daarvan bevinden zich in de multiverse-component van Ubuntu. Stap 3 en 5 van de officiële instructies bevatten de volledige lijst in de juiste volgorde. Twee afhankelijkheden zijn geen apt-pakketten: de repository levert Documentation/Build/ffmpeg-build.sh en Documentation/Build/build-imagemagick-v7.sh voor gebruikers die encoders nodig hebben of een ImageMagick 7 die niet door Ubuntu wordt verpakt. Ondersteuning voor e-books komt van het eigen installatieprogramma van calibre, dat in de instructies als één regel wordt gegeven:
sudo -v && wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdinDit is een script van de leverancier dat als root naar een shell wordt gepiped. Dit is de methode van de ontwikkelaar en is optioneel: sla dit over en het enige dat u verliest is de mogelijkheid om e-books te converteren.
Vervolgens de PHP-limieten. Conversies zijn traag en bestanden zijn groot, dus de standaardwaarden zijn te klein. Het project stelt deze in via php.ini:
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 = OnDie getallen gaan uit van een machine met voldoende ruimte. Verlaag ze voordat u een kleine VPS gebruikt, want upload_max_filesize = 5000M met max_file_uploads = 100 beschrijft een enkel verzoek dat veel meer kan schrijven dan een schijf van 40 GB kan bevatten. Herstart Apache en controleer wat PHP daadwerkelijk heeft geladen:
sudo service apache2 restart
php -i | grep -E "upload_max_filesize|post_max_size|memory_limit"Nu de werkmap. $ConvertLoc in Resources/config.php benoemt deze, en de standaard is /DATA/HRConvert2. De gebruiker van de webserver moet hiervan de eigenaar zijn:
sudo mkdir -p /DATA/HRConvert2
sudo chmod -R 0755 /DATA/HRConvert2
sudo chown -R www-data:www-data /DATA/HRConvert2Pak de release uit onder uw Apache document root. De standaardindeling plaatst deze in een HRProprietary/HRConvert2 map, en $InstLoc in Resources/config.php moet verwijzen naar de locatie waar u deze daadwerkelijk heeft geplaatst. Voer daarna de ingebouwde diagnose uit; dit is de snelste manier om een ontbrekende afhankelijkheid te vinden voordat een gebruiker dat doet:
sudo php /path/to/HRConvert2/convertCore.php -v-v doorloopt de volledige installatie: kernversies, controles op afhankelijkheden, sandbox-status en taalpakketten. Bestandconversies worden niet ondersteund vanaf de opdrachtregel, dus deze set argumenten is uitsluitend voor beheerdoeleinden.
Waarom mislukt elke conversie op een verse Ubuntu 24.04-installatie?
Dit komt door de sandbox, en dit is het meest voorkomende probleem op de eerste dag. Ubuntu 24.04 en Debian 12 beperken standaard de user namespaces voor gebruikers zonder privileges. Bubblewrap heeft een user namespace nodig om zijn sandbox op te bouwen, waardoor bwrap niet kan starten. Omdat de applicatie weigert te converteren zonder sandbox, mislukt elke taak.
Controleer dit direct:
bwrap --ro-bind / / --dev /dev /bin/true && echo sandbox okEen "permission denied"-fout betekent dat de namespace is geblokkeerd. De oplossing is een AppArmor-profiel voor het bwrap-binary. Vermeld eerst de ABI-bestanden 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/bwrapGeen output betekent dat het profiel is geladen. Voer de bwrap-controle opnieuw uit; deze zou nu sandbox ok moeten weergeven. Vanaf dat moment werken de conversies.
Een publieke converter is een parser die toegankelijk is voor buitenstaanders
Dit is de sectie waarvoor de rest van dit artikel is geschreven. Een bestandsconverter die vanaf het internet bereikbaar is, 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 projectdocumentatie closes every URL handler in every dependency at once betekent. Dat is belangrijker dan het lijkt. Zowel ImageMagick als Ghostscript accepteren referenties die een URL ophalen; dit is hoe een converter verandert in een tool voor server-side request forgery (SSRF) om een cloud-metadata-endpoint vanuit uw netwerk te bereiken. Zonder netwerk in de namespace kan dit ophalen niet plaatsvinden.
De weigering is de andere helft: A server that cannot build a sandbox refuses the conversion rather than quietly running without one. Een tool die faalt door de toegang te blokkeren is waardevoller dan een tool die u waarschuwt in een logbestand dat niemand leest. Dit is ook de reden waarom de AppArmor-stap hierboven 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 dit bestand zich op /etc/ImageMagick-6/policy.xml. Toon de huidige actieve configuratie:
identify -list policyHet 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 cruciaal. ImageMagick parseert PostScript niet zelf. Het roept Ghostscript aan, en die delegate is de bron van bekende remote code execution-kwetsbaarheden in ImageMagick. Door deze delegate te blokkeren, zal ImageMagick een geüpload bestand nooit doorgeven aan gs, ongeacht wat het bestand beweert te zijn.
Dezelfde policy stelt resource-limieten in, waarmee wordt voorkomen dat een gemanipuleerde 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 declareert. De limieten width, height en area weigeren dit bestand voordat de geheugenallocatie plaatsvindt, waardoor het proces stopt 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 deze 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 belasting treedt gelijktijdig op zodra er een bestand binnenkomt.
Een documentconversie start LibreOffice, wat een Java-runtime opstart. Een afbeeldingsconversie 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 is 512M in de configuratie van het project. 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 offline. 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, omdat de 3 GB afbeelding, een grote uploadlimiet en de geconverteerde output samen een schijf vullen lang voordat u iets anders tekortkomt.
Conversies zijn van nature piekerig. 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, zijn limieten.
Stel limieten in die 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 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 perfect achter de proxy 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 het verschil tussen een converter en een archief van alles wat ooit op de server 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. Het opschonen 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 voor die specifieke uitvoering vijftien minuten. -c=now verwijdert elke sessie ongeacht de leeftijd, inclusief de sessie die een gebruiker op dat moment aan het converteren is; bewaar dit commando dus voor onderhoud. Dezelfde argumenten werken binnen de container via docker exec.
Plaats het opschoonproces op een timer zodat de opschoning 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 -cControleer 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 van waarde moeten bezitten. Accounts met minimale rechten op een VPS is het algemene patroon, en dit is hier meer dan ooit 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 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 publieke internet kan dan een bestand sturen, wat het volledige aanvalsoppervlak wegneemt in plaats van het te filteren.
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 alicelocation / {
auth_basic "Converter";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:8080;
}Herlaad Nginx en laad de pagina. Een prompt betekent dat het werkt; geen prompt betekent dat het location-blok dat u heeft bewerkt niet degene is die het verzoek afhandelt. Gebruik voor echte accounts in plaats van een gedeeld wachtwoord een single sign-on provider: een zelfgehoste Authentik SSO-server biedt forward authentication voor een applicatie die zelf geen inlogfunctie heeft.
Als een daadwerkelijk publieke converter het doel is, accepteer dan de consequenties en bereid u voor. Ga ervan uit dat de sandbox wordt gescand. Houd de image-tag vastgezet, houd het ImageMagick-beleid strikt, houd de uploadlimieten klein en draai het op een VPS waar verder niets op staat dat voor u van belang is.
Foutmodi en de meldingen die u zult zien
Elke conversie mislukt direct. De sandbox kan niet worden gebouwd. Bij een standaardinstallatie is dit het AppArmor-profiel. In Docker is het de ontbrekende --security-opt seccomp=unconfined. De applicatie benoemt dit: A sandbox blocks the required syscalls unless it was started with the correct options. en wijst naar See --Require Sandbox-- & --Require Sandbox On Docker-- in config.php.
Alleen afbeeldingsconversies mislukken. Bubblewrap is missing or non functional, so this image conversion cannot be isolated! betekent dat bwrap afwezig is of niet bereikbaar is via het pad dat de gebruiker van de webserver gebruikt.
Eén formaat mislukt en de rest werkt. Een ontbrekend binaire bestand, duidelijk gerapporteerd: 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 voor LibreOffice. Voer convertCore.php -v uit om te zien wat de installatie kan vinden, en onthoud dat het PATH van de Apache-worker niet hetzelfde is als het PATH van uw inlog-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 retourneren 413. De nginx client_max_body_size is kleiner dan het bestand. Er zijn drie limieten in de keten: één in nginx en twee in PHP. De kleinste limiet is bepalend.
Conversies stoppen en er is niets zichtbaars veranderd. The device where data is stored has an insufficient amount of storage space available. Controleer de vrije schijfruimte en controleer of de opschoonactie daadwerkelijk wordt uitgevoerd.
Opschonen geeft foutmeldingen in het logbestand. Could not clean the temporary location! en Could not clean the convert location! zijn eigendomsproblemen. De gebruiker van de webserver moet eigenaar zijn van de map die wordt aangeduid door $ConvertLoc.
FAQ
Is het veilig om een zelfgehoste bestandsconverter bloot te stellen aan het internet?
Het is voldoende veilig mits u het beschouwt als een parser die toegankelijk is voor onbekenden. Elke upload wordt doorgegeven aan LibreOffice, ImageMagick, FFmpeg of Ghostscript, waarbij de gebruiker die de upload uitvoert bepaalt welke tool wordt gebruikt. HRConvert2 voert deze tools uit binnen een bubblewrap-namespace zonder netwerktoegang en met een alleen-lezen invoermap. Het weigert elke conversie die het niet in een sandbox kan plaatsen, wat een sterke standaardinstelling is. Het blijft echter beter om authenticatie te vereisen, uploadlimieten laag te houden en de applicatie te draaien op een VPS waar verder geen waardevolle gegevens op staan.
Waarom mislukken alle conversies op een verse Ubuntu 24.04 installatie?
Ubuntu 24.04 en Debian 12 beperken unprivileged user namespaces, terwijl bubblewrap er een nodig heeft om zijn sandbox op te bouwen. Omdat de applicatie weigert te converteren zonder sandbox, mislukt elke taak in plaats van slechts een deel ervan. Schrijf een AppArmor-profiel voor /usr/bin/bwrap met flags=(unconfined), laad dit met sudo apparmor_parser -r /etc/apparmor.d/bwrap en bevestig de status met bwrap --ro-bind / / --dev /dev /bin/true.
Waarom mislukken conversies in Docker terwijl ze wel werken op een normale installatie?
Het standaard seccomp-profiel van Docker blokkeert de systeemoproepen die bubblewrap gebruikt, waardoor de sandbox niet binnen de container kan worden aangemaakt. Start de container met --security-opt seccomp=unconfined; dit is ook wat het eigen run-commando van het project doet. Let op: $RequireSandboxOnDocker staat standaard op FALSE, waardoor een container zonder de juiste vlag mogelijk converteert zonder enige sandbox. Zet deze waarde op TRUE zodra de seccomp-vlag is toegepast.
Hoeveel RAM heeft een bestandsconversieserver nodig?
In ruststand is het verbruik laag, maar tijdens een actieve conversie niet. LibreOffice start een Java runtime, ImageMagick neemt 256 MiB geheugen en een 512 MiB map in beslag onder het meegeleverde beleid, en de eigen limiet van PHP is 512M. Op een 1 GB VPS gaat deze combinatie swappen en beëindigt de out of memory killer soffice.bin of apache2. Plan voor een klein team 4 GB RAM en twee cores, en controleer dmesg -T | grep -i "killed process" wanneer een conversie zonder foutmelding stopt.
Waar gaan geconverteerde bestanden heen en wanneer worden ze verwijderd?
Ze worden opgeslagen in de werkmap die wordt aangeduid door $ConvertLoc in Resources/config.php, met /DATA/HRConvert2 als standaardwaarde. $DeleteThreshold bepaalt de leeftijd in minuten waarna een sessie verloopt; de standaardwaarde is 60. De opschoonactie wordt uitgevoerd vanaf de opdrachtregel: php convertCore.php -c verwijdert verlopen sessies en -c=now verwijdert direct alle sessies, inclusief actieve. Plaats -c in een cron-job of een systemd-timer zodat verwijdering niet afhankelijk is van het bezoek aan de website.