broqit / laravel-ping-pong-monitor
Internal service monitoring system for HTTP/TCP/DB checks with incidents and multi-channel notifications.
Package info
github.com/broqit/laravel-ping-pong-monitor
Type:project
pkg:composer/broqit/laravel-ping-pong-monitor
Requires
- php: ^8.2
- laravel/fortify: ^1.30
- laravel/framework: ^12.0
- laravel/tinker: ^2.10.1
- livewire/blaze: ^1.0
- livewire/flux: ^2.9.0
- livewire/livewire: ^4.0
Requires (Dev)
- fakerphp/faker: ^1.23
- fruitcake/laravel-debugbar: ^4.0
- laravel/pail: ^1.2.2
- laravel/pint: ^1.24
- laravel/sail: ^1.41
- mockery/mockery: ^1.6
- nunomaduro/collision: ^8.6
- phpunit/phpunit: ^11.5.3
This package is auto-updated.
Last update: 2026-03-07 11:27:17 UTC
README
Ping-Pong Monitor is an internal service monitoring system built with Laravel 12, Livewire 4, and Flux UI.
It monitors HTTP endpoints, databases, queues, search engines, brokers, SMTP servers, and custom REMP health endpoints across multiple environments such as dev, stage, and prod. When a service goes down or recovers, the system can notify the team via Email, Slack, Telegram, Microsoft Teams, Discord, or generic webhooks.
Screenshots
Features
- Service grouping by domain or platform area
- Environment-aware checks (
dev,stage,prod) - Queue-based health checks with per-check jobs
- Public incidents page
- Recent incidents tracking with resolution status and duration
- Manual rerun actions for a single check, a group, or all checks
- Notification channels with test-send buttons
- Live dashboard with periodic refresh
- Support for custom health formats such as REMP service health JSON
Supported Check Types
| Type | Purpose | Default ports |
|---|---|---|
http |
HTTP/HTTPS endpoint, status code, body, SSL verification | 80, 443 |
tcp |
Raw TCP connectivity | any |
mysql |
MySQL/MariaDB connectivity via PDO | 3306 |
postgres |
PostgreSQL connectivity via PDO | 5432 |
redis |
Redis connectivity / ping | 6379 |
elasticsearch |
Cluster health check | 9200 |
memcache |
Memcache stats check | 11211 |
minio |
MinIO live/ready probes | 9000, 9001 |
meilisearch |
Meilisearch health API | 7700 |
sphinx |
SphinxQL or binary TCP checks | 9306, 9312 |
rabbitmq |
Management API or AMQP connectivity | 15672, 5672 |
smtp |
SMTP EHLO / STARTTLS / implicit TLS | 25, 465 |
remp |
REMP health JSON endpoint | custom |
Main Pages
| URL | Description |
|---|---|
/ |
Public landing page |
/incidents |
Public incidents page with environment filter |
/dashboard |
Authenticated monitoring dashboard |
/monitor/services |
Service groups, services, and checks management |
/monitor/notifications |
Notification channels management |
Data Model
ServiceGroup
-> Service
-> ServiceCheck -> Environment
-> CheckResult
-> Incident
ServiceGroupgroups related servicesServicerepresents an application or infrastructure componentServiceCheckstores a concrete health check definitionEnvironmentseparates the same check acrossdev,stage, andprodCheckResultstores historical executionsIncidentrepresents a down/degraded period and its recovery
Local Development
Requirements
- PHP
8.2+ - Composer
- Node.js
20+ - npm or pnpm
- SQLite by default, or another Laravel-supported database
Quick Start
composer install npm install cp .env.example .env php artisan key:generate touch database/database.sqlite php artisan migrate php artisan db:seed --class=Database\\Seeders\\MonitorSeeder composer run dev
Open http://localhost:8000.
Queue and Scheduler
The app expects:
- a queue worker
- the Laravel scheduler
The project already schedules monitoring every minute in routes/console.php.
Manual commands:
php artisan monitor:check php artisan monitor:check --sync php artisan monitor:check --id=5 --sync php artisan queue:work --tries=1 --timeout=30 php artisan schedule:work
Notification Channels
Each notification channel stores its own config payload.
| Channel | Required config fields |
|---|---|
to |
|
| Slack | webhook_url |
| Telegram | bot_token, chat_id |
| Microsoft Teams | webhook_url |
| Discord | webhook_url |
| Webhook | webhook_url |
You can enable or disable notifications independently for:
- down events
- recovery events
The admin UI also supports sending test notifications per channel.
REMP Health Checks
The project includes support for REMP-style health endpoints that return JSON such as:
{
"status": "OK",
"database": { "status": "OK" },
"redis": { "status": "OK" },
"log": { "status": "OK" },
"storage": { "status": "OK" }
}
The remp checker can validate:
- overall status
- individual component status
- detailed failure messages and context
Docker
The repository includes a simple Docker setup for local use. It runs:
- the Laravel app on port
8000 - a queue worker
- the scheduler
Files
Start with Docker
docker compose up --build
Then open http://localhost:8000.
The container entrypoint will:
- create
APP_KEYif missing - create the SQLite database file if needed
- run migrations
If you want fresh seed data:
docker compose exec app php artisan db:seed --class=Database\\Seeders\\MonitorSeeder
Stop Docker
docker compose down
To remove the persistent SQLite volume too:
docker compose down -v
Project Structure
app/
Console/
Jobs/
Livewire/
Models/
Notifications/
Services/Monitor/
config/
database/
public/
resources/views/
routes/
tests/
Important parts:
- CheckServicesCommand.php
- RunServiceCheckJob.php
- DispatchServiceChecksJob.php
- MonitorService.php
- CheckerFactory.php
- Dashboard.php
- ServiceManager.php
- NotificationManager.php
Extending the Project
Add a new check type
- Create a checker in
app/Services/Monitor/Checkers/. - Register it in CheckerFactory.php.
- Add admin form fields for its configuration.
- Add UI icon mapping for the new type.
Add a new notification channel
- Extend the channel model labels/icons.
- Add delivery logic in MonitorService.php or the admin sender.
- Add configuration fields in the admin UI.
License
This project is licensed under the MIT License.
That means other developers can fork it, submit pull requests, and reuse the code under standard MIT terms. See LICENSE.

