Installs laravel/telescope ^5.0 (v5.12.5) as a dev-dependency.
Three-layer production safety adapted to Laravel 11 layout (no
Kernel.php; routing/schedule in bootstrap/app.php +
routes/console.php):
1. composer.json `extra.laravel.dont-discover` lists
laravel/telescope. After editing, `php artisan package:discover`
regenerates bootstrap/cache/packages.php — without this step
the auto-discovery cache still registers the vendor provider.
2. AppServiceProvider::register() gates registration to local +
testing environments. Registers BOTH the vendor
Laravel\Telescope\TelescopeServiceProvider (routes, migrations,
publishing) AND the project's App\Providers\TelescopeService
Provider (gate + filter) — they're sibling classes that extend
ServiceProvider independently, not parent/child, so both must
register for the dashboard to work. bootstrap/providers.php
deliberately does NOT list either Telescope provider.
3. .env TELESCOPE_ENABLED flag (false in .env.example). Runtime
toggle that disables Telescope even when the providers are
registered.
Production safety verified via simulated APP_ENV=production check:
confirms no Telescope-* providers are loaded.
Authorization: viewTelescope gate restricts dashboard to users
with the super_admin Spatie Permission role. Even in local
environments, only super_admin can view. Default was an email
allow-list stub — replaced with `$user->hasRole('super_admin')`.
Pruning: Schedule::command('telescope:prune --hours=48') added in
routes/console.php (Laravel 11's schedule location), environment-
gated to local + testing only.
Documentation: /dev-docs/TELESCOPE.md added; CLAUDE.md gets a
Development-tooling section. The doc explicitly calls out the
dual-provider registration (vendor + app) which differs from the
single-provider pattern in older Laravel versions.
Migrations applied: telescope_entries, telescope_entries_tags,
telescope_monitoring tables. Route registration verified in local
(42 telescope.* routes).
Tests: 1208/1208 passing — Telescope loads in the testing
environment as well, so the suite exercised it without issues.
Deployment note (flag for separate docs): a production operator
who runs `php artisan migrate` manually will still apply the
Telescope migrations — but because the providers never register
in production, the tables stay empty.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
213 lines
6.8 KiB
PHP
213 lines
6.8 KiB
PHP
<?php
|
|
|
|
use Laravel\Telescope\Http\Middleware\Authorize;
|
|
use Laravel\Telescope\Watchers;
|
|
|
|
return [
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Telescope Master Switch
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| This option may be used to disable all Telescope watchers regardless
|
|
| of their individual configuration, which simply provides a single
|
|
| and convenient way to enable or disable Telescope data storage.
|
|
|
|
|
*/
|
|
|
|
'enabled' => env('TELESCOPE_ENABLED', true),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Telescope Domain
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| This is the subdomain where Telescope will be accessible from. If the
|
|
| setting is null, Telescope will reside under the same domain as the
|
|
| application. Otherwise, this value will be used as the subdomain.
|
|
|
|
|
*/
|
|
|
|
'domain' => env('TELESCOPE_DOMAIN'),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Telescope Path
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| This is the URI path where Telescope will be accessible from. Feel free
|
|
| to change this path to anything you like. Note that the URI will not
|
|
| affect the paths of its internal API that aren't exposed to users.
|
|
|
|
|
*/
|
|
|
|
'path' => env('TELESCOPE_PATH', 'telescope'),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Telescope Storage Driver
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| This configuration options determines the storage driver that will
|
|
| be used to store Telescope's data. In addition, you may set any
|
|
| custom options as needed by the particular driver you choose.
|
|
|
|
|
*/
|
|
|
|
'driver' => env('TELESCOPE_DRIVER', 'database'),
|
|
|
|
'storage' => [
|
|
'database' => [
|
|
'connection' => env('DB_CONNECTION', 'mysql'),
|
|
'chunk' => 1000,
|
|
],
|
|
],
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Telescope Queue
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| This configuration options determines the queue connection and queue
|
|
| which will be used to process ProcessPendingUpdate jobs. This can
|
|
| be changed if you would prefer to use a non-default connection.
|
|
|
|
|
*/
|
|
|
|
'queue' => [
|
|
'connection' => env('TELESCOPE_QUEUE_CONNECTION'),
|
|
'queue' => env('TELESCOPE_QUEUE'),
|
|
'delay' => env('TELESCOPE_QUEUE_DELAY', 10),
|
|
],
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Telescope Route Middleware
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| These middleware will be assigned to every Telescope route, giving you
|
|
| the chance to add your own middleware to this list or change any of
|
|
| the existing middleware. Or, you can simply stick with this list.
|
|
|
|
|
*/
|
|
|
|
'middleware' => [
|
|
'web',
|
|
Authorize::class,
|
|
],
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Allowed / Ignored Paths & Commands
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| The following array lists the URI paths and Artisan commands that will
|
|
| not be watched by Telescope. In addition to this list, some Laravel
|
|
| commands, like migrations and queue commands, are always ignored.
|
|
|
|
|
*/
|
|
|
|
'only_paths' => [
|
|
// 'api/*'
|
|
],
|
|
|
|
'ignore_paths' => [
|
|
'livewire*',
|
|
'nova-api*',
|
|
'pulse*',
|
|
'_boost*',
|
|
'.well-known*',
|
|
],
|
|
|
|
'ignore_commands' => [
|
|
//
|
|
],
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Telescope Watchers
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| The following array lists the "watchers" that will be registered with
|
|
| Telescope. The watchers gather the application's profile data when
|
|
| a request or task is executed. Feel free to customize this list.
|
|
|
|
|
*/
|
|
|
|
'watchers' => [
|
|
Watchers\BatchWatcher::class => env('TELESCOPE_BATCH_WATCHER', true),
|
|
|
|
Watchers\CacheWatcher::class => [
|
|
'enabled' => env('TELESCOPE_CACHE_WATCHER', true),
|
|
'hidden' => [],
|
|
'ignore' => [],
|
|
],
|
|
|
|
Watchers\ClientRequestWatcher::class => [
|
|
'enabled' => env('TELESCOPE_CLIENT_REQUEST_WATCHER', true),
|
|
'ignore_hosts' => [],
|
|
],
|
|
|
|
Watchers\CommandWatcher::class => [
|
|
'enabled' => env('TELESCOPE_COMMAND_WATCHER', true),
|
|
'ignore' => [],
|
|
],
|
|
|
|
Watchers\DumpWatcher::class => [
|
|
'enabled' => env('TELESCOPE_DUMP_WATCHER', true),
|
|
'always' => env('TELESCOPE_DUMP_WATCHER_ALWAYS', false),
|
|
],
|
|
|
|
Watchers\EventWatcher::class => [
|
|
'enabled' => env('TELESCOPE_EVENT_WATCHER', true),
|
|
'ignore' => [],
|
|
],
|
|
|
|
Watchers\ExceptionWatcher::class => env('TELESCOPE_EXCEPTION_WATCHER', true),
|
|
|
|
Watchers\GateWatcher::class => [
|
|
'enabled' => env('TELESCOPE_GATE_WATCHER', true),
|
|
'ignore_abilities' => [],
|
|
'ignore_packages' => true,
|
|
'ignore_paths' => [],
|
|
],
|
|
|
|
Watchers\JobWatcher::class => env('TELESCOPE_JOB_WATCHER', true),
|
|
|
|
Watchers\LogWatcher::class => [
|
|
'enabled' => env('TELESCOPE_LOG_WATCHER', true),
|
|
'level' => 'error',
|
|
],
|
|
|
|
Watchers\MailWatcher::class => env('TELESCOPE_MAIL_WATCHER', true),
|
|
|
|
Watchers\ModelWatcher::class => [
|
|
'enabled' => env('TELESCOPE_MODEL_WATCHER', true),
|
|
'events' => ['eloquent.*'],
|
|
'hydrations' => true,
|
|
],
|
|
|
|
Watchers\NotificationWatcher::class => env('TELESCOPE_NOTIFICATION_WATCHER', true),
|
|
|
|
Watchers\QueryWatcher::class => [
|
|
'enabled' => env('TELESCOPE_QUERY_WATCHER', true),
|
|
'ignore_packages' => true,
|
|
'ignore_paths' => [],
|
|
'slow' => 100,
|
|
],
|
|
|
|
Watchers\RedisWatcher::class => env('TELESCOPE_REDIS_WATCHER', true),
|
|
|
|
Watchers\RequestWatcher::class => [
|
|
'enabled' => env('TELESCOPE_REQUEST_WATCHER', true),
|
|
'size_limit' => env('TELESCOPE_RESPONSE_SIZE_LIMIT', 64),
|
|
'ignore_http_methods' => [],
|
|
'ignore_status_codes' => [],
|
|
],
|
|
|
|
Watchers\ScheduleWatcher::class => env('TELESCOPE_SCHEDULE_WATCHER', true),
|
|
Watchers\ViewWatcher::class => env('TELESCOPE_VIEW_WATCHER', true),
|
|
],
|
|
];
|