Установка HRConvert2 на свой сервер: пошаговое руководство
Разверните собственный конвертер файлов HRConvert2 на VPS для защиты конфиденциальных данных. В статье описана настройка через Docker, изоляция в bubblewrap и очистка кэша.
Зачем размещать конвертер файлов на собственном сервере
Размещение конвертера файлов на собственном сервере гарантирует, что файлы остаются на вашем диске. Это единственная причина для его использования. Бесплатные сайты-конвертеры принимают загружаемые файлы, и вы не можете знать, что с ними происходит дальше. Если речь идет о подписанном контракте клиента или отсканированной медицинской карте, сам факт загрузки является инцидентом безопасности. HRConvert2 — это сервер для конвертации файлов с поддержкой перетаскивания (drag and drop), написанный на PHP и распространяемый по лицензии GPLv3. Версия 3.7.4 была выпущена 18 августа 2026 года, и проект заявляет о поддержке 488 форматов.
В нем нет базы данных, учетных записей и файлов cookie. Пользователь — это временный каталог. Каждая конвертация выполняется локальной утилитой командной строки: LibreOffice для документов, FFmpeg для аудио и видео, ImageMagick для изображений, Tesseract для оптического распознавания символов (OCR) и множество других небольших инструментов для остальных задач. HRConvert2 — это страница загрузки, конвейер обработки и механизм очистки вокруг них.
Сервер преобразует файл из одного формата в другой. Это не офисный пакет для браузера, поэтому, если вам нужно, чтобы пользователи редактировали документы во вкладке, сравните self-hosted OnlyOffice и Collabora. Это также не хранилище. Конвертированные файлы предназначены для удаления, поэтому, если файлы должны где-то храниться, эта задача относится к self-hosted файловому менеджеру.
Системные требования
Debian или Ubuntu, Apache 2.4, PHP 8 или новее, а также bubblewrap. Bubblewrap (bwrap) — это песочница, и её использование обязательно: если сервер не может создать песочницу, он откажется от выполнения конвертации вместо того, чтобы работать без неё. В официальном README указано, что достаточно Raspberry Pi Model B+, что справедливо для части на PHP. Бинарные файлы конвертера определяют реальные требования к аппаратному обеспечению, подробнее об этом ниже.
Существует два способа установки. Docker-образ позволяет начать работу прямо сейчас. Установка Apache и PHP займёт один вечер и позволит вам в точности увидеть, что именно находится на сервере.
Запуск с помощью Docker сегодня вечером
Образ содержит все бинарные файлы конвертера, поэтому он имеет большой размер: около 3 GB по состоянию на август 2026 года. Проверьте наличие свободного места на диске перед выполнением pull.
Теги здесь имеют значение. Самый новый тег, опубликованный на Docker Hub по состоянию на 17 августа 2026 года — v3.7.2, в то время как самый новый релиз на GitHub — v3.7.4. Тег latest постоянно меняется, а данное приложение представляет собой крупный парсер, поэтому фиксируйте версию и обновляйтесь осознанно.
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/Исправный контейнер находится в состоянии Up, а curl возвращает HTTP/1.1 200 OK. Если контейнер постоянно перезапускается, значит, возникла проблема при запуске; прочитайте docker logs hrconvert2, прежде чем менять что-либо еще.
Два флага имеют важное значение. -p 127.0.0.1:8080:80 публикует порт только на loopback, поэтому никто не получит доступ к конвертеру, пока вы намеренно не установите перед ним прокси. Пример из проекта использует маппинг -p 8080:80 -p 8443:443, который слушает все интерфейсы, включая публичный. Флаг --security-opt seccomp=unconfined необходим, так как bubblewrap создает свою «песочницу», используя системные вызовы user namespace и mount, которые блокируются стандартным профилем seccomp в Docker. Без этого флага конвертация завершается ошибкой, и приложение сообщает причину: A sandbox blocks the required syscalls unless it was started with the correct options.
Этот флаг — осознанный компромисс. Вы ослабляете фильтр системных вызовов контейнера, чтобы приложение могло создать внутри него собственную, более строгую «песочницу». Две настройки, определяющие поведение — $RequireSandbox и $RequireSandboxOnDocker в файле Resources/config.php, которые по умолчанию имеют значения TRUE и FALSE. Поскольку требование Docker по умолчанию отключено, контейнер без флага seccomp может выполнять конвертацию вообще без «песочницы». Как только флаг установлен, задайте $RequireSandboxOnDocker = TRUE;, чтобы вернуть поведение с отказом внутри контейнера.
Если Docker на этой машине установлен впервые, сначала настройте демон. В статье Запуск Docker на VPS описаны установка, драйвер хранилища и то, как Docker создает собственные правила межсетевого экрана.
Установка на Apache и PHP
Файл Documentation/INSTALLATION_INSTRUCTIONS.txt в репозитории является основным руководством, состоящим из девяти шагов. Вот их структура. Начните с веб-сервера, языка программирования и песочницы:
sudo apt update
sudo apt install -y apache2 php libapache2-mod-php php-all-dev php8.3-zip php8.3-gd bubblewrapИмена в php8.3-* соответствуют Ubuntu 24.04. Запустите php -v и используйте префикс, соответствующий вашей версии, так как имена пакетов меняются с каждым релизом PHP, а использование неверного приведет к Unable to locate package.
Затем установите конвертеры. Это охватывает документы, изображения, аудио, видео и OCR — то есть большую часть того, что обычно конвертируют пользователи:
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Для работы с форматами архивов, 3D-моделями, электронными книгами и загрузочными ISO-образами требуется больше пакетов, некоторые из которых находятся в компоненте multiverse дистрибутива Ubuntu. Шаги 3 и 5 официальной инструкции содержат полный список в нужном порядке. Две зависимости не являются пакетами apt: репозиторий поставляет Documentation/Build/ffmpeg-build.sh и Documentation/Build/build-imagemagick-v7.sh для тех, кому нужны кодировщики или ImageMagick 7, который отсутствует в стандартных репозиториях Ubuntu. Поддержка электронных книг обеспечивается собственным установщиком calibre, который в инструкции представлен одной строкой:
sudo -v && wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdinЭто скрипт поставщика, передаваемый в оболочку от имени root. Это официальный метод от разработчиков, и он является опциональным: если пропустить его, вы потеряете только возможность конвертации электронных книг.
Далее — лимиты PHP. Конвертация выполняется медленно, а файлы имеют большой размер, поэтому стандартные значения слишком малы. Проект задает их в 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 = OnЭти значения рассчитаны на машину с достаточным объемом ресурсов. Уменьшите их, прежде чем запускать что-либо на небольшом VPS, так как upload_max_filesize = 5000M с max_file_uploads = 100 описывают один запрос, который может записать гораздо больше данных, чем вмещает диск объемом 40 GB. Перезапустите Apache и проверьте, какие параметры фактически загрузил PHP:
sudo service apache2 restart
php -i | grep -E "upload_max_filesize|post_max_size|memory_limit"Теперь настройте рабочую директорию. $ConvertLoc в Resources/config.php задает её имя, по умолчанию это /DATA/HRConvert2. Пользователь веб-сервера должен быть владельцем этой директории:
sudo mkdir -p /DATA/HRConvert2
sudo chmod -R 0755 /DATA/HRConvert2
sudo chown -R www-data:www-data /DATA/HRConvert2Распакуйте релиз в корневую директорию документов Apache. Стандартная структура предполагает размещение в папке HRProprietary/HRConvert2, а $InstLoc в Resources/config.php должна указывать на фактическое местоположение файлов. Затем запустите встроенную диагностику — это самый быстрый способ обнаружить отсутствие зависимостей до того, как с этим столкнется пользователь:
sudo php /path/to/HRConvert2/convertCore.php -v-v проверяет всю установку: версии ядра, наличие зависимостей, статус песочницы и языковые пакеты. Конвертация файлов из командной строки не поддерживается, поэтому данный набор аргументов предназначен только для административных целей.
Почему все преобразования завершаются ошибкой на чистой установке Ubuntu 24.04?
Причина кроется в песочнице, и это самая распространенная проблема первого дня. В Ubuntu 24.04 и Debian 12 по умолчанию ограничены пространства имен непривилегированных пользователей (unprivileged user namespaces). Bubblewrap требует пространство имен пользователя для создания своей песочницы, поэтому bwrap не может запуститься, а поскольку приложение отказывается выполнять преобразование без песочницы, каждое задание завершается ошибкой.
Проверьте это напрямую:
bwrap --ro-bind / / --dev /dev /bin/true && echo sandbox okОшибка permission denied означает, что пространство имен заблокировано. Решение заключается в создании профиля AppArmor для бинарного файла bwrap. Сначала выведите список файлов ABI и запишите самое большое число:
ls /etc/apparmor.d/abi/Затем создайте /etc/apparmor.d/bwrap, заменив 4.0 на это число:
abi <abi/4.0>,
include <tunables/global>
profile bwrap /usr/bin/bwrap flags=(unconfined) {
userns,
include if exists <local/bwrap>
}Загрузите профиль:
sudo apparmor_parser -r /etc/apparmor.d/bwrapОтсутствие вывода означает, что профиль успешно загружен. Запустите проверку bwrap снова, и она должна вывести sandbox ok. С этого момента преобразования будут работать.
Публичный конвертер — это парсер, доступный для внешних пользователей
Этот раздел является основной целью данной статьи. Конвертер файлов, доступный из Интернета, принимает произвольный файл от анонимного пользователя и передаёт его в LibreOffice, ImageMagick, FFmpeg или Ghostscript. Это крупные кодовые базы на C и C++, имеющие долгую историю ошибок в парсерах. Пользователь, загружающий файл, выбирает формат, а значит, он выбирает, какой именно парсер будет запущен и по какому пути выполнения внутри него пойдёт обработка.
Решение HRConvert2 заключается в запуске каждой зависимости внутри пространства имён bubblewrap. Каждая операция преобразования видит только две директории: ту, где находится входной файл (смонтирована в режиме read only), и ту, куда записывается результат. Сеть при этом отключается, что, по словам разработчиков проекта, closes every URL handler in every dependency at once. Это важнее, чем кажется на первый взгляд. И ImageMagick, и Ghostscript принимают ссылки, которые инициируют загрузку по URL; именно так конвертер превращается в инструмент для SSRF (Server Side Request Forgery), позволяющий достучаться до конечной точки метаданных облака изнутри вашей сети. При отсутствии сети в пространстве имён такая загрузка невозможна.
Отказ в выполнении — это вторая половина защиты: A server that cannot build a sandbox refuses the conversion rather than quietly running without one. Инструмент, который блокирует выполнение при ошибке, ценнее того, который лишь записывает предупреждение в лог, который никто не читает. Именно поэтому этап настройки AppArmor, описанный выше, не является опциональным, и именно поэтому $RequireSandboxOnDocker заслуживает внимания перед тем, как вы откроете доступ к контейнеру.
Укрепление защиты ImageMagick через policy.xml
Собственный файл политик ImageMagick служит вторым уровнем защиты поверх песочницы, и его настройка целесообразна. В Ubuntu 24.04 с ImageMagick 6 этот файл находится по пути /etc/ImageMagick-6/policy.xml. Выведите текущую активную конфигурацию:
identify -list policyПроект предоставляет эталонную политику в Documentation/Build/policy.xml, которая является хорошим примером. Она запрещает кодеры PS, PS2, PS3, EPS, XPS и MVG, а также делегаты URL, HTTPS, HTTP и gs, разрешая при этом 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" />Строка gs является наиболее важной. ImageMagick не выполняет парсинг PostScript самостоятельно. Он вызывает Ghostscript, и именно в этом делегате скрываются известные уязвимости удаленного выполнения кода в ImageMagick. Запретите этот делегат, и ImageMagick не будет передавать загруженный файл в gs ни при каких обстоятельствах, независимо от того, чем этот файл представляется.
Та же политика устанавливает лимиты ресурсов, что предотвращает исчерпание ресурсов сервера специально подготовленным изображением:
<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"/>Декомпрессионная бомба — это небольшой файл, который объявляет огромные размеры изображения. Лимиты width, height и area отклоняют такой файл до момента выделения памяти, поэтому процесс завершается штатно, вместо того чтобы ядро системы принудительно убивало процесс из-за нехватки памяти.
Существует нюанс в обратную сторону. Стандартная политика Ubuntu полностью запрещает кодер PDF, поэтому в исходной системе работа с PDF завершается ошибкой attempt to perform an operation not allowed by the security policy 'PDF'. Эта строка означает, что политика выполняет свою задачу. Разрешение использования этого кодера — это осознанное решение, при котором вы должны оставить делегат gs запрещенным.
Стоимость цепочки зависимостей на небольшом VPS
В режиме ожидания всё это не требует значительных ресурсов. Apache и PHP занимают несколько десятков мегабайт, а бинарные файлы конвертеров вообще не запущены. Вся нагрузка возникает единовременно, в момент поступления файла.
Конвертация документа запускает LibreOffice, который в свою очередь запускает среду выполнения Java. Конвертация изображения выделяет ImageMagick 256 MiB оперативной памяти плюс 512 MiB в виде отображения памяти (memory map) согласно политике, описанной выше. Конвертация видео задействует все доступные ядра процессора, так как именно так FFmpeg работает с видео. Собственный параметр memory_limit для PHP в конфигурации проекта установлен на 512M. Эти значения суммируются во время выполнения одной задачи, добавляясь к потреблению операционной системы и веб-сервера.
В результате VPS с 1 GB оперативной памяти начинает использовать swap при обработке первого же реального документа, после чего система начинает «буксовать» (thrashing). Когда память заканчивается, механизм out of memory killer ядра завершает процесс с наибольшим объёмом резидентной памяти. Обычно это soffice.bin, и пользователь видит, что конвертация завершилась с ошибкой без полезного сообщения. Иногда это apache2, и весь сайт перестаёт работать. Факт завершения процесса можно подтвердить с помощью dmesg -T | grep -i "killed process".
Это руководство по выбору размера ресурсов, а не результаты тестирования производительности: 4 GB оперативной памяти и два ядра комфортны для небольшой команды, а 2 GB с файлом подкачки (swap) подойдут, если нагрузка состоит из документов и изображений и вы готовы ждать. Файл подкачки не ускоряет конвертацию. Он делает всплеск нагрузки медленным, а не фатальным, что является разницей между зависшей страницей и полным отказом сервиса. Выделяйте диску больше места, чем кажется необходимым, так как 3 GB файл изображения, высокий лимит на загрузку и результат конвертации заполнят диск задолго до того, как у вас закончатся другие ресурсы.
Конвертации по своей природе носят импульсный характер. Два пользователя, загружающие видео одновременно, займут все ядра, и следующий запрос будет ждать в очереди. Перед этим процессом нет очереди задач, поэтому единственный способ контроля — это лимиты.
Установка лимитов, предотвращающих заполнение диска одной загрузкой
Сначала ограничьте значения PHP. Параметры upload_max_filesize = 512M, post_max_size = 512M и max_file_uploads = 20 являются разумной отправной точкой для общего сервера с 4 GB оперативной памяти. Учтите, что max_execution_time = 1200 позволяет одному PHP-запросу выполняться в течение двадцати минут, что необходимо для долгой конвертации видео, но также означает, что одна медленная загрузка будет занимать рабочий процесс на двадцать минут.
Затем примените ограничения размера и скорости на уровне прокси, прежде чем запрос достигнет PHP:
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 должно быть как минимум таким же большим, как самый крупный файл, который вы планируете конвертировать, иначе nginx вернет 413 Request Entity Too Large, и PHP не получит файл. Значение proxy_read_timeout должно превышать время самой долгой конвертации, иначе задача, которая успешно выполняется за прокси, вернет 504 Gateway Time-out в браузер. Остальная часть этого блока сервера, включая TLS (transport layer security) termination, описана в построчном разборе конфигурации nginx reverse proxy.
Удаление конвертированных файлов
Каждая конвертация оставляет копию конфиденциального файла в директории, доступной для чтения веб-серверу. Очистка — это то, что отличает конвертер от архива всех когда-либо обработанных на нем файлов.
$DeleteThreshold в Resources/config.php — это время жизни сессии в минутах, по умолчанию оно составляет 60. Уменьшите его до 15, если контент является конфиденциальным. Сам процесс очистки запускается аргументом командной строки ядра:
sudo -u www-data php /path/to/HRConvert2/convertCore.php -c
sudo -u www-data php /path/to/HRConvert2/convertCore.php -c=15-c удаляет истекшие сессии из обоих хранилищ данных, используя настроенный порог. -c=15 использует пятнадцать минут только для этого запуска. -c=now удаляет все сессии вне зависимости от их возраста, включая ту, которую пользователь конвертирует в данный момент, поэтому используйте этот флаг только для обслуживания. Те же аргументы работают внутри контейнера через docker exec.
Добавьте очистку в планировщик, чтобы удаление файлов не зависело от того, открывает ли кто-то страницу. Достаточно одной строки в /etc/cron.d/hrconvert2:
*/10 * * * * www-data php /path/to/HRConvert2/convertCore.php -cПроверьте результат через несколько минут с помощью ls /DATA/HRConvert2 и убедитесь, что старые директории сессий исчезли. Поскольку пользователь веб-сервера является владельцем этой директории, именно этот аккаунт получит злоумышленник в случае взлома парсера, поэтому у данного пользователя не должно быть доступа к другим ценным данным. Принцип наименьших привилегий для учетных записей на VPS — это общая практика, и здесь она применима в большей степени, чем обычно.
Разместите сервис за аутентификацией, если он не предназначен для публичного доступа
По умолчанию установка не содержит учетных записей. Любой, кто может открыть страницу, способен загрузить файл и запустить ваши бинарные файлы конвертера, а ограничение частоты запросов лишь замедлит этот процесс. Определитесь, какой вариант вам подходит.
Если сервис предназначен только для вас и нескольких коллег, не открывайте его вовне. Привяжите контейнер к loopback, как показано выше, и обращайтесь к нему через частную сеть или SSH-туннель. В этом случае никто из интернета не сможет отправить файл, что полностью устраняет поверхность атаки, а не просто фильтрует её.
Если сервис должен быть доступен из браузера, настройте аутентификацию перед прокси-сервером. Basic auth настраивается двумя командами и скрывает форму загрузки от посторонних:
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;
}Перезагрузите nginx и откройте страницу. Появление запроса на ввод данных означает, что всё работает. Если запроса нет, значит, блок location, который вы редактировали, не обрабатывает данный запрос. Для использования полноценных учетных записей вместо общего пароля используйте единую точку входа (SSO): самостоятельно развернутый сервер Authentik SSO позволяет настроить сквозную аутентификацию перед приложением, у которого нет собственной системы входа.
Если ваша цель — создание общедоступного конвертера, осознайте риски и подготовьтесь к ним. Исходите из того, что песочницу будут проверять на прочность. Фиксируйте тег образа, поддерживайте строгие политики ImageMagick, устанавливайте низкие лимиты на загрузку и запускайте сервис на VPS, где нет других важных для вас данных.
Типы сбоев и сообщения об ошибках
Все преобразования завершаются ошибкой сразу. Песочница не может быть создана. При обычной установке это связано с профилем AppArmor. В Docker отсутствует --security-opt seccomp=unconfined. Приложение указывает на это: A sandbox blocks the required syscalls unless it was started with the correct options. и ссылается на See --Require Sandbox-- & --Require Sandbox On Docker-- in config.php..
Не работают только преобразования изображений. Bubblewrap is missing or non functional, so this image conversion cannot be isolated! означает, что bwrap отсутствует или недоступен по пути, который использует пользователь веб-сервера.
Один формат не работает, остальные функционируют. Отсутствует исполняемый файл, об этом сообщается прямо: ImageMagick may not be installed, or may not be reachable on the system path used by the web server user.. То же самое сообщение выдается для FFmpeg и LibreOffice. Запустите convertCore.php -v, чтобы увидеть, что может найти установщик, и помните, что PATH рабочего процесса Apache отличается от PATH вашей оболочки входа.
Работа с PDF завершается ошибкой политики. attempt to perform an operation not allowed by the security policy 'PDF' исходит из policy.xml в ImageMagick, а не из HRConvert2.
При загрузке больших файлов возвращается ошибка 413. Значение client_max_body_size в nginx меньше размера файла. В цепочке обработки есть три ограничения: одно в nginx и два в PHP, и применяется самое строгое из них.
Преобразования останавливаются, хотя видимых изменений не было. The device where data is stored has an insufficient amount of storage space available. Проверьте свободное место на диске и убедитесь, что задача очистки действительно выполняется.
В логах появляются жалобы на очистку. Could not clean the temporary location! и Could not clean the convert location! указывают на проблемы с правами владения. Пользователь веб-сервера должен быть владельцем каталога, указанного в $ConvertLoc.
FAQ
Безопасно ли открывать доступ к self-hosted конвертеру файлов из интернета?
Это достаточно безопасно только в том случае, если вы рассматриваете его как парсер, доступный посторонним. Каждый загруженный файл передается в LibreOffice, ImageMagick, FFmpeg или Ghostscript, причем выбор инструмента делает пользователь. HRConvert2 запускает эти утилиты внутри пространства имен bubblewrap без доступа к сети и с каталогом ввода, доступным только для чтения. Приложение отклоняет любую конвертацию, которую не может изолировать, что является надежной настройкой по умолчанию. Тем не менее, рекомендуется требовать аутентификацию, ограничить размер загружаемых файлов и запускать сервис на VPS, где нет других ценных данных.
Почему любая конвертация завершается ошибкой на чистой установке Ubuntu 24.04?
В Ubuntu 24.04 и Debian 12 ограничено использование пространств имен непривилегированными пользователями, а bubblewrap требует их для создания своей «песочницы». Поскольку приложение отказывается выполнять конвертацию без изоляции, все задачи завершаются ошибкой. Создайте профиль AppArmor для /usr/bin/bwrap с помощью flags=(unconfined), загрузите его командой sudo apparmor_parser -r /etc/apparmor.d/bwrap, а затем подтвердите статус с помощью bwrap --ro-bind / / --dev /dev /bin/true.
Почему конвертация не работает в Docker, но работает при обычной установке?
Профиль seccomp по умолчанию в Docker блокирует системные вызовы, которые использует bubblewrap, поэтому «песочница» не может быть создана внутри контейнера. Запускайте его с флагом --security-opt seccomp=unconfined, как это делает собственная команда запуска проекта. Обратите внимание, что $RequireSandboxOnDocker по умолчанию имеет значение FALSE, поэтому контейнер без флагов может выполнять конвертацию вообще без изоляции. Установите значение TRUE, как только будет применен флаг seccomp.
Сколько оперативной памяти нужно серверу для конвертации файлов?
В режиме ожидания потребление ресурсов минимально, но во время активной конвертации оно возрастает. LibreOffice запускает среду выполнения Java, ImageMagick требует 256 MiB памяти и 512 MiB подкачки согласно стандартной политике, а лимит PHP составляет 512M. На VPS с 1 GB оперативной памяти такая комбинация приводит к активному использованию swap, и OOM killer завершает процессы soffice.bin или apache2. Планируйте использование 4 GB RAM и двух ядер для небольшой команды, а также проверяйте dmesg -T | grep -i "killed process", если конвертация прерывается без вывода сообщений.
Где хранятся сконвертированные файлы и когда они удаляются?
Они попадают в рабочий каталог, указанный в $ConvertLoc внутри Resources/config.php, который по умолчанию имеет значение /DATA/HRConvert2. Параметр $DeleteThreshold задает время жизни сессии в минутах, по умолчанию оно равно 60. Очистка запускается из командной строки: php convertCore.php -c удаляет истекшие сессии, а -c=now немедленно удаляет все сессии, включая активные. Добавьте -c в cron или системный таймер systemd, чтобы удаление файлов не зависело от посещений сайта пользователями.