SSD Nodes Learn Hosting plans →
Руководства Matt ConnorАвтор: Matt Connor

Как установить HRConvert2 для конвертации файлов

Разверните HRConvert2 на своем VPS для безопасной обработки документов. Инструкция по установке через Docker или Apache с настройкой песочницы bubblewrap и лимитов.

Зачем разворачивать собственный конвертер файлов

Собственный конвертер файлов хранит файл на вашем собственном диске. Это единственная причина для его использования. Бесплатные сайты-конвертеры принимают загружаемый файл, и у вас нет возможности узнать, что с ним происходит дальше. Если файл представляет собой подписанный клиентский договор или отсканированную медицинскую карту, сама загрузка уже является инцидентом. HRConvert2 — это сервер для конвертации файлов с интерфейсом drag-and-drop, написанный на PHP и распространяемый по лицензии GPLv3. Это руководство написано для версии 3.7.4, выпущенной 18 августа 2026 года. Проект быстро развивается: новейший релиз на 13 октября 2026 года — v3.9.1, опубликованный 6 сентября 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 ГБ по состоянию на август 2026 года. Проверьте наличие свободного места на диске перед выполнением команды pull.

Теги имеют значение. В этом руководстве зафиксирована версия v3.7.2, которая была самым новым тегом на Docker Hub 17 августа 2026 года, а также самым новым релизом на GitHub в тот день. Версия v3.7.4 вышла 18 августа. По состоянию на 13 октября 2026 года самым новым релизом на GitHub является v3.9.1 (6 сентября 2026 года), а самыми новыми тегами на Docker Hub — edge (22 сентября 2026 года) и latest, который является v3.8.4 (31 августа 2026 года). Тег 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.2
docker 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, который слушает все интерфейсы, включая публичный. Флаг --security-opt seccomp=unconfined необходим, так как bubblewrap создает свою «песочницу», используя пространства имен пользователей (user namespace) и системные вызовы монтирования, которые блокируются стандартным профилем seccomp в Docker. В комментариях к версии 3.7 config.php указано, что некоторым хостам также требуется --security-opt apparmor=unconfined. Без этого флага конвертация завершается ошибкой, и приложение сообщает причину: A sandbox blocks the required syscalls unless it was started with the correct options.

Этот флаг — реальный компромисс. Вы ослабляете фильтр системных вызовов контейнера, чтобы приложение могло создать свою собственную более строгую «песочницу» внутри. Две настройки, определяющие поведение, — это $RequireSandbox и $RequireSandboxOnDocker в файле Resources/config.php. В релизе v3.7.4 они установлены как TRUE и FALSE. В зафиксированном здесь теге v3.7.2 обе настройки имеют значение FALSE, так как в комментариях указано, что контейнер должен оставить $RequireSandbox выключенным и позволить $RequireSandboxOnDocker принимать решение. Поскольку требование Docker по умолчанию отключено, контейнер без флага seccomp может выполнять конвертацию вообще без «песочницы». Как только флаг установлен, задайте $RequireSandboxOnDocker = TRUE;, и вы вернете поведение отказа внутри контейнера.

Более новые образы запускаются иначе. Проект изменил процесс работы с Docker в версии v3.8.0 (25 августа 2026 года). В текущем README и на странице Docker Hub указано, что контейнер запускается с --cap-add SYS_ADMIN вместо опции seccomp, и что без этого конвертация отклоняется. Если вы перейдете на тег 3.8 или 3.9, используйте флаги, описанные в документации к этому образу. Эта возможность обладает широкими полномочиями, поэтому сохраняйте привязку порта 127.0.0.1.

Если Docker на этой машине установлен впервые, сначала настройте демон. Запуск Docker на VPS охватывает установку, драйвер хранилища и способ, которым Docker записывает свои собственные правила брандмауэра.

Установка на Apache и PHP

