Запуск как сервис
Запускайте Server в foreground под supervisor: systemd или контейнерным runtime. Не объединяйте start -d с внешним supervisor — жизненным циклом должен управлять один процесс.
Сборка приложения
Заголовок раздела «Сборка приложения»Выполняйте Composer install из lockfile до запуска workers. Конфигурацию и пути состояния задавайте до Server::runAll(). PID/log/status-файлы должны быть доступны пользователю сервиса; код и vendor не должны требовать записи во время запроса.
systemd
Заголовок раздела «systemd»Пример для приложения в /srv/my-app, слушающего непривилегированный порт:
[Unit]Description=PHP applicationAfter=network.target
[Service]Type=simpleUser=www-dataGroup=www-dataWorkingDirectory=/srv/my-appExecStart=/usr/bin/php /srv/my-app/server.php startRestart=on-failureKillSignal=SIGTERMTimeoutStopSec=45StandardOutput=journalStandardError=journal
[Install]WantedBy=multi-user.targetСоздайте необходимые writable-каталоги отдельно. TimeoutStopSec согласуйте с максимальным временем graceful stop и прикладными deadline; после истечения systemd может принудительно завершить процесс.
HTTP за reverse proxy
Заголовок раздела «HTTP за reverse proxy»Прокси принимает HTTPS и передаёт запросы на внутренний listener. Для WebSocket нужен protocol upgrade; для SSE отключите буферизацию и задайте подходящий read timeout. Разрешайте forwarding headers только от адресов proxy в Request::$trustedProxies.
Обновление
Заголовок раздела «Обновление»Соберите новый release в отдельном каталоге, проверьте зависимости и health-route. Затем выполните restart либо поддерживаемый upgrade; reload имеет другую семантику. Проверьте новый ответ, PID workers и reconnect долгих соединений. Сохраните предыдущий release для отката.