fix(ops): liderra-queue --timeout=300 — фикс цикла SIGKILL каждые 60с

Инцидент 22.05.2026 утро: liderra-queue.service крашился signal=9/KILL
каждые ~60с на RefreshSupplierSessionJob, после 5 крашей systemd блокировал
рестарт. OOM-killer в dmesg пуст, память здорова (peak ~200 МБ из 2 ГБ),
crm.bp-gr.ru отвечает.

Корень: дефолтный Laravel queue:work --timeout=60 убивал worker через
pcntl_alarm+posix_kill за 5 секунд до того, как PlaywrightBridge
успевал поднять Chromium (cold-start на 2GB VM ~65с — это уже знали и
увеличили TIMEOUT_SECONDS=180 в PlaywrightBridge.php HOTPATCH 21.05, но
таймаут самого воркера в systemd-unit упустили).

Поймано через bpftrace tracepoint:signal:signal_generate — sender pid ==
target pid, comm=php (PHP сам себе шлёт SIGKILL).

Fix: --timeout=300 в ExecStart (180s PlaywrightBridge + 120s запас).
На сервере применён через drop-in
/etc/systemd/system/liderra-queue.service.d/timeout.conf как safety-net.

Verified live: RefreshSupplierSessionJob отработал 1 мин. 5 сек. DONE
(до фикса — 1 мин. FAIL → KILL цикл).
This commit is contained in:
Дмитрий
2026-05-22 11:43:04 +03:00
parent 23c2ae141c
commit 70f68385ca
2 changed files with 6 additions and 3 deletions
@@ -13,7 +13,10 @@ Group=www-data
Restart=on-failure
RestartSec=10
WorkingDirectory=/var/www/liderra/app
ExecStart=/usr/bin/php /var/www/liderra/app/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
# --timeout=300: Laravel default 60s убивал worker до завершения долгих supplier-задач
# (PlaywrightBridge cold-start Chromium на 2GB VM ~65s, см. фикс 22.05.2026 утро).
# 300s = PlaywrightBridge TIMEOUT_SECONDS=180 + 120s запас.
ExecStart=/usr/bin/php /var/www/liderra/app/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600 --timeout=300
[Install]
WantedBy=multi-user.target
+2 -2
View File
@@ -27,7 +27,7 @@
- **`APP_ENV=production`, `APP_DEBUG=false`** ✅ (стектрейсы наружу не светят).
-**`APP_URL=https://liderra.ru`** (исправлено 22.05; было `http://111.88.246.137`) + `SANCTUM_STATEFUL_DOMAINS=liderra.ru,www.liderra.ru` (cookie-логин на apex+www). **Конфиг закэширован** (`php artisan config:cache`) → будущие правки `.env` применять `php artisan config:cache`. ✅ `SESSION_SECURE_COOKIE=true` (22.05 — куки сессии/CSRF только по HTTPS; verified `secure; httponly; samesite=lax`).
- **Деплой кода** — копированием (НЕ git-checkout; `/var/www/liderra/app` не под git). Соответствует test-deploy эпику (ветка `feat/test-deploy`). Точную версию кода сверять при деплое (`git hash-object` файла vs нужный коммит). Фронт собирается **локально** (`npm run build`) и `public/build` копируется — на VM `node_modules` нет, RAM мало. После правки PHP в очереди — `systemctl restart liderra-queue`; после правки `.env` или контроллеров — `php artisan config:cache` + `systemctl reload php8.3-fpm` (opcache). Часть файлов на сервере принадлежит `www-data` (правка через `sudo cp`). **⚠️ scp с Windows кладёт CRLF в `.env`** (инцидент 22.05 вечер: Laravel молча fallback на дефолтный sqlite-кэш, 500 на каждой странице) — после копирования любых текстовых файлов с Windows-машины обязательно `sudo sed -i 's/\r$//' /var/www/liderra/app/.env` (или копировать `git archive`/`tar`). **Pre-flight гейт** `sudo /usr/local/bin/liderra-precheck.sh` — 15 проверок (CRLF, длина APP_KEY, decrypt(encrypt) round-trip, PG/Redis ping, config-cache свежее .env, pending migrations, HTTP smoke), exit 1 при провале — **запускать после любой правки `.env` и до `systemctl restart`**. Источник скриптов: `tools/liderra-monitoring/` в репо (`365d1a0`).
- **Очередь (`liderra-queue.service`):** ✅ `Restart=on-failure` + `StartLimitBurst=5/5min` + `OnFailure=liderra-queue-alert.service` (22.05 вечер). Раньше было `Restart=always` — крутилось бесконечно при crash'е, забивая `laravel.log` (26 МБ за сутки). Теперь после 5 крашей за 5 минут systemd останавливает + шлёт email на `kdv1@bk.ru`. Источник unit'ов: `tools/liderra-monitoring/liderra-queue*.service`.
- **Очередь (`liderra-queue.service`):** ✅ `Restart=on-failure` + `StartLimitBurst=5/5min` + `OnFailure=liderra-queue-alert.service` (22.05 вечер). Раньше было `Restart=always` — крутилось бесконечно при crash'е, забивая `laravel.log` (26 МБ за сутки). Теперь после 5 крашей за 5 минут systemd останавливает + шлёт email на `kdv1@bk.ru`. Источник unit'ов: `tools/liderra-monitoring/liderra-queue*.service`.**`--timeout=300` в `ExecStart`** (22.05 утро, инцидент `signal=9/KILL` каждые 60с): Laravel queue worker дефолтным `--timeout=60` убивал сам себя через `pcntl_alarm`+`posix_kill` раньше, чем `RefreshSupplierSessionJob` успевал завершить PlaywrightBridge (cold-start Chromium на 2GB VM ~65с — HOTPATCH `PlaywrightBridge.php:TIMEOUT_SECONDS=180`, но воркера про это «забыли»). Поймано через `bpftrace tracepoint:signal:signal_generate` — sender pid == target pid, comm=php. На сервере также drop-in `/etc/systemd/system/liderra-queue.service.d/timeout.conf` как safety-net до синка из репо. Проверено вживую: `RefreshSupplierSessionJob 1 мин. 5 сек. DONE` (раньше `1 мин. FAIL → KILL`).
- **Развёрнутый прикладной код (22.05):** ✅ регистрация по коду на email + обязательный телефон (E2E live: `POST /api/auth/register/start` → 200 + реальная отправка); ✅ деление лимита лидов B1/B2/B3 (денежный фикс `distributeForPlatform`, on main `e6beff6`; **re-split существующих проектов ВЫПОЛНЕН 22.05 форсом** — все активные поделены: 50→17/17/16, 30→10/10/10, 24→8/8/8, 18→6/6/6, 15→5/5/5; переплата ×N остановлена. NB: уже-`ok` проекты со старыми ×N батч сам не перечинивает → нужен force per-project online-синк); ✅ RLS-фикс admin-impersonation (`pgsql_supplier` BYPASSRLS, on main `b32dfbc`). Все три проверены на проде. Бэкапы выкаток — `/home/ubuntu/deploy-backups/`.
## 3. База данных
@@ -76,6 +76,6 @@
- **Конфиг:** ✅ `MAIL_*` прописаны на боевом сервере 22.05 (`MAIL_MAILER=smtp`, host/port `465`/scheme `smtps`/username/password/`from=verify@liderra.ru`/`from_name=Лидерра`); было `MAIL_MAILER=log` (письма не уходили). Бэкап `.env.bak-*`. Применено через `config:cache`. **Подтверждено живой отправкой** (`SENT_OK` + E2E register/start → 200). Пароль ящика — секрет, в git нет; кандидат в Lockbox.
-**Фича «регистрация по коду + обязательный телефон»****выкачена на боевой сервер 22.05** (backend 9 файлов + фронт пересобран `public/build` + `MAIL_*` + config/route cache + queue restart). E2E live: `POST /api/auth/register/start` → 200, код реально уходит на email. Код в ветке `feat/test-deploy` (`0e31783`).
> ✅ Закрыто 22.05: APP_URL → https://liderra.ru + SANCTUM-домены (см. §2); фирменная исходящая почта (см. §7); WAF переведён в боевой режим блокировки (см. §4); CSP в боевом режиме (блокировка) + email-алертинг отчёта + off-site зашифрованный бэкап на почту (см. §4); **выкачен прикладной код — регистрация по коду+телефон, денежный фикс лимита B1/B2/B3, RLS-фикс admin-impersonation (см. §2)**; устранён retry-шторм supplier-задачи по удалённому лиду №1 (`RouteSupplierLeadJob` `findOrFail`→`find`+terminal, фикс `0c9357a` задеплоен; очередь повторов + failed_jobs почищены, ~25k записей); **устранён 500-инцидент на всём портале (повреждённый APP_KEY, CRLF в .env, APP_KEY ротирован — все Redis-сессии невалидны); добавлен healthcheck/2 мин + email-алёрт; pre-flight гейт 15 проверок; systemd-лимиты очереди + OnFailure email; WAF threshold для /api/* 5→10 — см. §2 и §4 SEC-1/SEC-4**.
> ✅ Закрыто 22.05: APP_URL → https://liderra.ru + SANCTUM-домены (см. §2); фирменная исходящая почта (см. §7); WAF переведён в боевой режим блокировки (см. §4); CSP в боевом режиме (блокировка) + email-алертинг отчёта + off-site зашифрованный бэкап на почту (см. §4); **выкачен прикладной код — регистрация по коду+телефон, денежный фикс лимита B1/B2/B3, RLS-фикс admin-impersonation (см. §2)**; устранён retry-шторм supplier-задачи по удалённому лиду №1 (`RouteSupplierLeadJob` `findOrFail`→`find`+terminal, фикс `0c9357a` задеплоен; очередь повторов + failed_jobs почищены, ~25k записей); **устранён 500-инцидент на всём портале (повреждённый APP_KEY, CRLF в .env, APP_KEY ротирован — все Redis-сессии невалидны); добавлен healthcheck/2 мин + email-алёрт; pre-flight гейт 15 проверок; systemd-лимиты очереди + OnFailure email; WAF threshold для /api/* 5→10 — см. §2 и §4 SEC-1/SEC-4**; **устранён цикл SIGKILL `liderra-queue` каждые 60с — добавлен `--timeout=300` в systemd ExecStart, см. §2**.
>
> ⚠️ Снимок волатилен. Истина — реальные команды по SSH (`systemctl is-active …`, `nginx -T`, `yc …` при наличии доступа).