10. Debug Laravel local & in prod. Laravel Telescope and Log viewer. Authentication для Horizon

Відео версія
(YouTube - для зворотнього зв'язку)

Laravel Telescope

Найлегший і найзручніший спосіб дебажити Laravel локально - Laravel Telescope.

Документації достатньо, але маю декілька порад:

ЗАВЖДИ встановлюйте лише для локальної роботи. Телескоп записує абсолютно все, кожну дію. БД навіть для одного розробника локально росте дуже швидко. Оптимізація також суттєво падає. Для прода налаштовуємо LogViewer і зовнішній Sentry, New Relic...

Додайте public/vendor до .gitignore. Та публікуйте web інтерфейс post-install-cmd та post-update-cmd. Це стосується всіх пакетів з web інтерфейсом. Всі пакети, що йдуть у продакшен, треба публікувати як крок CI скрипту.

dump - корисна функція Telescope, яка не працює з Cache Driver від file. Але працює з TELESCOPE_DUMP_WATCHER_ALWAYS, встановленим у true.

Додавайте healthcheck команди та роути до ignore_paths у config/telescope.php. Це зменшить спам у звітах Telescope.

Laravel Log Viewer

Дебажити продакшен можна лише логами. Нічого іншого людство ще не придумало.

Моніторити продакшен раджу використовуючи зовнішні сервіси, наприклад NewRelic або Sentry.

Для дебагу - логи. Читати логи на сервері незручно і небезпечно.

Мінімізуйте кількість людей, що мають доступ до сервера.

Для логів раджу пакет Laravel Log Viewer.

Він надає:

  • Зручний вебінтерфейс за замовчуванням /log-view.
  • Читати лог файли не тільки laravel, а й nginx, supervisor, php і т.д.
  • Керувати доступами до конкретного лог файлу та для видалення лог файлів. Це дозволить закрити можливість зловмисникам видаляти логи через вебінтерфейс.

Порада та ж сама, що й для Telescope, Horizon і будь-якого пакета з вебінтерфейсом. Додаємо на update та insert composer hooks:

{
  "scripts": {
    "post-install-cmd": [
      "@php artisan vendor:publish --tag=log-viewer-assets --ansi --force"
    ],
    "post-update-cmd": [
      "@php artisan vendor:publish --tag=log-viewer-assets --ansi --force"
    ]
  }
}

І не забувайте, що Log Viewer assets треба опублікувати при релізі на продакшен або стейдж - php artisan vendor:publish --tag=log-viewer-assets --ansi --force.

І порада по логах - одразу увімкніть daily логи. Логгер буде створювати лог файл для кожного дня. Це зробить навігацію легшою та розмір файлу меншим.

LOG_CHANNEL=daily

Авторизація Horizon та LogViewer

Логи, інформація про черги, логи черг - містять персональну інформацію та інформацію, що допоможе зловмисникам отримати доступ до проєкту. Закривати дашборди - обов'язково.

Всі пакети з webview повинні бути захищені від доступу користувачів.

Дуже раджу відкривати їх лише для корпоративних VPN IP адрес! Це дасть контроль над доступом для співробітників і дуже легко налаштовується.

Якщо ж VPN не варіант - реалізуйте власну авторизацію. Дуже простий спосіб - пакет Laravel Very Basic Auth.

Мінімальний конфіг:

BASIC_AUTH_USERNAME=
BASIC_AUTH_PASSWORD=

Якщо залишити login та password пустими - авторизація не потрібна, що зручно для локальної роботи.

Далі дуже просто для Horizon додати VeryBasicAuth до middleware:

'middleware' => [
    'web',
    \Olssonm\VeryBasicAuth\Http\Middleware\VeryBasicAuth::class
]

Для LogViewer. Опублікуйте log-viewer config та додайте VeryBasicAuth до middleware та api_middleware:

 'middleware' => [
    'web',
    \Opcodes\LogViewer\Http\Middleware\AuthorizeLogViewer::class,
    \Olssonm\VeryBasicAuth\Http\Middleware\VeryBasicAuth::class
],
'api_middleware' => [
    \Opcodes\LogViewer\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    \Opcodes\LogViewer\Http\Middleware\AuthorizeLogViewer::class,
    \Olssonm\VeryBasicAuth\Http\Middleware\VeryBasicAuth::class
],

І ще одна порада. Змініть роути за замовчуванням для адмінок на продакшені. Для локальної розробки краще залишити за замовчуванням.

Для Horizon:

HORIZON_PATH=some_complex_string_hash_is_perfect

Для Log Viewer:

LOG_VIEWER_PATH=some_complex_string_hash_is_perfect

Та обов'язково додати до конфігурації:

'route_path' => env('LOG_VIEWER_PATH', 'log-viewer'),