Pagerlite/pagerlite-laravel
GitHub: Pagerlite/pagerlite-laravel
一款极简的自托管 Laravel 值班排班与告警升级系统,让团队在自有应用内管理值班日程并自动通知与升级事件。
Stars: 6 | Forks: 0
# PagerLite
[](https://packagist.org/packages/pagerlite/pagerlite-laravel)
[](https://github.com/Pagerlite/pagerlite-laravel/actions/workflows/tests.yml)
[](https://github.com/Pagerlite/pagerlite-laravel/actions/workflows/formats.yml)
[](https://packagist.org/packages/pagerlite/pagerlite-laravel)
[](composer.json)
[](LICENSE.md)
一款为 Laravel 打造的极简、自托管的值班与寻呼系统 —— 秉承 Horizon 和 Telescope 的精神。安装该包后,访问 `/pagerlite`,添加你的团队,并将某人拖拽到日历上:当有事件发生时,PagerLite 会通知当前值班的人员,并持续升级直到有人确认。所有数据都存储在你自己的数据库中;数据绝对不会离开你的应用。

## 功能特性
- **事件接入** — 一个可供任何监控工具调用的 `POST` endpoint,以及一个用于从你自己的代码中报告事件的 `PagerLite::notify()` facade。
- **值班日程** — 一个支持拖拽的按天显示的日历。将成员拖到某一天,可根据需要将轮班延长至任意天数。同一时间只有一人值班。
- **团队管理** — 添加和移除成员而不会丢失历史记录:移除某人会释放其今天及以后的轮班,而恢复他们只会带回他们过去的轮班记录,在你再次为他们排班之前,他们不会进入升级链。
- **升级链** — 如果值班成员在超时时间内未确认,链中的下一位成员将收到寻呼,直到有人响应为止。可以在仪表盘中重新排序升级链。
- **确认与解决** — 可直接在仪表盘中操作(带有确认步骤),并且提供每个事件的完整时间线:谁收到了寻呼,何时升级的,以及谁确认并解决了该事件。
- **成员洞察** — 每个成员都有一个专属页面,展示他们的值班历史、每月的值班天数以及他们收到寻呼的事件。
- **可嵌入日历** — 通过一个加密链接分享日程的只读视图,可直接通过 iframe 嵌入到 wiki 或状态页面中。
- **实时更新** — 仪表盘、事件列表、事件详情和嵌入的日历都会在后台进行轮询,因此状态更改和新事件无需手动刷新即可显示。
- **邮件通知** — 通过应用现有的邮件配置发送。无需第三方服务。
## 环境要求
- PHP 8.4+
- Laravel 12
- 一个真正的队列驱动 (`database`, `redis`, 等) — 事件升级依赖于延迟任务按时触发,而 `sync` 驱动无法满足这一要求。
## 安装
使用 Composer 引入该包:
```
composer require pagerlite/pagerlite-laravel
```
然后运行安装命令:
```
php artisan pagerlite:install
```
它会发布配置文件和预构建的仪表盘静态资源,并提示你运行数据库迁移(四个带有 `pagerlite_` 前缀的表)。接着:
1. 在 `.env` 中设置 token,以便外部工具可以报告事件:
PAGERLITE_TOKEN=your-long-random-secret
2. 运行一个队列 worker — 升级机制是由延迟的队列任务驱动的:
php artisan queue:work
3. 访问 `/pagerlite`,添加成员,排序升级链,并安排某人值班。
## 仪表盘授权
开箱即用时,仪表盘只能在 `local` 环境中访问。要在其他环境中开放访问,请注册一个授权回调 — 通常放在某个 service provider 的 `boot` 方法中:
```
use Pagerlite\Laravel\PagerLite;
PagerLite::auth(function ($request) {
return $request->user()?->isAdmin() ?? false;
});
```
确认和解决操作将归属于你应用中已认证的用户。
## 报告事件
### 通过 HTTP,从任何地方
```
curl -X POST https://your-app.test/pagerlite/api/events \
-H "Authorization: Bearer $PAGERLITE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "Server down", "message": "CPU at 100%", "service": "api"}'
```
`title` 是必填项;`message` 和 `service` 是可选的。该 endpoint 会返回 `201` 状态码以及事件的 `id` 和 `status`。对于无法设置请求头的工具,可以直接在 URL 中传递 token:`POST /pagerlite/api/events/{token}`。
每个请求都会创建一个新的事件 — PagerLite 不会进行去重,因此请将你监控工具的 *状态改变(state change)* hook 指向它,而不是每分钟的例行检查。
### 从你自己的代码中
```
use Pagerlite\Laravel\PagerLite;
PagerLite::notify('Nightly backup failed', 'Disk full on backup volume', 'backups');
```
## 寻呼的工作原理
1. 记录一个事件,并通知当前值班(来自日程安排)的成员。
2. 如果当前无人值班,则会直接从顶部开始寻呼升级链中的成员。
3. 如果在升级超时时间内(默认为 5 分钟)未确认事件,将通知升级链中的下一位成员 — 同时跳过当前已值班的成员 — 直到升级链中的所有成员都被遍历。
4. 从仪表盘确认该事件将停止升级。
日程按 UTC 天运作:轮班在 UTC 午夜进行交接,并且无论成员身处哪个时区,每个人看到的都是相同的日历。
## 嵌入日历
在 `.env` 中设置一个密钥:
```
PAGERLITE_EMBED_TOKEN=another-long-random-secret
```
随后,无需登录即可通过以下地址访问只读日历:
```
https://your-app.test/pagerlite/embed/calendar/{token}
```
将其放入 wiki 或状态页面的 iframe 中:
```
```
任何拥有此链接的人都可以看到谁在值班(仅限姓名和日程安排 — 不包含事件详情,且无法编辑)。如果不设置 `PAGERLITE_EMBED_TOKEN`,则该嵌入 URL 将无法访问。
## 配置
发布的 `config/pagerlite.php` 涵盖了所有配置;每个选项也都有对应的环境变量:
| 变量 | 默认值 | 用途 |
| --- | --- | --- |
| `PAGERLITE_PATH` | `pagerlite` | 提供仪表盘服务的 URI 路径。 |
| `PAGERLITE_TOKEN` | — | events endpoint 所需的 Bearer token。 |
| `PAGERLITE_EMBED_TOKEN` | — | 用于启用公开只读日历的密钥。未设置 = 禁用。 |
| `PAGERLITE_ESCALATION_TIMEOUT` | `300` | 在升级前等待确认的秒数。 |
| `PAGERLITE_USER_MODEL` | `App\Models\User` | 用于归属确认/解决操作的主体应用 user model。 |
## 升级
更新此包后,请重新发布仪表盘静态资源:
```
php artisan vendor:publish --tag=pagerlite-assets --force
```
(或者直接重新运行 `php artisan pagerlite:install`)。
## 待办事项
- [ ] 添加更多通知渠道
- [ ] SMS
- [ ] Discord
- [ ] Slack
- [ ] Telegram
- [ ] Webhook
- [ ] 移动应用
- [ ] 统一电话号码,自动转接给当前值班人员
## 许可证
PagerLite 是开源软件,基于 [MIT 许可证](LICENSE.md) 发布。
标签:ffuf, Laravel, OpenVAS, PHP, 值班排班, 告警通知, 搜索引擎查询, 自托管, 运维监控