Search by

nowo-tech / uptime-monitor-bundle

HecFranco

Symfony bundle for synthetic uptime monitoring (Uptime Kuma-style): scheduled checks, retention, aggregates, multi-tenant dashboard.

Package info

github.com/nowo-tech/UptimeMonitorBundle

Type:symfony-bundle

pkg:composer/nowo-tech/uptime-monitor-bundle

Fund package maintenance!

HecFranco

Statistics

Installs: 353

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 2

v1.28.2 2026-11-12 18:34 UTC

README

CI Packagist Version Packagist Downloads License PHP Symfony GitHub stars Coverage

⭐ Found this useful? Give it a star on GitHub! It helps us maintain and improve the project.

Symfony bundle for synthetic uptime monitoring (Uptime Kuma–style): scheduled checks, detail retention, perpetual aggregates, multi-tenant dashboard with polling sync, public status page, and notifications.

📋 Compatible with Symfony 7.4+ and 8.x (PHP 8.2+)

FrankenPHP Friendly Worker Mode

This bundle is FrankenPHP worker mode friendly. Checks and notifications run only in CLI / Messenger workers with explicit per-call deadlines, so they never pin a FrankenPHP thread — see Timeouts.

Screenshots

Uptime dashboard: monitor tree with uptime percentages and heartbeat bars, status counters and the recent checks feed
Multi-tenant dashboard — heartbeat history, live status counters and recent checks
Monitor detail page with 24 h check history, uptime ratios and the response-time chart
Monitor detail — 24 h heartbeat, uptime ratios and response-time chart

Captured from the Symfony 8 demo (seeded monitors + 24 h of history) by Playwright: make demo-screenshots refreshes them.

Features

  • ✅ HTTP/HTTPS, TCP, DNS, SSL certificate, and Ping (ICMP) checks
  • ✅ Symfony Scheduler + nowo:uptime:run-due-checks
  • ✅ Ops CLI: nowo:uptime:rollup, nowo:uptime:purge-detail, nowo:uptime:clear-data (plus sync-schema / seed-demo)
  • ✅ Doctrine entities: tenant, monitor, check result, aggregates, incidents
  • ✅ YAML retention (detail_days) + aggregates kept forever
  • ✅ REST summary API for dashboard polling (?since= delta support)
  • ✅ Vite + TypeScript dashboard and Chart.js charts
  • ✅ Public status page per tenant (/status/{tenantSlug})
  • ✅ Email, webhook, Slack notifications (on status change)
  • ✅ CRUD for monitors and tenants (Twig UI)
  • ✅ Symfony 8 demo (FrankenPHP) — see docs/DEMO-FRANKENPHP.md
  • ✅ Mercure real-time dashboard sync (dashboard.sync: mercure)
  • ✅ Monitors as code: nowo:uptime:apply-monitors applies push monitors from a JSON file (schema shipped), with push tokens from a 0600 file or stdin only — see docs/PUSH-MONITORS.md
  • ✅ Multi-tenant access checkers: per-tenant and per-monitor decisions, and security.denied_tenant_status: 404 to hide tenants a user may not access — see docs/CONFIGURATION.md

Quick start

composer require nowo-tech/uptime-monitor-bundle
# config/packages/nowo_uptime_monitor.yaml
nowo_uptime_monitor:
    retention:
        detail_days: 30
php bin/console nowo:uptime:sync-schema
php bin/console nowo:uptime:seed-demo
php bin/console nowo:uptime:run-due-checks
# ops: nowo:uptime:rollup · nowo:uptime:purge-detail · nowo:uptime:clear-data

Dashboard: /uptime/{tenantSlug} · Status page: /status/{tenantSlug} (default tenant main).

Development

make up
make test
make assets
make -C demo up-symfony8

Demo Playwright e2e and README screenshots (REQ-DEMO-013, Playwright runs in the official Docker image against demo/symfony8):

make test-e2e           # dashboard, monitor create + detail, public status page, settings
make demo-screenshots   # reseeds the demo and refreshes docs/images/demo/*.webp

Documentation

Additional documentation

Tests and coverage

Figures of CI run 41183697424 on f0b257c (v1.17.0; the source is unchanged since). Refresh them from the CI run of the release SHA:

Language Line coverage Gate Command
PHP 100% (5447/5447 lines, 657/657 methods; 896 tests) 100% — composer test-coverage-100 fails below it (CI coverage job, make release-check) make test-coverage-100
TypeScript 98.9% lines (815/824), 93.6% branches (Vitest v8; 92 tests) 90% — vitest.config.ts thresholds (CI frontend job, make test-ts) make test-ts
Python N/A (no Python code) — —
  • PHP — PHPUnit tests/Unit and tests/Integration. Repository, schema-sync, dashboard read-model, backup and console-command tests run against a real Doctrine ORM schema (PHPUnit group db: vendor/bin/phpunit --group db) on in-memory SQLite, and on MySQL and PostgreSQL with make test-with-db (UPTIME_TEST_DATABASE_URL). Network checks run offline: MockHttpClient for HTTP, a fake SocketConnectorInterface and DNS lookups for TCP/SSL/DNS/ping, and a loopback-only TLS server for the default socket connector. Time-dependent code is tested with Symfony\Component\Clock\MockClock.
  • Deprecations — phpunit.xml.dist fails the run on any deprecation, Symfony's silenced trigger_deprecation() calls included (failOnDeprecation, ignoreSuppressionOfDeprecations); tests of the deprecated 1.x config keys assert their deprecation.
  • Measured scope — all of src/ (controllers and the Twig extension included); no exclusion in phpunit.xml.dist and no @codeCoverageIgnore.
  • TypeScript — Vitest specs for the dashboard assets (src/Resources/assets/src/*.test.ts); the run fails below the 90% thresholds of vitest.config.ts.
make test
make test-coverage
make test-coverage-100
make test-ts
make release-check

License

MIT — see LICENSE.