# Symfony Uid на Linux/VPS

Библиотека работает в PHP-процессе, отдельный сервер UUID ей не нужен. Для статической мастерской раздайте public существующим Nginx/Caddy по HTTPS; vendor и CLI-исходники не нужны в web-root. Для своего приложения установите зависимости в отдельном рабочем каталоге и настройте пользователя PHP-FPM/CLI с минимальными правами.

## Проверка окружения

```bash
php -v
php --ini
php -m
composer check-platform-reqs
php tests/run.php
```

CLI и PHP-FPM могут использовать разные версии и ini. После установки расширения pdo_sqlite перезапустите только нужную службу FPM по правилам своего окружения. Наши тесты подтверждают CLI Windows и Linux-контейнер, но не конфигурацию вашего VPS.

## Реальная файловая база

В опытах база в памяти. Для рабочего приложения выберите абсолютный путь вне web-root, например `/var/lib/my-app/data.sqlite`. Пользователю приложения нужен доступ и к файлу, и к каталогу: SQLite создаёт вспомогательные файлы. Не используйте chmod 777. Миграцию схемы, резервное копирование и проверку восстановления выполняйте отдельно; CREATE TABLE при каждом HTTP-запросе не является системой миграций.

```php
$db = new PDO('sqlite:/var/lib/my-app/data.sqlite');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->exec('PRAGMA busy_timeout = 3000');
```

Схему из Repository перенесите в миграцию. Уникальный BLOB ID должен сохраняться и читаться через явное преобразование. Для человеческого интерфейса возвращайте каноническую строку, а не необработанные байты. Не сохраняйте имя владельца из произвольного входного JSON как доказательство права доступа.

## Пакетная операция и cron

Сначала проверьте запуск под тем же пользователем и с тем же PHP, который используется расписанием. Ниже только экспорт безопасного учебного отчёта, не рабочая обработка заказов:

```cron
15 3 * * * cd /opt/uid-lab && /usr/bin/php bin/run.php sqlite 0 > /var/lib/uid-lab/last-demo.json 2> /var/lib/uid-lab/last-demo.err
```

Создайте эти каталоги заранее с нужным владельцем. У cron ограниченное окружение, поэтому пути абсолютные. Ротация отчётов и оповещение об ошибке настраиваются вашим сервисом. Для реальной параллельной задачи отдельно решите блокировку, повторы и транзакцию: наличие UUID не запрещает двойную обработку одной операции.

## Развёртывание

Устанавливайте из lock-файла, проверяйте PHP/SQLite, запускайте тесты, затем переносите результат. При смене формата поля TEXT→BLOB сначала сделайте копию, проверьте конверсию всех значений и дубликаты после нормализации. Сохраните совместимость внешнего API: внутренние 16 байт не требуют изменять строковый ID в URL. Никогда не сравнивайте IDs разных форматов случайным лексикографическим правилом без явного контракта.
