Repository navigation
16 Troubleshooting
Mikhail Deynekin edited this page Oct 9, 2026
·
1 revision
Первая команда при любой проблеме:
php bin/bas-ip doctor # самодиагностика с подсказками
php bin/bas-ip logs:tail error --lines=50
php bin/bas-ip logs:tail app --lines=50В UI: Админка → Система → Диагностика и Журналы. У каждого ответа
есть X-Request-Id — найдите его в логах (access/error) и увидите всю
цепочку запроса.
| Симптом | Причина и решение |
|---|---|
| Белый экран |
app.debug=true временно → смотреть ошибку; почти всегда: права на storage/ (chown -R www-data storage && chmod -R ug+rwX storage) |
| «Приложение не установлено» | нет .bas-ip.config.local.php — откройте /install или создайте конфиг вручную |
404 на всё, кроме /
|
веб-сервер не смотрит в public/ или не работает rewrite (nginx: try_files $uri /index.php?$query_string; Apache: AllowOverride All + mod_rewrite) |
| 500 после деплоя |
php -v < 8.2; не хватает расширений (php -m: pdo, mbstring, curl, openssl); opcache — перезапустить php-fpm |
| Страница логина циклически редиректит | неверный app.url (http/https mismatch) или прокси без app.behind_proxy + trusted_proxies — сессия теряет Secure-cookie |
| «Не удалось подключиться к базе данных» | хост/порт/креды; для MySQL также mysqlnd/pdo_mysql; socket вместо TCP — unix_socket; SELinux (RHEL): setsebool -P httpd_can_network_connect_db 1
|
| Миграции падают на MariaDB < 10.6 | collation: поставьте utf8mb4_unicode_ci в конфиге соединения |
| Симптом | Причина и решение |
|---|---|
| «Устройство не отвечает» | сеть до панели (ping/telnet 80/443), VLAN/файрвол, base_url со схемой и /api/v0/
|
| 401 от панели | логин/пароль панели; пароль-секрет: secret:list, переустановить secret:set DEVICE_PASSWORD
|
Открывает, но в журнале error
|
смотрите канал device — тело ответа панели; для не-BAS-IP железа используйте http-relay с корректным парсингом ответа |
| Кнопка «Открыть» неактивна | cooldown 3 с (анти-даблтап) или «тихие часы»/расписание; у жителя выключен флаг «доступ» |
| Камера не грузится |
device.camera.mode: за панелью NAT нужен proxy/mjpeg; CSP разрешает хост устройства только для mjpeg
|
| Всё работает, но «по-настоящему» не открывается | включён драйвер dryrun (эмулятор) — переключите на basip/http-relay; doctor это подсвечивает |
| Симптом | Причина и решение |
|---|---|
| Письма не уходят | канал mail не включён (notify.channels.mail.enabled) или SMTP-креды; тест: notify:test --channel=mail --to=you@mail; лог: logs:tail notify
|
| В письмах «Оплатить:» пусто | не задана ссылка оплаты — Настройки → Биллинг → pay_link (пустые строки-подписи удаляются автоматически) |
| Telegram молчит |
bot_token (secret), жители должны указать @username как контакт типа telegram; служебные алерты — admin_chat_id; webhook — integrations.telegram_bot.webhook_url + секрет |
| Очередь стоит | воркер не запущен: cron schedule:run или queue:work; queue:stats; failed → «ретрай» в UI |
| Дубль писем | два воркера? lease защищает от двойной доставки одной строки; проверьте, что cron и systemd-воркер не запускают queue:run одновременно с разными лимитами (это безопасно, но дубли обычно — повторная ручная рассылка) |
| Симптом | Причина и решение |
|---|---|
| Сумма счетов ≠ общей сумме | так не бывает :). Расщепление точное до копейки; если видите расхождение — billing:balances и проверьте, что не было перерасчёта (корректирующие счета — часть начисления) |
| Житель не попал в начисление | выключен (is_active=0), is_billed=0 или удалён — фильтр «все» в списке жителей |
| Оплата «повисла» | проверьте external_id (идемпотентность): повтор вебхука с тем же ID игнорируется — это защита от дублей |
| Просрочка не помечается | cron schedule:run не работает; вручную: billing:overdue
|
- Медленные списки:
EXPLAINчерез Система → Query-log (debug); обычно помогаетmigrate(индексы) иcache:clear. - Большая база (10k+ жителей): MySQL/PostgreSQL вместо SQLite;
ui.per_pageпоменьше;pruneпо политике хранения дляgate_events/outbox. - Поллинг статусов: интервалы в
ui.*_refresh_seconds.
См. отдельную таблицу в 14 · Обновления.
| Канал | Содержание |
|---|---|
app |
общие события приложения |
error |
исключения со стектрейсами |
access |
каждый HTTP-запрос (метод, путь, статус, время, request-id) |
audit |
действия пользователей/API + пометки is_security
|
gate |
открывания/отказы устройства |
device |
HTTP-вызовы панели (тайминги, коды) |
notify |
отправка уведомлений по каналам |
update |
проверки/установки обновлений |
php bin/bas-ip logs:list
php bin/bas-ip logs:tail gate --lines=100
php bin/bas-ip logs:tail audit --q=is_security # инциденты безопасностиПриложение недоступно, а ворота открывать надо:
- Аппаратная кнопка/пульт охраны (всегда должна быть!).
- CLI на сервере:
php bin/bas-ip gate:open --apartment=12 --access=emergency. - Если упало само приложение —
maintenance --onне помогает (оно само и упало): перезапустить php-fpm; данные целы (БД отдельно),doctorпосле.
Не нашли решения — FAQ, встроенная справка /help → «Решение
проблем», или создайте issue (для безопасности — SECURITY.md).
Дальше: 17 · Миграция с v1