PHPackages                             devuni/notifier-agent - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Mail &amp; Notifications](/categories/mail)
4. /
5. devuni/notifier-agent

ActiveLibrary[Mail &amp; Notifications](/categories/mail)

devuni/notifier-agent
=====================

Laravel agent for the Devuni Notifier platform - encrypted backups and announcements.

v1.6.2(1mo ago)1131MITPHPPHP ^8.4CI passing

Since Jun 9Pushed 3w agoCompare

[ Source](https://github.com/devuni-cz/notifier-agent)[ Packagist](https://packagist.org/packages/devuni/notifier-agent)[ Docs](https://github.com/devuni-cz/notifier-agent)[ RSS](/packages/devuni-notifier-agent/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (10)Dependencies (33)Versions (16)Used By (0)

Devuni Notifier Agent
=====================

[](#devuni-notifier-agent)

[![Latest Version on Packagist](https://camo.githubusercontent.com/8af1dee4bbcea9e15cb51c7335b3809364f7fb6518dbc05c548fafa8237a0d89/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f646576756e692f6e6f7469666965722d6167656e742e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/devuni/notifier-agent)[![Tests](https://github.com/devuni-cz/notifier-agent/actions/workflows/ci.yml/badge.svg)](https://github.com/devuni-cz/notifier-agent/actions/workflows/ci.yml)[![PHP 8.4 | 8.5](https://camo.githubusercontent.com/5d14369f777c36ed06d2d0598edf43a8f04e0a1678f75e5dcc45d2e1733057cc/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e34253230253743253230382e352d3737374242343f7374796c653d666c61742d737175617265266c6f676f3d706870266c6f676f436f6c6f723d7768697465)](https://www.php.net)[![Laravel 12 | 13](https://camo.githubusercontent.com/9e9b743bcbf97a29fe735334a4a8e906d05d60310969905af6607cef8da30138/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d313225323025374325323031332d4646324432303f7374796c653d666c61742d737175617265266c6f676f3d6c61726176656c266c6f676f436f6c6f723d7768697465)](https://laravel.com)[![License: MIT](https://camo.githubusercontent.com/422db9fd40f5831c765cf6530b6750c081b696bd18d904cf89554df98c676277/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e3f7374796c653d666c61742d737175617265)](LICENSE.md)

Encrypted database &amp; storage backups for Laravel apps, shipped to the [Devuni Notifier](https://notifier.devuni.cz) central server. AES-256 ZIPs, chunked HTTPS upload, token auth, queue support. Supports **MySQL**, **MariaDB**, **PostgreSQL**, and **YugabyteDB** (via YSQL).

How it works
------------

[](#how-it-works)

```
┌─────────────────────┐        encrypted ZIP         ┌─────────────────────┐
│  Your Laravel app   │  ───── chunked upload ─────▶ │  notifier.devuni.cz │
│  (this package)     │        (X-Notifier-Token)    │  (central server)   │
└─────────────────────┘                              └─────────────────────┘
         │                                                     │
         │ mysqldump + storage/app/public                      │ stores + monitors
         │ → AES-256 ZIP                                       │ → sends alerts
         ▼                                                     ▼
    local temp file                                     long-term backup archive
    (cleaned up after upload)

```

> **Heads up:** This is the **client side** of the Devuni Notifier platform. Without a central server configured via `NOTIFIER_URL`, there's nowhere to send backups. If you don't have it, try [spatie/laravel-backup](https://github.com/spatie/laravel-backup) instead.

Install
-------

[](#install)

```
composer require devuni/notifier-agent
php artisan vendor:publish --tag="notifier-config"
php artisan notifier:install   # interactive .env wizard
php artisan notifier:check     # verify setup (env, DB, 7z, mysqldump, URL)
```

**Requirements:** PHP 8.4+, Laravel `^12.55` or `^13.14`, the right dump tool for your DB (`mysqldump` / `mariadb-dump` for MySQL &amp; MariaDB, `pg_dump` or `ysql_dump` for PostgreSQL &amp; YugabyteDB), and `p7zip-full` (recommended) or PHP `zip` extension.

### Migrating from `devuni/notifier-package`

[](#migrating-from-devuninotifier-package)

This package is the successor of [`devuni/notifier-package`](https://github.com/devuni-cz/notifier-package) - same namespace (`Devuni\Notifier\`), same env vars (`NOTIFIER_*`), same artisan commands, same `config/notifier.php`, same route prefix. The swap is one step:

```
composer remove devuni/notifier-package
composer require devuni/notifier-agent
```

Nothing else changes - your published config, `.env`, and scheduled `notifier:*` commands keep working as-is. Don't be confused by the version number: `notifier-agent` restarts at `1.0.0`, but it contains everything `notifier-package` `2.8.0` had (and newer).

> **Never install both packages side by side** - they share the `Devuni\Notifier\` namespace. Composer refuses the combination (a `conflict` rule guards it), so if you see a conflict error during `composer require`, run the `composer remove` step first.

Heads-up when coming from `notifier-package` ≤ 2.7.x: version 2.8.0+ introduced **announcements**, which are enabled by default (see below). If you don't want the banner, set `NOTIFIER_ANNOUNCEMENTS_ENABLED=false`.

Usage
-----

[](#usage)

### Scheduled backups (recommended)

[](#scheduled-backups-recommended)

Add to `routes/console.php`:

```
use Illuminate\Support\Facades\Schedule;

Schedule::command('notifier:database-backup')->dailyAt('02:00')->onOneServer();
Schedule::command('notifier:storage-backup')->weeklyOn(0, '03:00')->onOneServer();
```

### On demand

[](#on-demand)

```
php artisan notifier:database-backup
php artisan notifier:storage-backup
```

### HTTP API

[](#http-api)

Trigger backups from an external scheduler. Rate-limited to 10 req/hour.

```
curl -X POST https://your-app.com/api/notifier/backup \
  -H "X-Notifier-Token: your-token" \
  -d "type=backup_database"   # or backup_storage
```

On failure the response returns an opaque `error_id` (UUID) - the full detail (stack trace, `mysqldump`/7z stderr) stays in your `backup` log channel. Grep logs for the UUID to correlate.

### Announcements

[](#announcements)

Pull this site's maintenance/announcement notices from the central server and show them in your dashboard. **On by default** - it costs nothing until `NOTIFIER_URL` is set (the service no-ops without a target). Disable with `NOTIFIER_ANNOUNCEMENTS_ENABLED=false`.

**Filament hosts** (the common case): when Filament is installed, the notices are **auto-injected** as a banner into every panel page via a render hook - nothing to place. Move the default spot with `NOTIFIER_ANNOUNCEMENTS_FILAMENT_HOOK` (default `panels::content.start`; also `panels::body.start`, `panels::topbar.end`), or turn the auto-injection off with `NOTIFIER_ANNOUNCEMENTS_FILAMENT=false`. Works across Filament v3/v4/v5.

**Per-announcement placement:** each announcement carries a `target` from the control plane. A Filament announcement is routed to the render hook named in its `target`; with no `target` it falls to the default hook above. The package only injects at the hooks you opt into, so to support more than one position list them all (comma-separated) in `NOTIFIER_ANNOUNCEMENTS_RENDER_HOOKS` - the default hook is always included:

```
NOTIFIER_ANNOUNCEMENTS_RENDER_HOOKS="panels::content.start,panels::topbar.end"
```

Existing setups need no change: with no `target` (or older servers) every announcement keeps rendering at the default hook exactly as before.

**Banner cap:** each render location shows the top `NOTIFIER_ANNOUNCEMENTS_MAX_VISIBLE` announcements (default `5`, priority-ordered) plus a muted `+ N dalších oznámení` overflow line; set it to `0` for unlimited. Custom (SPA) hosts via `customAnnouncements()` always get the full list.

**Blade hosts:** drop the component anywhere:

```

```

**Inertia / Vue / React (custom SPA) hosts:** the service is framework-agnostic - render it yourself. Announcements aimed at a custom dashboard arrive with `dashboard_type` `custom` and a `target` DOM element id; fetch just those and mount each at its `target`:

```
// All active announcements (any dashboard_type):
app(\Devuni\Notifier\Services\AnnouncementsService::class)->activeAnnouncements();

// Only the custom (SPA) ones, optionally for a single element id:
app(\Devuni\Notifier\Services\AnnouncementsService::class)->customAnnouncements();
app(\Devuni\Notifier\Services\AnnouncementsService::class)->customAnnouncements('spa-banner');
// e.g. share as an Inertia prop, then render each item into the element named by its 'target'.
```

Requests are **per-repository** and reuse your existing `NOTIFIER_URL` + `X-Notifier-Token` (`GET {NOTIFIER_URL}/announcements`), so the server returns only this site's announcements - no other repositories are disclosed. Responses are cached (`NOTIFIER_ANNOUNCEMENTS_CACHE_TTL`, default 900 s) so the dashboard never blocks on a live request, and any fetch failure renders nothing rather than breaking your dashboard. Customize the Blade markup with `vendor:publish --tag="notifier-views"`.

### Heartbeat

[](#heartbeat)

Tell the control plane this site is alive and report its identity. **On by default** - schedule the command and the server knows the agent is running; the server marks an agent **stale after 6 h** of silence, so the operator sees when a site stops checking in. Disable with `NOTIFIER_HEARTBEAT_ENABLED=false` (the push becomes a no-op).

The host app schedules it - **hourly** is the recommended cadence (comfortably inside the 6 h stale window):

```
use Illuminate\Support\Facades\Schedule;

Schedule::command('notifier:heartbeat')->hourly()->onOneServer();
```

Or run it on demand:

```
php artisan notifier:heartbeat
```

Each heartbeat `POST {NOTIFIER_URL}/heartbeat` (per-repository, same `X-Notifier-Token`) reports an identity + liveness manifest: the **agent / PHP / Laravel versions**, the **queue connection**, which **features** are enabled (announcements, backups, heartbeat), **free + total disk bytes** on the storage volume, the **last database &amp; storage backup times** (recorded automatically when `notifier:database-backup` / `notifier:storage-backup` succeed), and the agent's own clock (`reported_at`). The server stamps its own receipt time - the agent never sends that. Unlike announcements, the heartbeat is a **push**: a rejected or unreachable server makes the command exit non-zero (and log to the `backup` channel), so your scheduler's failure handling can react.

Configure
---------

[](#configure)

Minimum `.env`:

```
NOTIFIER_BACKUP_CODE=...                                        # auth token
NOTIFIER_URL=https://notifier.devuni.cz/api/v1/repositories/123 # your endpoint
NOTIFIER_BACKUP_PASSWORD=...                                    # ZIP password
```

Optional: `NOTIFIER_LOGGING_CHANNEL`, `NOTIFIER_ROUTES_ENABLED`, `NOTIFIER_ROUTE_PREFIX`, `NOTIFIER_ZIP_STRATEGY` (`auto`/`cli`/`php`), `NOTIFIER_CHUNK_SIZE`, `NOTIFIER_QUEUE_CONNECTION`, `NOTIFIER_DATABASE_CONNECTION`, `NOTIFIER_POSTGRES_DUMP_BINARY`, `NOTIFIER_POSTGRES_SCHEMA`, `NOTIFIER_HEARTBEAT_ENABLED`. See [`config/notifier.php`](config/notifier.php) for defaults and descriptions.

### Database engine

[](#database-engine)

The package auto-detects which dump tool to use from your Laravel connection driver:

DriverTool usedInstall`mysql`, `mariadb``mysqldump``apt install mysql-client` or `mariadb-client``pgsql` (PostgreSQL)`pg_dump``apt install postgresql-client``pgsql` (YugabyteDB)`ysql_dump` if installed, else `pg_dump`[YugabyteDB tools](https://docs.yugabyte.com)By default the package backs up your app's **default** Laravel connection (`config('database.default')`). Override with `NOTIFIER_DATABASE_CONNECTION=pgsql` if you want a different one.

For PostgreSQL/Yugabyte, force a specific binary via `NOTIFIER_POSTGRES_DUMP_BINARY=ysql_dump` (or `pg_dump`). Non-`public` schemas: set `NOTIFIER_POSTGRES_SCHEMA=myschema`.

### Exclusions

[](#exclusions)

Arrays - edit `config/notifier.php`:

```
'excluded_tables' => ['telescope_entries', 'sessions', 'cache', 'jobs', 'failed_jobs'],
'excluded_files'  => ['.gitignore', 'temp', 'logs/debug.log'],
```

### Queue offloading

[](#queue-offloading)

API-triggered backups can be offloaded to avoid PHP timeouts:

```
NOTIFIER_QUEUE_CONNECTION=redis   # or database, sqs, beanstalkd
```

Artisan commands always run synchronously regardless of this setting.

Security
--------

[](#security)

- **At rest:** AES-256 encrypted archives with `0600` permissions, cleaned up after upload
- **In transit:** HTTPS-only, `hash_equals` token comparison, per-chunk + full-file SHA-256 verification
- **No leaks:** ZIP password passed via stdin (not argv - invisible to `ps` / `/proc/*/cmdline`); API errors return opaque UUIDs, not raw exception messages
- **Report vulnerabilities:** see [security policy](../../security/policy) - don't open public issues

Links
-----

[](#links)

- [Changelog](CHANGELOG.md) - see what's new in each release
- [Contributing](CONTRIBUTING.md)
- [Full config reference](config/notifier.php)

Credits
-------

[](#credits)

- [Ludwig Tomas](https://github.com/ludwigtomas)
- [All contributors](../../contributors)

License
-------

[](#license)

MIT - see [LICENSE.md](LICENSE.md).

###  Health Score

48

—

FairBetter than 94% of packages

Maintenance94

Actively maintained with recent releases

Popularity16

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity59

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 71.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

13

Last Release

36d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/b3329e5cc7ef8a31198f98f9039c18ab577edbea4ea23a08326d33f1671a9502?d=identicon)[ludwigtomas](/maintainers/ludwigtomas)

---

Top Contributors

[![ludwigtomas](https://avatars.githubusercontent.com/u/44323251?v=4)](https://github.com/ludwigtomas "ludwigtomas (135 commits)")[![DavidJanec](https://avatars.githubusercontent.com/u/172018795?v=4)](https://github.com/DavidJanec "DavidJanec (42 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (6 commits)")[![Braincode-sro](https://avatars.githubusercontent.com/u/258863615?v=4)](https://github.com/Braincode-sro "Braincode-sro (5 commits)")[![actions-user](https://avatars.githubusercontent.com/u/65916846?v=4)](https://github.com/actions-user "actions-user (1 commits)")

---

Tags

laravelbackupnotifierAgentannouncementsdevuni

###  Code Quality

TestsPest

Static AnalysisPHPStan, Rector

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/devuni-notifier-agent/health.svg)

```
[![Health](https://phpackages.com/badges/devuni-notifier-agent/health.svg)](https://phpackages.com/packages/devuni-notifier-agent)
```

###  Alternatives

[roots/acorn

Framework for Roots WordPress projects built with Laravel components.

9762.4M133](/packages/roots-acorn)[psalm/plugin-laravel

Psalm plugin for Laravel

3345.3M347](/packages/psalm-plugin-laravel)[laravel/boost

Laravel Boost accelerates AI-assisted development by providing the essential context and structure that AI needs to generate high-quality, Laravel-specific code.

3.5k21.5M673](/packages/laravel-boost)[laravel/mcp

Rapidly build MCP servers for your Laravel applications.

77922.3M186](/packages/laravel-mcp)[laravel/pulse

Laravel Pulse is a real-time application performance monitoring tool and dashboard for your Laravel application.

1.7k15.1M136](/packages/laravel-pulse)[laravel/ai

The official AI SDK for Laravel.

1.0k3.2M246](/packages/laravel-ai)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
