phil / status-page-bundle
A service status page for Symfony: components, incidents, planned maintenances and history, served as HTML, JSON and Atom without any script, the states read from phil/monitoring-bundle or declared, and a static snapshot pushed outside the monitored infrastructure by a console command or the Schedul
Package info
github.com/parler-haut-interagir-librement/status-page-bundle
Type:symfony-bundle
pkg:composer/phil/status-page-bundle
Requires
- php: >=8.5
- ext-dom: *
- ext-mbstring: *
- ext-uri: *
- phil/url: ^0.1@dev
- psr/clock: ^1.0
- psr/log: ^3.0
- symfony/config: ^8.2
- symfony/dependency-injection: ^8.2
- symfony/filesystem: ^8.2
- symfony/http-foundation: ^8.2
- symfony/routing: ^8.2
- symfony/ux-twig-component: ^3.7
- twig/twig: ^3.21
Requires (Dev)
- league/flysystem: ^3.30
- league/flysystem-memory: ^3.29
- phil/monitoring-bundle: ^0.1@dev
- phil/ux-kit: >=0.1.0-alpha <1.0
- phpunit/phpunit: ^13.4
- symfony/browser-kit: ^8.2
- symfony/cache: ^8.2
- symfony/cache-contracts: ^3.6
- symfony/clock: ^8.2
- symfony/console: ^8.2
- symfony/css-selector: ^8.2
- symfony/dom-crawler: ^8.2
- symfony/framework-bundle: ^8.2
- symfony/http-kernel: ^8.2
- symfony/messenger: ^8.2
- symfony/scheduler: ^8.2
- symfony/translation: ^8.2
- symfony/twig-bridge: ^8.2
- symfony/twig-bundle: ^8.2
Suggests
- league/flysystem: For a "flysystem" target: the snapshot written to an object storage or a remote server
- phil/monitoring-bundle: For the states of the components read from its checks and scheduled tasks
- phil/ux-kit: For the recipes the templates draw — Badge, Card —, through the Symfony UX Toolkit
- symfony/cache: To keep the states read from the checks for a while
- symfony/console: For phil:status-page:push
- symfony/messenger: To push a snapshot in a worker
- symfony/scheduler: To push a snapshot at a regular interval
- symfony/translation: For the page in English and French
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-11-13 22:46:42 UTC
README
The status page of a service — components, incidents, planned maintenances and history — served by the application, and a static snapshot of it pushed outside the monitored infrastructure.
phil/status-page-bundle serves a status page at /status, its JSON at /status.json and its Atom feed at
/status.atom. The page shows each component in its state — operational, under maintenance, degraded, partly
down, down —, the incidents going on with their thread of updates, the maintenances in progress and upcoming,
and the incidents resolved within the history. Each component's state comes from the checks and scheduled tasks
of phil/monitoring-bundle when it is installed, else from the application's configuration; incidents and
maintenances come from the configuration, a JSON file the operators edit, or a store of the application's own.
A page served by the site it describes is gone when the site is down: the bundle therefore writes a snapshot —
index.html, status.json and feed.atom — and pushes it to targets outside the monitored infrastructure, through a
port with named adapters: a directory, a Flysystem storage, or a publisher of the application's own. The console
command phil:status-page:push pushes it, and so does the Scheduler at the frequency the configuration gives.
The page works without any script, sets no cookie, reads no session and loads nothing from another site. Its parts are recipes of the PHIL UX kit — Card, Badge —, installed in the application by the Symfony UX Toolkit, used as they are.
It is a Symfony bundle; phil/monitoring-bundle, Flysystem, the console, Messenger and the Scheduler are optional.
Status
| Part | State |
|---|---|
| Components, incidents with their updates, planned maintenances, history | Implemented and tested |
States from the configuration, or from the checks and tasks of phil/monitoring-bundle, detected |
Implemented and tested |
| Incidents and maintenances from the configuration, a JSON file or a service of the application | Implemented and tested |
| The page as HTML, JSON and Atom, without script, cookie nor session | Implemented and tested |
| Templates drawn with the recipes of the PHIL UX kit | Implemented and tested |
| Snapshot pushed to a directory, a Flysystem storage or a publisher of the application | Implemented and tested |
phil:status-page:push, Messenger message and Scheduler schedule |
Implemented and tested |
| Fuzz target of the records reader | Implemented and tested |
| Flex recipe | Implemented |
Documentation
| Document | What it covers |
|---|---|
| Installation | Requirements, installing, the recipes of the kit. |
| Configuration | Every option, with an example. |
| The page | What the page shows, how a state is worked out, the JSON and the feed. |
| Incidents and maintenances | The format of the records, where they are kept. |
| Snapshot | Targets, the command, Messenger and the Scheduler. |
| Extension points | The services to replace and when they are stable. |
| Testing | The bundle's tests and its fuzz target. |
| Reference | Every class and service of the bundle. |
Quick start
composer require phil/status-page-bundle php bin/console ux:install card --kit=github.com/parler-haut-interagir-librement/ux-kit php bin/console ux:install badge --kit=github.com/parler-haut-interagir-librement/ux-kit
# config/packages/phil_status_page.yaml phil_status_page: title: Example status components: website: { name: Website, checks: [database] } api: { name: API, group: Platform, checks: [database, cache] } records: file: '%kernel.project_dir%/var/status/records.json' snapshot: base_url: 'https://status.example.org/' schedule: '5 minutes' targets: mirror: { type: flysystem, storage: status.storage }
# config/routes/phil_status_page.yaml phil_status_page: resource: '@PhilStatusPageBundle/config/routes.php'
Requirements
PHP 8.5 or later with ext-dom and ext-mbstring, Symfony 8.2 or later, Twig 3.21 and Symfony UX Twig Component
3.7; phil/url.
Contributing
Contributions are welcome on the PHIL monorepo: read the contribution guide and the code of conduct. Report a vulnerability privately, as the security policy explains, never in a public issue.
License
MIT, © Philippe Gamache, doing business as Le Gnome Archiviste; a Parler Haut Interagir Librement project. See LICENSE.