Appearance
Типовые проблемы
Собранные из реальной эксплуатации проблемы, их симптомы и решения. Общий принцип диагностики: сначала docker ps (всё ли живо), затем логи конкретного сервиса, затем внутрь контейнера.
«Network Error» / голый 500 без следов в логах
Симптом: на конкретной операции фронтенд показывает Network Error (в консоли браузера — CORS-ошибка), в storage/logs/laravel.log — пусто.
Причина: фатальная ошибка PHP, чаще всего OOM (исчерпан memory_limit). Фатал прерывает выполнение до формирования ответа: браузер получает голый 500 без CORS-заголовков (отсюда обманчивая CORS-ошибка), а Laravel-обработчик логирования не успевает сработать.
Диагностика:
bash
# stderr Apache/PHP — там фатал будет
docker logs orbita_onpremise_backend --since 15m 2>&1 | grep -i "fatal\|memory"
# OOM-kill на уровне ядра
dmesg | grep -i oom | tail
# Воспроизвести операцию точечно — через tinker внутри контейнера
docker exec -it orbita_onpremise_backend php artisan tinkerРешение: найти прожорливую операцию (обычно массовая выборка/экспорт) и либо поднять memory_limit осознанно, либо ограничить объём. Не поднимайте лимит «на всякий случай» — это маскирует проблему до следующего масштаба данных.
Docker DNS отдаёт «чужую» БД (несколько стендов на сервере)
Симптом: периодические password authentication failed for user ... / странные «пропадания» данных на стенде, который в целом работает.
Причина: контейнеры двух стендов с одинаковым hostname (например, database) оказались в одной Docker-сети — DNS резолвит имя в случайный из них.
Решение: внутренние сервисы каждого стенда — строго в своей сети; в общей сети Traefik — только маршрутизируемые сервисы. См. Второй стенд на одном сервере.
Не выпускается TLS-сертификат
Симптом: браузер ругается на сертификат, в логах Traefik — ошибки ACME.
Проверить по порядку:
- DNS:
dig +short <домен>→ IP сервера. - Для HTTP-01: порт 80 снаружи доступен (файрвол, NAT).
- Для DNS-01 (Cloudflare): домен в нужном аккаунте Cloudflare, API-токен жив.
- Email в
traefik/.../traefik.ymlзаполнен. - Логи:
docker logs <traefik> 2>&1 | grep -i acme. - Rate-limit Let's Encrypt (5 неудач/час): после исправления причины подождать час.
acme.json повреждён/потерян — удалить файл и перезапустить Traefik: сертификаты перевыпустятся.
Экспорт отчёта падает или зависает
Симптом: выгрузка отчёта в статусе queued вечно, либо уходит в failed через ~25 минут.
- Вечный
queued→ не работает контейнерqueue-reports(проверка). failedчерез ~25 минут → джоб умер в процессе (обычно OOM на большом PDF), и его добилreports:reap-stuck. Смотритеdocker logsворкера отчётов; решение — выгружать XLSX/CSV вместо PDF или уменьшить отчёт. Лимиты —REPORTS_PDF_MAX_ROWSиmemory_limitворкера, поднимать только парой.
Поиск не находит записи
Симптом: записи существуют, глобальный поиск их не видит (часто после восстановления из бэкапа или сбоя Meilisearch).
bash
docker exec orbita_onpremise_backend php artisan search:rebuildИндекс — производная от БД, его безопасно перестраивать в любой момент. Если и после rebuild пусто — проверить MEILISEARCH_KEY и docker logs orbita_onpremise_meilisearch.
Realtime не работает (нет живых обновлений)
Симптом: данные обновляются только по F5, уведомления не всплывают.
- Консоль браузера: WebSocket на
wss://<домен>/app/...— установился ли. docker logs orbita_onpremise_reverb— жив ли Reverb.VITE_REVERB_*вшиваются при сборке frontend: после смены домена/ключа Reverb нуженdocker compose build frontend(подробнее).- Traefik-маршрут
/app→ сервис reverb (labels в compose).
Вход не работает при верном пароле
Симптом: логин «проглатывается» без ошибки либо 401/419 на /api-запросах сразу после входа.
Причина: cookie сессии не устанавливается — SESSION_DOMAIN / SANCTUM_STATEFUL_DOMAINS не совпадают с реальным доменом (типично после смены домена стенда или захода по IP).
Решение: привести обе переменные к актуальному домену, пересоздать backend-контейнеры, php artisan optimize:clear. Заходить всегда по домену, не по IP.
Письма не отправляются
MAIL_MAILER=log? Тогда письма и не должны уходить — они вlaravel.log. Это стартовый режим по умолчанию.MAIL_MAILER=smtp: проверить хост/порт/шифрование, доступность релея из контейнера (docker exec ... php artisan tinker→Mail::raw(...)), кнопку «Отправить тест» на вкладке Почта в настройках приложения.- Письма уходят, но не доходят — SPF/DKIM домена отправителя (настраивается на стороне почтовой инфраструктуры, не Orbita).
Стенд внезапно «только для чтения»
Это лицензионный режим readonly (истёк grace / отзыв / скачок часов), а не поломка. php artisan license:status → действовать по reason.
Диск закончился
Частые виновники и что с ними делать:
| Что растёт | Решение |
|---|---|
| Docker-логи контейнеров | Ротация настроена? (max-size в logging/daemon.json) |
| Старые образы после обновлений | docker image prune -a (осторожно: удалит и образы для отката) |
| Локальные бэкапы | Уносить с сервера, чистить по retention (бэкапы) |
| БД | Это данные — планировать расширение диска, не «чистку» |
После освобождения места перезапустить контейнеры, которые успели упасть.
Куда смотреть, если проблемы нет в списке
docker ps— всё лиUp/healthy.- Логи причастного сервиса (
docker logs ... --since 30m). storage/logs/laravel.log+ error-log в панели суперадмина.docker stats,df -h,dmesg | tail— ресурсы.- Точечное воспроизведение через
php artisan tinkerв backend-контейнере.