# Linux/VPS: приложение, оригиналы и производные

Руководство по встраиванию CLI, не утверждение о развёртывании на внешнем VPS. Фактическая Linux-проверка выполнена в локальном Docker с GD/JPEG/WebP/EXIF.

Разместите приложение/vendor/originals вне document root: например /srv/image-worker/app и /srv/image-worker/originals. Производные отдавайте отдельной статической папкой. CLI запускается от пользователя сервиса, запись разрешена только outputs/tmp. Не используйте chmod777 и root для обхода ошибки прав.

Проверьте php -v, php --ini, php -m, composer check-platform-reqs и тесты. PHP-FPM может отличаться от /usr/bin/php. Если обработчик CLI, наличие GD только в FPM не помогает.

```bash
cd /srv/image-worker/app
timeout 60s /usr/bin/php -d memory_limit=256M bin/convert.php /srv/image-worker/originals/item.png /srv/image-worker/derived/item-card-v1.webp card
code=$?
printf 'exit=%s\n' "$code"
```

Linux timeout возвращает 124 при превышении времени; приложение 0/2. 256M и 60 секунд — стартовые ограничения, не гарантированная ёмкость. Измеряйте RSS, форматы и максимальные размеры: декодер, временные копии и параллельность увеличивают расход. Предел 20 Mпикселей/8 MiB не доказывает, что любой такой файл поместится в 256M. Сервису нужны процессные/cgroup-лимиты и ограниченное число работников.

Задача хранит ID оригинала, preset, версию рецепта. Путь берётся из доверенной записи сервиса, не из HTTP-параметра. Оригинал неизменен; каждая производная заново создаётся из него. Используйте уникальное назначение и обновляйте ссылку после успешного завершения. Очередь и база в этот проект не включены. Для конкурирующей обработки одного назначения нужна внешняя сериализация.

Повреждённый JPEG — ошибка одного элемента. Ограничьте retry: повтор обычно не исправляет corrupt-данные. Не запускайте весь каталог одновременно. Лаборатория изолирует ошибки последовательным foreach, не строит распределённую очередь.

Отдавайте правильный MIME и версионные URL. Длинный immutable cache подходит имени, меняющемуся вместе с содержимым. width/height предотвращают скачок страницы; srcset строится по реальным derivative widths. Прозрачный логотип храните PNG/WebP; JPEG требует явного фонового цвета.

Для публичной мастерской достаточно public/. Не выставляйте vendor/tests/CLI в webroot. Не принимайте произвольные сетевые адреса изображений: загрузку, redirects и SSRF проектируют отдельно. GD не является универсальным sanitizer пользовательского файла.
