Skip to content

Commit 747404d

Browse files
committed
feat: implement application health check
1 parent 184be54 commit 747404d

7 files changed

Lines changed: 122 additions & 1 deletion

File tree

composer.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,10 @@
5959
"opcodesio/log-viewer": "^3.17",
6060
"pxlrbt/filament-environment-indicator": "^2.1",
6161
"pxlrbt/filament-excel": "^2.4",
62+
"shuvroroy/filament-spatie-laravel-health": "^2.3",
6263
"spatie/laravel-package-tools": "^1.18",
6364
"spatie/laravel-translatable": "^6.11",
65+
"spatie/security-advisories-health-check": "^1.2",
6466
"stechstudio/filament-impersonate": "^3.16",
6567
"tangodev-it/filament-emoji-picker": "^1.0",
6668
"typesense/typesense-php": "^5.0"
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
use Spatie\Health\Models\HealthCheckResultHistoryItem;
7+
use Spatie\Health\ResultStores\EloquentHealthResultStore;
8+
9+
return new class extends Migration
10+
{
11+
public function up()
12+
{
13+
$connection = (new HealthCheckResultHistoryItem)->getConnectionName();
14+
$tableName = EloquentHealthResultStore::getHistoryItemInstance()->getTable();
15+
16+
Schema::connection($connection)->create($tableName, function (Blueprint $table) {
17+
$table->id();
18+
19+
$table->string('check_name');
20+
$table->string('check_label');
21+
$table->string('status');
22+
$table->text('notification_message')->nullable();
23+
$table->string('short_summary')->nullable();
24+
$table->json('meta');
25+
$table->timestamp('ended_at');
26+
$table->uuid('batch');
27+
28+
$table->timestamps();
29+
});
30+
31+
Schema::connection($connection)->table($tableName, function (Blueprint $table) {
32+
$table->index('created_at');
33+
$table->index('batch');
34+
});
35+
}
36+
};

routes/console.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
use Illuminate\Support\Facades\Schedule;
4+
use Spatie\Health\Commands\RunHealthChecksCommand;
5+
use Spatie\Health\Commands\ScheduleCheckHeartbeatCommand;
6+
7+
/*
8+
|--------------------------------------------------------------------------
9+
| Console Routes
10+
|--------------------------------------------------------------------------
11+
|
12+
| This file is where you may define all of your Closure based console
13+
| commands. Each Closure is bound to a command instance allowing a
14+
| simple approach to interacting with each command's IO methods.
15+
|
16+
*/
17+
18+
Schedule::command(RunHealthChecksCommand::class)->everyMinute();
19+
Schedule::command(ScheduleCheckHeartbeatCommand::class)->everyMinute();

src/EclipseServiceProvider.php

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,18 @@
2525
use Illuminate\Support\Facades\DB;
2626
use Illuminate\Support\Facades\Event;
2727
use Illuminate\Support\Facades\Gate;
28+
use Spatie\Health\Checks\Checks\CacheCheck;
29+
use Spatie\Health\Checks\Checks\DebugModeCheck;
30+
use Spatie\Health\Checks\Checks\EnvironmentCheck;
31+
use Spatie\Health\Checks\Checks\HorizonCheck;
32+
use Spatie\Health\Checks\Checks\OptimizedAppCheck;
33+
use Spatie\Health\Checks\Checks\RedisCheck;
34+
use Spatie\Health\Checks\Checks\ScheduleCheck;
35+
use Spatie\Health\Checks\Checks\UsedDiskSpaceCheck;
36+
use Spatie\Health\Facades\Health;
2837
use Spatie\LaravelPackageTools\Package as SpatiePackage;
2938
use Spatie\Permission\PermissionRegistrar;
39+
use Spatie\SecurityAdvisoriesHealthCheck\SecurityAdvisoriesCheck;
3040

