nowo-tech / uptime-monitor-bundle
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!
Requires
- php: >=8.2 <8.6
- doctrine/dbal: ^3.8.2 || ^4.0
- doctrine/doctrine-bundle: ^2.8 || ^3.0
- doctrine/orm: ^3.7
- nowo-tech/form-kit-bundle: ^2.10
- nowo-tech/ui-kit-bundle: ^2.29
- symfony/clock: ^7.4 || ^8.0
- symfony/config: ^7.4 || ^8.0
- symfony/console: ^7.4 || ^8.0
- symfony/dependency-injection: ^7.4 || ^8.0
- symfony/form: ^7.4 || ^8.0
- symfony/framework-bundle: ^7.4 || ^8.0
- symfony/http-client: ^7.4 || ^8.0
- symfony/http-kernel: ^7.4 || ^8.0
- symfony/messenger: ^7.4 || ^8.0
- symfony/routing: ^7.4 || ^8.0
- symfony/scheduler: ^7.4 || ^8.0
- symfony/security-bundle: ^7.4 || ^8.0
- symfony/serializer: ^7.4 || ^8.0
- symfony/translation: ^7.4 || ^8.0
- symfony/twig-bundle: ^7.4 || ^8.0
- symfony/validator: ^7.4 || ^8.0
- symfony/yaml: ^7.4 || ^8.0
- twig/extra-bundle: ^3.12
- twig/string-extra: ^3.12
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- igor-php/igor-php: ^0.10.0
- nowo-tech/phpstan-frankenphp: ^1.0
- phpstan/extension-installer: ^1.0
- phpstan/phpstan: ^2.0
- phpstan/phpstan-phpunit: ^2.0
- phpstan/phpstan-symfony: ^2.0
- phpunit/phpunit: ^11.5
- rector/rector: ^2.0
- symfony/browser-kit: ^7.4 || ^8.0
- symfony/dom-crawler: ^7.4 || ^8.0
- symfony/mailer: ^7.4 || ^8.0
- symfony/mercure: ^0.9.0 || ^0.10.0
- symfony/phpunit-bridge: ^7.4 || ^8.0
- vincentlanglet/twig-cs-fixer: ^4.0
Suggests
- pentatrion/vite-bundle: Vite integration in host application demos
- symfony/mailer: For email notifications
- symfony/mercure-bundle: For dashboard.sync: mercure (real-time SSE updates)
- symfony/messenger: For async check execution and scheduler consumer
Provides
None
Conflicts
None
Replaces
None
- dev-main
- v1.28.2
- v1.28.1
- v1.28.0
- v1.27.0
- v1.26.0
- v1.25.2
- v1.25.1
- v1.25.0
- v1.24.1
- v1.24.0
- v1.23.0
- v1.22.0
- v1.21.0
- v1.20.1
- v1.20.0
- v1.19.1
- v1.19.0
- v1.18.0
- v1.17.2
- v1.17.1
- v1.17.0
- v1.16.2
- v1.16.1
- v1.16.0
- v1.15.1
- v1.15.0
- v1.14.3
- v1.14.2
- v1.14.1
- v1.14.0
- v1.13.0
- v1.12.1
- v1.12.0
- v1.11.0
- v1.10.0
- v1.9.4
- v1.9.3
- v1.9.2
- v1.9.1
- v1.9.0
- v1.8.0
- v1.7.4
- v1.7.3
- v1.7.2
- v1.7.1
- v1.7.0
- v1.6.1
- v1.6.0
- v1.5.0
- v1.4.0
- v1.3.11
- v1.3.10
- v1.3.9
- v1.3.8
- v1.3.7
- v1.3.6
- v1.3.5
- v1.3.4
- v1.3.3
- v1.3.2
- v1.3.1
- v1.3.0
- v1.2.0
- v1.1.1
- v1.1.0
- v1.0.11
- v1.0.10
- v1.0.9
- v1.0.8
- v1.0.7
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- dev-fix/doctrine-bundle-3-4
- dev-fix/tracker-cr
- dev-fix/nx-repo-factory
- dev-fix/savepoint-rollback-nx
- dev-fix/worker-own-em-c9
- dev-feat/arch-001-b3
- dev-ci/igor-worker-audit
- dev-fix/arch-bar-w0
- dev-fix/mask-leftovers
- dev-fix/write-only-secrets
- dev-feat/ddd-p2
- dev-feat/mobile-mux
- dev-feat/um-7-denied-status
- dev-feat/beacon-overrides
- dev-feat/ssl-spki-pins
- dev-fix/1.19.1-audit-fi-fm
- dev-feat/dialog-sizes-2.29
- dev-feat/1.18.0-apply-monitors
- dev-chore/symfony-security-2026-11-04
- dev-fix/ios-dvh
- dev-chore/req-100
- dev-fix/1.16.1-sync-schema-drops
- dev-sec-quota
This package is auto-updated.
Last update: 2026-11-12 22:45:12 UTC
README
⭐ 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+)
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
Multi-tenant dashboard — heartbeat history, live status counters and recent checks |
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(plussync-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-monitorsapplies 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: 404to 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
- Installation
- Configuration
- Usage
- Templates (UiKit page contract)
- Contributing
- Code of Conduct
- Changelog
- Upgrading
- Release process
- Security
- Engram
- Spec-driven development
- GitHub Spec Kit
Additional documentation
- PSR evaluation (REQ-CS-007)
- GitHub Actions CI requirements
- Scheduling
- Check types
- Push monitors — server health (and monitors as code:
nowo:uptime:apply-monitors) - Monitor configuration (Uptime Kuma parity)
- Tenant settings (Uptime Kuma parity)
- Translations (en, es, fr, it, pt, de, nl)
- Notifications
- Mercure real-time sync
- Demo with FrankenPHP
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/Unitandtests/Integration. Repository, schema-sync, dashboard read-model, backup and console-command tests run against a real Doctrine ORM schema (PHPUnit groupdb:vendor/bin/phpunit --group db) on in-memory SQLite, and on MySQL and PostgreSQL withmake test-with-db(UPTIME_TEST_DATABASE_URL). Network checks run offline:MockHttpClientfor HTTP, a fakeSocketConnectorInterfaceand DNS lookups for TCP/SSL/DNS/ping, and a loopback-only TLS server for the default socket connector. Time-dependent code is tested withSymfony\Component\Clock\MockClock. - Deprecations —
phpunit.xml.distfails the run on any deprecation, Symfony's silencedtrigger_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 inphpunit.xml.distand no@codeCoverageIgnore. - TypeScript — Vitest specs for the dashboard assets (
src/Resources/assets/src/*.test.ts); the run fails below the 90% thresholds ofvitest.config.ts.
make test
make test-coverage
make test-coverage-100
make test-ts
make release-check
License
MIT — see LICENSE.


