HRConvert2 selbst hosten: Dateikonverter auf dem VPS
Betreiben Sie HRConvert2 lokal statt über eine kostenlose Website: Docker- oder Apache-Installation, 488 Formate, bubblewrap-Sandbox, Upload-Limits und Bereinigung.
Warum Sie einen eigenen Dateikonverter betreiben sollten
Ein selbst gehosteter Dateikonverter speichert die Datei auf Ihrem eigenen Datenträger. Das ist der entscheidende Grund für seinen Betrieb. Eine kostenlose Konverter-Website nimmt den Upload entgegen, ohne Ihnen eine Möglichkeit zu geben, nachzuvollziehen, was danach damit geschieht. Bei einem unterzeichneten Kundenvertrag oder einer eingescannten Krankenakte ist bereits der Upload selbst der Sicherheitsvorfall. HRConvert2 ist ein in PHP geschriebener Dateikonvertierungsserver, der unter der GPLv3 lizenziert ist. Version 3.7.4 wurde am 18. August 2026 veröffentlicht, und das Projekt gibt 488 unterstützte Formate an.
HRConvert2 benötigt keine Datenbank, keine Benutzerkonten und keine Cookies. Für jeden Benutzer wird ein temporäres Verzeichnis angelegt. Jede Konvertierung erfolgt lokal über ein Kommandozeilenwerkzeug: LibreOffice für Dokumente, FFmpeg für Audio und Video, ImageMagick für Bilder, Tesseract für optische Zeichenerkennung (OCR) sowie zahlreiche kleinere Werkzeuge für die übrigen Formate. HRConvert2 stellt die Upload-Seite, die Verarbeitungskette und die anschließende Bereinigung bereit.
HRConvert2 konvertiert eine Datei von einem Format in ein anderes. Es ist keine browserbasierte Office-Suite. Wenn Sie Dokumente in einem Browser-Tab gemeinsam bearbeiten möchten, vergleichen Sie stattdessen selbst gehostetes OnlyOffice und Collabora. HRConvert2 ist außerdem kein Speicherdienst. Die konvertierten Ausgabedateien sollen gelöscht werden. Wenn Dateien dauerhaft gespeichert werden müssen, ist das die Aufgabe eines selbst gehosteten Dateimanagers.
Was benötigt wird
Debian oder Ubuntu, Apache 2.4, PHP 8 oder höher und bubblewrap. Bubblewrap (bwrap) stellt die Sandbox bereit und ist nicht optional: Ein Server, der keine Sandbox erstellen kann, verweigert die Konvertierung, statt sie ohne Sandbox auszuführen. In der Upstream-README steht, dass ein Raspberry Pi Model B+ ausreicht. Das trifft auf den PHP-Teil zu. Die Binärdateien des Konverters bestimmen jedoch die tatsächlichen Hardwareanforderungen. Darauf gehen wir weiter unten ein.
Es gibt zwei Möglichkeiten für den Einstieg. Das Docker-Image funktioniert sofort. Die Installation von Apache und PHP dauert einen Abend und zeigt Ihnen genau, was auf dem System installiert ist.
Starten Sie es heute Abend mit Docker
Das Image enthält alle Konverter-Binärdateien und ist daher groß: Stand August 2026 etwa 3 GB. Prüfen Sie vor dem Abruf, ob genügend Speicherplatz frei ist.
Tags sind hier wichtig. Der neueste am 17 August 2026 auf Docker Hub veröffentlichte Tag ist v3.7.2, während das neueste GitHub-Release v3.7.4 ist. Der Tag latest ändert sich unerwartet. Außerdem bietet diese Anwendung eine große Parser-Angriffsfläche. Legen Sie daher eine Version fest und führen Sie Upgrades bewusst durch.
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/Ein gesunder Container bleibt im Zustand Up, und curl gibt HTTP/1.1 200 OK zurück. Ein Container, der fortlaufend neu startet, hat ein Startproblem. Lesen Sie daher docker logs hrconvert2, bevor Sie andere Änderungen vornehmen.
Zwei Flags sind besonders wichtig. -p 127.0.0.1:8080:80 veröffentlicht den Port nur auf dem Loopback-Interface. Der Konverter ist daher erst erreichbar, wenn Sie bewusst einen Proxy davor setzen. Das Beispiel des Projekts verwendet -p 8080:80 -p 8443:443. Dadurch lauscht der Dienst auf allen Interfaces, einschließlich des öffentlichen Interfaces. --security-opt seccomp=unconfined ist erforderlich, weil bubblewrap seine Sandbox mit User-Namespace- und Mount-Systemaufrufen erstellt, die das standardmäßige seccomp-Profil von Docker blockiert. Ohne dieses Flag schlagen Konvertierungen fehl. Die Anwendung nennt den Grund: A sandbox blocks the required syscalls unless it was started with the correct options.
Dieses Flag ist ein echter Kompromiss. Sie lockern den Systemaufruffilter des Containers, damit die Anwendung darin eine eigene, restriktivere Sandbox erstellen kann. Die beiden Einstellungen, die das Verhalten bestimmen, sind $RequireSandbox und $RequireSandboxOnDocker in Resources/config.php. Sie stehen standardmäßig auf TRUE beziehungsweise FALSE. Da die Docker-Anforderung standardmäßig deaktiviert ist, kann ein Container ohne das seccomp-Flag vollständig ohne Sandbox konvertieren. Sobald das Flag gesetzt ist, aktivieren Sie $RequireSandboxOnDocker = TRUE;. Dann erhalten Sie das Verweigerungsverhalten auch innerhalb des Containers zurück.
Wenn Docker auf diesem Rechner neu ist, richten Sie zuerst den Daemon ein. Docker auf einem VPS ausführen behandelt die Installation, den Storage-Treiber und die Art, wie Docker eigene Firewall-Regeln schreibt.
Installieren Sie es stattdessen mit Apache und PHP
Die Datei Documentation/INSTALLATION_INSTRUCTIONS.txt im Repository ist maßgeblich und umfasst neun Schritte. So ist sie aufgebaut. Beginnen Sie mit dem Webserver, der Programmiersprache und der Sandbox:
sudo apt update
sudo apt install -y apache2 php libapache2-mod-php php-all-dev php8.3-zip php8.3-gd bubblewrapDie Namen in php8.3-* entsprechen Ubuntu 24.04. Führen Sie php -v aus und verwenden Sie das Präfix, das zu Ihrer Version passt, da sich diese Paketnamen mit jeder PHP-Version ändern. Das falsche Präfix führt zu Unable to locate package.
Als Nächstes folgen die Konverter. Damit sind Dokumente, Bilder, Audio, Video und OCR abgedeckt. Das entspricht dem Großteil der Konvertierungen, die tatsächlich benötigt werden:
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-cursor0Archivformate, 3D-Modelle, E-Books und bootfähige ISO-Images benötigen zusätzliche Pakete. Einige davon befinden sich in der Ubuntu-Komponente multiverse. Die Schritte 3 und 5 der offiziellen Anleitung enthalten die vollständige Liste in der richtigen Reihenfolge. Zwei Abhängigkeiten sind keine apt-Pakete: Das Repository stellt Documentation/Build/ffmpeg-build.sh und Documentation/Build/build-imagemagick-v7.sh für Benutzer bereit, die Encoder oder eine ImageMagick-7-Version benötigen, die Ubuntu nicht paketiert. Die E-Book-Unterstützung stammt aus dem eigenen Installer von calibre. Die Anleitung gibt ihn als eine Zeile an:
sudo -v && wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdinDabei wird ein Herstellerskript als root in eine Shell weitergeleitet. Dies ist die Upstream-Methode und optional. Wenn Sie den Schritt überspringen, fehlt nur die E-Book-Konvertierung.
Als Nächstes werden die PHP-Limits angepasst. Konvertierungen dauern lange und Dateien sind groß. Die Standardwerte sind deshalb zu niedrig. Das Projekt setzt diese Werte in 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 = OnDiese Werte setzen einen ausreichend ausgestatteten Rechner voraus. Verringern Sie sie, bevor Sie den Dienst auf einem kleinen VPS einsetzen. upload_max_filesize = 5000M zusammen mit max_file_uploads = 100 beschreibt eine einzelne Anfrage, die deutlich mehr Daten schreiben kann, als auf eine 40-GB-Festplatte passen. Starten Sie Apache neu und prüfen Sie, welche PHP-Werte tatsächlich geladen wurden:
sudo service apache2 restart
php -i | grep -E "upload_max_filesize|post_max_size|memory_limit"Nun folgt das Arbeitsverzeichnis. $ConvertLoc in Resources/config.php legt es fest. Der Standardwert ist /DATA/HRConvert2. Der Benutzer des Webservers muss Eigentümer dieses Verzeichnisses sein:
sudo mkdir -p /DATA/HRConvert2
sudo chmod -R 0755 /DATA/HRConvert2
sudo chown -R www-data:www-data /DATA/HRConvert2Entpacken Sie das Release unterhalb des Apache-Dokumentenstamms. Das Standardlayout legt es in einem Verzeichnis HRProprietary/HRConvert2 ab. $InstLoc in Resources/config.php muss auf den tatsächlichen Installationsort verweisen. Führen Sie anschließend die integrierte Diagnose aus. Damit finden Sie fehlende Abhängigkeiten am schnellsten, bevor ein Benutzer darauf stößt:
sudo php /path/to/HRConvert2/convertCore.php -v-v prüft die gesamte Installation: Kernversionen, Abhängigkeiten, Sandbox-Status und Sprachpakete. Dateikonvertierungen werden über die Befehlszeile nicht unterstützt. Diese Argumente dienen daher ausschließlich der Administration.
Warum schlägt jede Konvertierung bei einer frischen Ubuntu-24.04-Installation fehl?
Der Grund ist die Sandbox. Das ist am ersten Tag das häufigste Problem. Ubuntu 24.04 und Debian 12 beschränken nicht privilegierte User-Namespaces standardmäßig. Bubblewrap benötigt einen User-Namespace, um seine Sandbox zu erstellen. Deshalb kann bwrap nicht starten. Da die Anwendung Konvertierungen ohne Sandbox ablehnt, schlägt jeder einzelne Auftrag fehl.
Prüfen Sie dies direkt:
bwrap --ro-bind / / --dev /dev /bin/true && echo sandbox okEine Fehlermeldung mit „permission denied“ bedeutet, dass der Namespace blockiert wurde. Die Lösung ist ein AppArmor-Profil für die Binärdatei bwrap. Listen Sie zunächst die ABI-Dateien auf und notieren Sie die höchste vorhandene Nummer:
ls /etc/apparmor.d/abi/Schreiben Sie anschließend /etc/apparmor.d/bwrap und ersetzen Sie 4.0 durch diese höchste Nummer:
abi <abi/4.0>,
include <tunables/global>
profile bwrap /usr/bin/bwrap flags=(unconfined) {
userns,
include if exists <local/bwrap>
}Laden Sie das Profil:
sudo apparmor_parser -r /etc/apparmor.d/bwrapKeine Ausgabe bedeutet, dass das Profil geladen wurde. Führen Sie die Prüfung bwrap erneut aus. Sie sollte sandbox ok ausgeben. Ab diesem Zeitpunkt funktionieren die Konvertierungen.
Ein öffentlicher Konverter ist ein Parser, der Fremden ausgesetzt wird
Dies ist der Zweck des gesamten restlichen Beitrags. Ein aus dem Internet erreichbarer Dateikonverter akzeptiert eine beliebige Datei von einer anonymen Person und übergibt sie an LibreOffice, ImageMagick, FFmpeg oder Ghostscript. Dabei handelt es sich um umfangreiche C- und C++-Codebasen mit einer langen Historie von Parserfehlern. Die hochladende Person wählt das Format. Damit bestimmt sie auch, welcher Parser ausgeführt wird und welcher Codepfad darin zum Einsatz kommt.
HRConvert2 führt jede Abhängigkeit in einem bubblewrap-Namespace aus. Jede Konvertierung sieht zwei Verzeichnisse: das Verzeichnis mit der Eingabedatei, das schreibgeschützt eingebunden wird, und das Verzeichnis, in dem die Ausgabedatei abgelegt wird. Das Netzwerk wird nicht gemeinsam genutzt. In den Worten des Projekts gilt: closes every URL handler in every dependency at once Das ist wichtiger, als es zunächst klingt. ImageMagick und Ghostscript akzeptieren beide Referenzen, die eine URL abrufen. Dadurch kann ein Konverter zu einem Werkzeug für Server-Side Request Forgery (SSRF) werden, mit dem sich aus Ihrem Netzwerk ein Cloud-Metadaten-Endpunkt erreichen lässt. Ohne Netzwerkzugriff im Namespace kann dieser Abruf nicht stattfinden.
Die Verweigerung ist die andere Hälfte: A server that cannot build a sandbox refuses the conversion rather than quietly running without one. Ein Werkzeug, das bei Fehlern den Zugriff verweigert, ist wertvoller als eines, das eine Warnung in ein Log schreibt, das niemand liest. Deshalb ist auch der oben beschriebene AppArmor-Schritt nicht optional. Ebenso sollten Sie $RequireSandboxOnDocker prüfen, bevor Sie den Container öffentlich erreichbar machen.
ImageMagick mit policy.xml härten
Die eigene Policy-Datei von ImageMagick bildet eine zweite Schutzschicht unterhalb der Sandbox und sollte konfiguriert werden. Unter Ubuntu 24.04 mit ImageMagick 6 befindet sich die Datei unter /etc/ImageMagick-6/policy.xml. Geben Sie die aktuell aktive Konfiguration aus:
identify -list policyDas Projekt liefert unter Documentation/Build/policy.xml eine Policy mit, die als gute Vorlage dient. Sie verweigert die Coder PS, PS2, PS3, EPS, XPS und MVG sowie die Delegates URL, HTTPS, HTTP und gs, erlaubt aber PDF:
<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" />Die Zeile gs ist entscheidend. ImageMagick verarbeitet PostScript nicht selbst. Stattdessen startet es Ghostscript als externen Prozess. In diesem Delegate liegen die bekannten Sicherheitslücken für Remote Code Execution in ImageMagick. Wenn Sie den Delegate verweigern, übergibt ImageMagick eine hochgeladene Datei überhaupt nicht an gs, unabhängig davon, welchen Dateityp sie angibt.
Dieselbe Policy setzt Ressourcenlimits. Dadurch kann ein einzelnes präpariertes Bild das System nicht überlasten:
<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"/>Eine Dekompressionsbombe ist eine kleine Datei, die enorme Dimensionen angibt. Die Limits width, height und area weisen sie zurück, bevor die Speicherzuweisung erfolgt. Der Prozess wird beendet, anstatt dass der Kernel einen Prozess beendet.
In die andere Richtung gibt es eine Falle. Die Standard-Policy von Ubuntu verweigert den Coder PDF vollständig. Auf einem unveränderten System schlägt die Verarbeitung von PDF-Dateien deshalb mit attempt to perform an operation not allowed by the security policy 'PDF' fehl. Diese Meldung zeigt, dass die Policy greift. Wenn Sie den Coder wieder erlauben, müssen Sie diese Entscheidung bewusst treffen. Der Delegate gs sollte dabei weiterhin verweigert werden.
Welche Kosten die Abhängigkeitskette auf einem kleinen VPS verursacht
Im Leerlauf ist das alles nicht teuer. Apache und PHP benötigen nur einige Dutzend Megabyte, und die Konverter-Binärdateien laufen überhaupt nicht. Die gesamten Kosten fallen auf einmal an, sobald eine Datei eingeht.
Eine Dokumentkonvertierung startet LibreOffice, das wiederum eine Java-Laufzeitumgebung startet. Eine Bildkonvertierung weist ImageMagick gemäß der oben genannten Richtlinie 256 MiB Arbeitsspeicher und zusätzlich eine 512 MiB große Memory Map zu. Eine Videokonvertierung gibt FFmpeg jeden verfügbaren CPU-Kern, weil FFmpeg Videos auf diese Weise verarbeitet. PHPs eigener memory_limit ist in der Projektkonfiguration auf 512M gesetzt. Diese Werte addieren sich während eines einzelnen Jobs und kommen zum Betriebssystem und zum Webserver hinzu.
Ein VPS mit 1 GB beginnt daher beim ersten echten Dokument zu swappen und gerät anschließend ins Thrashing. Wenn der Arbeitsspeicher erschöpft ist, beendet der Out-of-Memory-Killer des Kernels den Prozess mit der größten Resident Set Size. Meistens ist das soffice.bin, und der Benutzer sieht eine fehlgeschlagene Konvertierung ohne hilfreiche Fehlermeldung. Manchmal ist es apache2, und die gesamte Website fällt aus. Prüfen Sie dies nachträglich mit dmesg -T | grep -i "killed process".
Dies ist eine Empfehlung zur Dimensionierung und kein Benchmark: 4 GB RAM und zwei Kerne bieten für ein kleines Team ausreichend Reserven. 2 GB und eine Swap-Datei funktionieren, wenn die Last aus Dokumenten und Bildern besteht und Sie längere Wartezeiten akzeptieren. Eine Swap-Datei macht eine Konvertierung nicht schneller. Sie macht einen Lastspitzen-bedingten Engpass langsam statt fatal. Das ist der Unterschied zwischen einer blockierten Seite und einem Ausfall. Planen Sie mehr Speicherplatz ein, als zunächst erforderlich erscheint. Das 3 GB große Image, ein hohes Upload-Limit und die konvertierte Ausgabe füllen den Datenträger zusammen deutlich früher, als andere Ressourcen erschöpft sind.
Konvertierungen erzeugen naturgemäß Lastspitzen. Wenn zwei Personen gleichzeitig Videos hochladen, werden alle Kerne ausgelastet, und die nächste Anfrage muss warten. Davor befindet sich keine Job-Warteschlange. Die einzige Steuerungsmöglichkeit sind daher Limits.
Limits festlegen, die verhindern, dass ein einzelner Upload den Datenträger füllt
Reduzieren Sie zunächst die PHP-Werte. upload_max_filesize = 512M, post_max_size = 512M und max_file_uploads = 20 sind für einen gemeinsam genutzten Server mit 4 GB ein sinnvoller Ausgangspunkt. Beachten Sie, dass max_execution_time = 1200 eine einzelne PHP-Anfrage 20 Minuten lang ausführen lässt. Das ist für eine lange Videokonvertierung tatsächlich erforderlich. Gleichzeitig belegt ein langsamer Upload dadurch 20 Minuten lang einen Worker.
Erzwingen Sie die Größen- und Ratenbegrenzung anschließend am Proxy, bevor die Anfrage PHP überhaupt erreicht:
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 muss mindestens so groß sein wie die größte Datei, die Sie konvertieren möchten. Andernfalls antwortet nginx mit 413 Request Entity Too Large, und PHP erhält den Upload nie. proxy_read_timeout muss länger sein als Ihre längste Konvertierung. Andernfalls gibt ein Auftrag, der hinter dem Proxy problemlos ausgeführt wird, im Browser 504 Gateway Time-out zurück. Der restliche Server-Block einschließlich der TLS-Terminierung (Transport Layer Security) wird in einer nginx-Reverse-Proxy-Konfiguration, die Zeile für Zeile erklärt wird behandelt.
Konvertierte Dateien löschen
Jede Konvertierung hinterlässt eine Kopie einer sensiblen Datei in einem Verzeichnis, das der Webserver lesen kann. Die Bereinigung unterscheidet einen Konverter von einem Archiv aller Dateien, die jemals darauf konvertiert wurden.
$DeleteThreshold in Resources/config.php gibt das Alter in Minuten an, nach dem eine Sitzung abläuft. Der Standardwert ist 60. Senken Sie den Wert auf 15, wenn der Inhalt sensibel ist. Die Bereinigung selbst wird als Kommandozeilenargument an den Core übergeben:
sudo -u www-data php /path/to/HRConvert2/convertCore.php -c
sudo -u www-data php /path/to/HRConvert2/convertCore.php -c=15-c löscht abgelaufene Sitzungen aus beiden Datenverzeichnissen und verwendet dabei den konfigurierten Schwellenwert. -c=15 verwendet für diesen Lauf nur fünfzehn Minuten. -c=now löscht jede Sitzung unabhängig von ihrem Alter, einschließlich der Sitzung, die ein Benutzer gerade für eine Konvertierung verwendet. Verwenden Sie diese Option daher nur für Wartungsarbeiten. Dieselben Argumente funktionieren innerhalb des Containers über docker exec.
Legen Sie die Bereinigung in einem Timer ab, damit sie nie davon abhängt, dass jemand eine Seite lädt. Eine Zeile in /etc/cron.d/hrconvert2 genügt:
*/10 * * * * www-data php /path/to/HRConvert2/convertCore.php -cPrüfen Sie einige Minuten später mit ls /DATA/HRConvert2, ob alte Sitzungsverzeichnisse verschwinden, und überwachen Sie diesen Vorgang. Da der Benutzer des Webservers Eigentümer dieses Verzeichnisses ist, hätte ein kompromittierter Parser genau die Berechtigungen dieses Kontos. Das Konto sollte daher keine anderen schützenswerten Ressourcen besitzen. Benutzerkonten mit geringsten Berechtigungen auf einem VPS beschreibt das allgemeine Vorgehen. Hier ist es besonders wichtig.
Hinterlegen Sie eine Authentifizierung, sofern der Dienst nicht öffentlich erreichbar sein soll
Die Standardinstallation enthält absichtlich keine Benutzerkonten. Jeder, der die Seite erreichen kann, kann eine Datei hochladen und Ihre Konverter-Binärdateien ausführen. Ratenbegrenzungen verlangsamen das lediglich. Entscheiden Sie daher, welche Situation auf Sie zutrifft.
Wenn Sie den Dienst selbst und mit wenigen Kollegen verwenden, veröffentlichen Sie ihn überhaupt nicht. Binden Sie den Container wie oben gezeigt an das Loopback-Interface und greifen Sie über ein privates Netzwerk oder einen SSH-Tunnel darauf zu. Dann kann niemand aus dem öffentlichen Internet eine Datei an den Dienst senden. Dadurch entfällt die gesamte Angriffsfläche, statt sie nur zu filtern.
Wenn der Dienst über einen Browser erreichbar sein muss, schalten Sie eine Authentifizierung vor den Proxy. Basic Auth ist mit zwei Befehlen eingerichtet und hält das Upload-Formular von Unbefugten fern:
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;
}Laden Sie nginx neu und öffnen Sie die Seite. Eine Eingabeaufforderung bedeutet, dass die Konfiguration funktioniert. Wird keine Eingabeaufforderung angezeigt, verarbeitet nicht der von Ihnen bearbeitete location-Block die Anfrage. Für echte Benutzerkonten statt eines gemeinsamen Passworts beenden Sie die Authentifizierung bei einem Single-Sign-on-Anbieter: ein selbst gehosteter Authentik-SSO-Server stellt die Forward-Authentifizierung vor einer Anwendung bereit, die keine eigene Anmeldung besitzt.
Wenn das Ziel ein tatsächlich öffentlicher Konverter ist, müssen Sie die Konsequenzen akzeptieren und entsprechend planen. Gehen Sie davon aus, dass die Sandbox untersucht wird. Fixieren Sie das Image-Tag, halten Sie die ImageMagick-Richtlinie restriktiv, setzen Sie die Upload-Limits niedrig und betreiben Sie den Dienst auf einem VPS, auf dem sich nichts anderes befindet, das Sie schützen müssen.
Fehlerbilder und die angezeigten Meldungen
Jede Konvertierung schlägt sofort fehl. Die Sandbox kann nicht erstellt werden. Bei einer normalen Installation ist dafür das AppArmor-Profil verantwortlich. In Docker fehlt --security-opt seccomp=unconfined. Die Anwendung nennt dies: A sandbox blocks the required syscalls unless it was started with the correct options. und verweist auf See --Require Sandbox-- & --Require Sandbox On Docker-- in config.php.
Nur Bildkonvertierungen schlagen fehl. Bubblewrap is missing or non functional, so this image conversion cannot be isolated! bedeutet, dass bwrap fehlt oder über den Pfad, den der Webserver-Benutzer verwendet, nicht erreichbar ist.
Ein Format schlägt fehl, die übrigen funktionieren. Eine fehlende Binärdatei wird eindeutig gemeldet: ImageMagick may not be installed, or may not be reachable on the system path used by the web server user.. Dieselbe Meldung gibt es für FFmpeg und LibreOffice. Führen Sie convertCore.php -v aus, um zu prüfen, was die Installation findet. Beachten Sie, dass der PATH des Apache-Workers nicht dem PATH Ihrer Login-Shell entspricht.
Die PDF-Verarbeitung schlägt mit einem Policy-Fehler fehl. attempt to perform an operation not allowed by the security policy 'PDF' stammt aus ImageMagicks policy.xml und nicht aus HRConvert2.
Große Uploads liefern 413 zurück. nginx client_max_body_size ist kleiner als die Datei. In der Kette gibt es drei Limits: eines in nginx und zwei in PHP. Das kleinste Limit ist maßgeblich.
Konvertierungen werden beendet, obwohl sich scheinbar nichts geändert hat. The device where data is stored has an insufficient amount of storage space available.. Prüfen Sie den freien Speicherplatz und ob der Bereinigungslauf tatsächlich ausgeführt wird.
Die Bereinigung meldet einen Fehler im Log. Could not clean the temporary location! und Could not clean the convert location! weisen auf Probleme mit den Eigentümern hin. Der Webserver-Benutzer muss Eigentümer des von $ConvertLoc bezeichneten Verzeichnisses sein.
FAQ
Ist es sicher, einen selbst gehosteten Dateikonverter im Internet bereitzustellen?
Das ist nur dann ausreichend sicher, wenn Sie ihn wie einen Parser behandeln, der Fremden ausgesetzt ist. Jeder Upload wird an LibreOffice, ImageMagick, FFmpeg oder Ghostscript übergeben, wobei die hochladende Person das jeweilige Tool auswählt. HRConvert2 führt diese Tools in einem bubblewrap-Namespace ohne Netzwerkzugriff und mit einem schreibgeschützten Eingabeverzeichnis aus. Konvertierungen, die nicht in einer Sandbox ausgeführt werden können, werden abgelehnt. Das ist eine sichere Standardeinstellung. Trotzdem sollten Sie eine Authentifizierung verlangen, die Upload-Grenzen niedrig halten und den Dienst auf einer VPS betreiben, auf der keine anderen wichtigen Daten liegen.
Warum schlägt jede Konvertierung bei einer neuen Ubuntu-24.04-Installation fehl?
Ubuntu 24.04 und Debian 12 beschränken unprivilegierte User-Namespaces. bubblewrap benötigt einen solchen Namespace, um seine Sandbox zu erstellen. Da die Anwendung Konvertierungen ohne Sandbox ablehnt, schlagen alle Aufträge fehl. Schreiben Sie mit /usr/bin/bwrap ein AppArmor-Profil für flags=(unconfined), laden Sie es mit sudo apparmor_parser -r /etc/apparmor.d/bwrap und bestätigen Sie die Konfiguration mit bwrap --ro-bind / / --dev /dev /bin/true.
Warum schlagen Konvertierungen in Docker fehl, funktionieren aber bei einer normalen Installation?
Das standardmäßige seccomp-Profil von Docker blockiert die Systemaufrufe, die bubblewrap verwendet. Daher kann die Sandbox im Container nicht erstellt werden. Starten Sie den Container mit --security-opt seccomp=unconfined. Dies entspricht dem Startbefehl des Projekts. Beachten Sie, dass $RequireSandboxOnDocker standardmäßig FALSE ist. Ein Container ohne dieses Flag kann daher vollständig ohne Sandbox konvertieren. Setzen Sie den Wert auf TRUE, sobald das seccomp-Flag aktiv ist.
Wie viel RAM benötigt ein Server für Dateikonvertierungen?
Im Leerlauf ist der Speicherbedarf gering, bei einer laufenden Konvertierung jedoch nicht. LibreOffice startet eine Java-Laufzeitumgebung. ImageMagick verwendet unter der ausgelieferten Richtlinie 256 MiB Arbeitsspeicher und ein 512 MiB großes Mapping. Das eigene Speicherlimit von PHP beträgt 512M. Auf einer VPS mit 1 GB führt diese Kombination zu Swap-Aktivität, und der Out-of-Memory-Killer beendet soffice.bin oder apache2. Planen Sie für ein kleines Team 4 GB RAM und zwei Kerne ein. Prüfen Sie dmesg -T | grep -i "killed process", wenn eine Konvertierung ohne Fehlermeldung beendet wird.
Wohin werden konvertierte Dateien gespeichert, und wann werden sie gelöscht?
Sie werden im Arbeitsverzeichnis gespeichert, das $ConvertLoc in Resources/config.php angibt. Der Standardwert ist /DATA/HRConvert2. $DeleteThreshold legt fest, nach wie vielen Minuten eine Sitzung abläuft. Der Standardwert ist 60. Die Bereinigung wird über die Befehlszeile ausgeführt: php convertCore.php -c löscht abgelaufene Sitzungen, und -c=now löscht sofort alle Sitzungen, einschließlich aktiver Sitzungen. Fügen Sie -c einem Cron-Eintrag oder einem systemd-Timer hinzu, damit die Löschung nicht davon abhängt, dass jemand die Website besucht.