3141
class EclipseServiceProvider extends PackageServiceProvider
3242
{
@@ -52,7 +62,8 @@ public function configurePackage(SpatiePackage|Package $package): void
5262
->hasSettings()
5363
->discoversMigrations()
5464
->runsMigrations()
55-
->hasTranslations();
65+
->hasTranslations()
66+
->hasRoute('console');
5667
}
5768

5869
public function register(): self
@@ -125,5 +136,20 @@ public function boot(): void
125136
->locales($availableLocales->pluck('id')->toArray())
126137
->labels($availableLocales->pluck('native_name', 'id')->toArray());
127138
});
139+
140+
// Register health checks
141+
Health::checks([
142+
OptimizedAppCheck::new(),
143+
DebugModeCheck::new(),
144+
EnvironmentCheck::new(),
145+
UsedDiskSpaceCheck::new()
146+
->warnWhenUsedSpaceIsAbovePercentage(70)
147+
->failWhenUsedSpaceIsAbovePercentage(90),
148+
CacheCheck::new(),
149+
HorizonCheck::new(),
150+
RedisCheck::new(),
151+
ScheduleCheck::new(),
152+
SecurityAdvisoriesCheck::new(),
153+
]);
128154
}
129155
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Eclipse\Core\Filament\Pages\Tools;
4+
5+
class HealthCheckResults extends \ShuvroRoy\FilamentSpatieLaravelHealth\Pages\HealthCheckResults
6+
{
7+
public static function getNavigationGroup(): ?string
8+
{
9+
return 'Tools';
10+
}
11+
}

src/Providers/AdminPanelProvider.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use DutchCodingCompany\FilamentDeveloperLogins\FilamentDeveloperLoginsPlugin;
99
use Eclipse\Common\Providers\GlobalSearchProvider;
1010
use Eclipse\Core\Filament\Pages\EditProfile;
11+
use Eclipse\Core\Filament\Pages\Tools\HealthCheckResults;
1112
use Eclipse\Core\Models\Locale;
1213
use Eclipse\Core\Models\Site;
1314
use Eclipse\Core\Models\User;
@@ -41,6 +42,7 @@
4142
use Illuminate\Support\Facades\Schema;
4243
use Illuminate\View\Middleware\ShareErrorsFromSession;
4344
use pxlrbt\FilamentEnvironmentIndicator\EnvironmentIndicatorPlugin;
45+
use ShuvroRoy\FilamentSpatieLaravelHealth\FilamentSpatieLaravelHealthPlugin;
4446

4547
class AdminPanelProvider extends PanelProvider
4648
{
@@ -122,6 +124,9 @@ public function panel(Panel $panel): Panel
122124
SpatieLaravelTranslatablePlugin::make()
123125
->defaultLocales($localeIds),
124126
ThemesPlugin::make(),
127+
FilamentSpatieLaravelHealthPlugin::make()
128+
->usingPage(HealthCheckResults::class)
129+
->authorize(fn (): bool => auth()->user()->hasRole('super_admin')),
125130
])
126131
->navigationGroups([
127132
NavigationGroup::make('Users'),

tests/Feature/AccessTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,25 @@
7272
$this->actingAs($user);
7373
$this->get(config('log-viewer.route_path', 'log-viewer'))->assertStatus(200);
7474
});
75+
76+
test('health check is not accessible for non-super-admin users', function () {
77+
$this->set_up_common_user_and_tenant();
78+
79+
// Assert the user doesn't have super_admin role
80+
$this->assertFalse(auth()->user()->hasRole('super_admin'));
81+
82+
// Test access
83+
$this->get('/admin/health-check-results')
84+
->assertStatus(403);
85+
});
86+
87+
test('health check is accessible for super admin users', function () {
88+
$this->set_up_super_admin_and_tenant();
89+
90+
// Assert the user has super_admin role
91+
$this->assertTrue(auth()->user()->hasRole('super_admin'));
92+
93+
// Test access
94+
$this->get('/admin/health-check-results')
95+
->assertStatus(200);
96+
});

0 commit comments

Comments
 (0)