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'),