Вплоть до версии 3.7.4 файл Documentation/INSTALLATION_INSTRUCTIONS.txt в репозитории описывал ручную установку из девяти шагов, и этот раздел следует данной инструкции. Начиная с версии 3.8.0, тот же файл описывает использование скрипта установки. Запустите sudo bash Documentation/Build/hrconvert2-setup.sh из клонированного репозитория: он установит зависимости, запишет настройки PHP в отдельный файл вместо редактирования php.ini и расширит профиль AppArmor для bubblewrap. Затем php convertCore.php -v и --status проверят результат. Ручной метод занимает больше времени, но вы будете точно знать, что именно установлено в системе. Начните с веб-сервера, языка программирования и песочницы:

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.7.4 шаг 3 официальной инструкции содержал полный список apt, а шаг 5 — сборку из исходного кода. В текущем руководстве списков пакетов нет. Установщик считывает манифест Resources/Engine/Contract/depends.php, а php convertCore.php --setup --check-depends выводит текущий список и его состояние. Две зависимости также можно собрать из исходного кода. Репозиторий поставляет Documentation/Build/ffmpeg-build.sh для кодировщиков, отсутствующих в стандартном FFmpeg, и Documentation/Build/build-imagemagick-v7.sh для ImageMagick 7 в Ubuntu 22.04 или 24.04, где до сих пор поставляется ветка 6.9. В Ubuntu 25.10 и 26.04 LTS уже включен ImageMagick 7.1. Поддержка электронных книг обеспечивается собственным установщиком calibre, который в инструкции 3.7 был представлен одной строкой:

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

Это скрипт поставщика, передаваемый в оболочку с правами root. Это стандартный метод от разработчиков, и он является опциональным: пропустите его, и вы потеряете только возможность конвертации электронных книг.

Далее — лимиты PHP. Конвертация выполняется медленно, а файлы имеют большой размер, поэтому стандартные значения слишком малы. В инструкции 3.7 они задавались в 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 ГБ. Перезапустите 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 по умолчанию ограничивает пространства имен непривилегированных пользователей через AppArmor. 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. С этого момента конвертации будут работать.

В Debian 12 этой проблемы нет. Его ядро разрешает пространства имен непривилегированных пользователей, а пакет bubblewrap устанавливает kernel.unprivileged_userns_clone в значение 1 при загрузке, поэтому указанная выше проверка там проходит без профиля. Начиная с версии v3.8.0, установочный скрипт автоматически расширяет профиль AppArmor для bubblewrap, используемый в вашем дистрибутиве.

Публичный конвертер — это парсер, доступный для внешних пользователей

Этот раздел является основной целью данной статьи. Файловый конвертер, доступный из Интернета, принимает произвольный файл от анонимного пользователя и передает его в 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 отображения памяти в соответствии с политикой выше. Конвертация видео задействует все доступные ядра, так как именно так FFmpeg работает с видео. Собственный memory_limit для PHP в конфигурации проекта составляет 512M. Эти показатели суммируются во время выполнения одной задачи поверх потребления операционной системы и веб-сервера.

Поэтому VPS с 1 GB оперативной памяти начинает использовать swap на первом же серьезном документе, а затем начинает «буксовать». Когда память заканчивается, механизм out of memory killer ядра завершает процесс с наибольшим объемом резидентной памяти. Обычно это soffice.bin, и пользователь видит, что конвертация завершилась с ошибкой без полезного сообщения. Иногда это apache2, и весь сайт перестает работать. Подтвердите это постфактум с помощью dmesg -T | grep -i "killed process".

Это руководство по выбору размера, а не эталонный тест: 4 GB оперативной памяти и два ядра комфортны для небольшой команды, а 2 GB со swap-файлом подойдут, если нагрузка состоит из документов и изображений и вы готовы ждать. Swap-файл не ускоряет конвертацию. Он делает скачок нагрузки медленным, а не фатальным, что является разницей между зависшей страницей и простоем. Выделите для диска больше места, чем кажется необходимым, так как 3 GB изображение, большой лимит на загрузку и конвертированный результат заполняют диск гораздо раньше, чем закончатся другие ресурсы.

