Skip to content

Типовые проблемы

Собранные из реальной эксплуатации проблемы, их симптомы и решения. Общий принцип диагностики: сначала 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.

Проверить по порядку:

  1. DNS: dig +short <домен> → IP сервера.
  2. Для HTTP-01: порт 80 снаружи доступен (файрвол, NAT).
  3. Для DNS-01 (Cloudflare): домен в нужном аккаунте Cloudflare, API-токен жив.
  4. Email в traefik/.../traefik.yml заполнен.
  5. Логи: docker logs <traefik> 2>&1 | grep -i acme.
  6. 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, уведомления не всплывают.

  1. Консоль браузера: WebSocket на wss://<домен>/app/... — установился ли.
  2. docker logs orbita_onpremise_reverb — жив ли Reverb.
  3. VITE_REVERB_* вшиваются при сборке frontend: после смены домена/ключа Reverb нужен docker compose build frontend (подробнее).
  4. Traefik-маршрут /app → сервис reverb (labels в compose).

Вход не работает при верном пароле

Симптом: логин «проглатывается» без ошибки либо 401/419 на /api-запросах сразу после входа.

Причина: cookie сессии не устанавливается — SESSION_DOMAIN / SANCTUM_STATEFUL_DOMAINS не совпадают с реальным доменом (типично после смены домена стенда или захода по IP).

Решение: привести обе переменные к актуальному домену, пересоздать backend-контейнеры, php artisan optimize:clear. Заходить всегда по домену, не по IP.

Письма не отправляются

  1. MAIL_MAILER=log? Тогда письма и не должны уходить — они в laravel.log. Это стартовый режим по умолчанию.
  2. MAIL_MAILER=smtp: проверить хост/порт/шифрование, доступность релея из контейнера (docker exec ... php artisan tinkerMail::raw(...)), кнопку «Отправить тест» на вкладке Почта в настройках приложения.
  3. Письма уходят, но не доходят — SPF/DKIM домена отправителя (настраивается на стороне почтовой инфраструктуры, не Orbita).

Стенд внезапно «только для чтения»

Это лицензионный режим readonly (истёк grace / отзыв / скачок часов), а не поломка. php artisan license:status → действовать по reason.

Диск закончился

Частые виновники и что с ними делать:

Что растётРешение
Docker-логи контейнеровРотация настроена? (max-size в logging/daemon.json)
Старые образы после обновленийdocker image prune -a (осторожно: удалит и образы для отката)
Локальные бэкапыУносить с сервера, чистить по retention (бэкапы)
БДЭто данные — планировать расширение диска, не «чистку»

После освобождения места перезапустить контейнеры, которые успели упасть.

Куда смотреть, если проблемы нет в списке

  1. docker ps — всё ли Up/healthy.
  2. Логи причастного сервиса (docker logs ... --since 30m).
  3. storage/logs/laravel.log + error-log в панели суперадмина.
  4. docker stats, df -h, dmesg | tail — ресурсы.
  5. Точечное воспроизведение через php artisan tinker в backend-контейнере.

Orbita ITSM — документация для системных администраторов