Конвертации по своей природе носят импульсный характер. Два человека, загружающие видео одновременно, займут все ядра, и следующий запрос будет ждать в очереди. Перед этим процессом нет очереди задач, поэтому единственный способ контроля — это лимиты.

Установка лимитов для предотвращения переполнения диска одной загрузкой

Сначала ограничьте значения PHP. Параметры upload_max_filesize = 512M, post_max_size = 512M и max_file_uploads = 20 являются разумной отправной точкой для сервера с 4 GB оперативной памяти. Учтите, что max_execution_time = 1200 позволяет одному PHP-запросу выполняться в течение 20 минут, что необходимо для долгой конвертации видео, но также означает, что одна медленная загрузка будет занимать рабочий процесс на 20 минут.

Затем примените ограничения размера и скорости на уровне прокси, до того как запрос поступит в 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-туннель. В этом случае никто из интернета не сможет отправить файл, что полностью устраняет поверхность атаки, а не просто фильтрует трафик. Если коллегам нужно открыть сервис в браузере без публикации имени хоста или открытия порта, настройка в качестве v3 onion service позволит оставить конвертер привязанным к loopback и предоставит им адрес для доступа.

Если сервис должен быть доступен из браузера, настройте аутентификацию перед прокси-сервером. Basic auth настраивается двумя командами и скрывает форму загрузки от посторонних:

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;
}

Перезагрузите nginx и откройте страницу. Появление запроса на ввод данных означает, что всё работает; если запроса нет, значит, блок location, который вы редактировали, не обрабатывает данный запрос. Для использования полноценных учетных записей вместо общего пароля используйте единый провайдер аутентификации: самостоятельно развернутый сервер Authentik SSO позволяет настроить сквозную аутентификацию перед приложением, у которого нет собственной системы входа.

Если ваша цель — создание общедоступного конвертера, осознайте риски и подготовьтесь к ним. Исходите из того, что песочница будет подвергаться проверкам. Фиксируйте тег образа, поддерживайте строгие политики ImageMagick, устанавливайте низкие лимиты на загрузку и запускайте сервис на VPS, на котором нет других важных для вас данных.

Типы сбоев и сообщения об ошибках

Все преобразования завершаются немедленно. Песочница не может быть создана. В стандартной установке Ubuntu 24.04 причиной является профиль AppArmor. В зафиксированном образе Docker 3.7 — отсутствие --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 ограничивает использование пространств имен непривилегированными пользователями через AppArmor, а bubblewrap требует их для создания «песочницы». Поскольку приложение отказывается выполнять конвертацию без «песочницы», все задачи завершаются ошибкой. Создайте профиль AppArmor для /usr/bin/bwrap с помощью flags=(unconfined), загрузите его командой sudo apparmor_parser -r /etc/apparmor.d/bwrap, а затем подтвердите статус через bwrap --ro-bind / / --dev /dev /bin/true. В Debian 12 пространства имен для непривилегированных пользователей разрешены по умолчанию, поэтому этот шаг не требуется.

Почему конвертация не работает в Docker, но работает при обычной установке?

Профиль seccomp по умолчанию в Docker блокирует системные вызовы, используемые bubblewrap, поэтому «песочница» не может быть создана внутри контейнера. Для образа 3.7, указанного здесь, запускайте его с флагом --security-opt seccomp=unconfined, как предписано в комментариях config.php для этого релиза. Начиная с версии 3.8.0, в документации проекта рекомендуется использовать --cap-add SYS_ADMIN. Обратите внимание, что $RequireSandboxOnDocker по умолчанию имеет значение FALSE, поэтому контейнер без флагов может выполнять конвертацию вообще без «песочницы». Установите значение TRUE после того, как будет применен флаг seccomp.

Сколько оперативной памяти нужно серверу для конвертации файлов?

В режиме ожидания потребление ресурсов минимально, но во время конвертации оно возрастает. LibreOffice запускает среду выполнения Java, ImageMagick потребляет 256 MiB памяти и 512 MiB в виде map-файла согласно стандартной политике, а лимит самого 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, чтобы удаление файлов не зависело от посещений сайта пользователями.

Была ли эта статья полезной?