tudor-constantin/monitor
GitHub: tudor-constantin/monitor
一个自托管的 Laravel 网站可用性监控应用,提供响应时间跟踪、故障通知和公开状态页面功能。
Stars: 0 | Forks: 0
# 监控
Monitor 是一个自托管的 Laravel 13 应用程序,用于网站可用性监控、响应时间跟踪、故障事件通知以及公开状态页面展示。
## 技术栈
- Laravel 13,使用 Blade、Livewire、Flux UI 和 Tailwind CSS
- MySQL 8.4
- Redis 7.4
- Laravel Horizon 和 Scheduler
- SMTP 通知
- Nginx 和 PHP 8.4
## 本地配置
### 1. 配置环境
创建本地环境文件:
```
cp .env.example .env
```
生成 application key:
```
docker run --rm php:8.4.23-cli-alpine php -r 'echo "base64:".base64_encode(random_bytes(32)).PHP_EOL;'
```
将生成的值复制到 `APP_KEY` 中,并在 `.env` 中配置密码和 SMTP 凭证。如需进行本地 HTTP 访问,请使用:
```
APP_ENV=local
APP_DEBUG=true
APP_URL=http://localhost:8000
APP_PORT=8000
REGISTRATION_ENABLED=true
SESSION_SECURE_COOKIE=false
```
保留这些 Docker 服务主机:
```
DB_HOST=mysql
REDIS_HOST=redis
```
### 2. 启动应用程序
构建并启动 Laravel、MySQL 和 Redis:
```
docker compose -f compose.yaml -f compose.local.yaml up -d --build
```
运行数据库迁移:
```
docker compose exec app php artisan migrate
```
打开 [http://localhost:8000](http://localhost:8000)。
在 [http://localhost:8000/register](http://localhost:8000/register) 注册首位管理员。然后设置:
```
REGISTRATION_ENABLED=false
```
通过重新创建 application container 来应用更改:
```
docker compose -f compose.yaml -f compose.local.yaml up -d --force-recreate app
```
### 3. 常用命令
```
docker compose ps
docker compose logs -f app
docker compose exec app php artisan about
docker compose exec app php artisan horizon:status
docker compose exec app php artisan migrate:status
```
在更改 PHP 或前端源码文件后重新构建应用程序:
```
docker compose -f compose.yaml -f compose.local.yaml up -d --build app
```
停止本地环境:
```
docker compose -f compose.yaml -f compose.local.yaml down
```
仅当您确定要删除本地 MySQL、Redis 和已上传的 favicon 数据时,才添加 `--volumes` 参数:
```
docker compose -f compose.yaml -f compose.local.yaml down --volumes
```
## 生产环境部署
### 1. 配置环境
根据 `.env.example` 创建生产环境文件,或者在 Dockploy 中添加相同的变量。至少需要设置:
- `APP_KEY`
- `APP_URL`
- `DB_PASSWORD`
- `MYSQL_ROOT_PASSWORD`
- `REDIS_PASSWORD`
- `MAIL_HOST`
- `MAIL_PORT`
- `MAIL_USERNAME`
- `MAIL_PASSWORD`
- `MAIL_FROM_ADDRESS`
- `HORIZON_ALLOWED_EMAILS`
- `REGISTRATION_ENABLED`
生产环境的值必须包含:
```
APP_ENV=production
APP_DEBUG=false
APP_URL=https://monitor.example.com
SESSION_SECURE_COOKIE=true
```
使用 `MAIL_SCHEME=smtp` 配合端口 `587` 以支持 STARTTLS,或使用 `MAIL_SCHEME=smtps` 配合端口 `465` 以支持隐式 TLS。
### 2. 创建管理员
在首次部署时,设置:
```
REGISTRATION_ENABLED=true
```
部署应用程序,访问 `/register`,并创建管理员账号。随后立即将该变量更改为:
```
REGISTRATION_ENABLED=false
```
重新部署 `app` 服务。注册页面、注册 endpoint 和注册链接将不再可用。
### 3. 使用 Dockploy 部署
1. 将 GitHub 仓库连接到 Dockploy。
2. 选择 Docker Compose 部署并使用 `compose.yaml`。
3. 添加生产环境变量。
4. 部署该技术栈。
5. 将域名路由到端口 `8080` 上的 `app` 服务。
6. 在 application container 中运行数据库迁移:
```
php artisan migrate --force
```
应用程序的健康检查 endpoint 为 `/up`。
### 4. 验证部署
在服务器项目目录下执行:
```
docker compose ps
docker compose logs --tail=100 app
```
在 Dockploy 的 `app` 服务终端中执行:
```
php artisan about
php artisan horizon:status
php artisan migrate:status
php artisan queue:failed
```
从公开状态页面提交一个订阅,以验证 SMTP 投递和 Horizon queue 是否正常。
## 应用程序进程
`app` 容器负责监管:
- Nginx
- PHP-FPM
- Laravel Horizon
- Laravel Scheduler
Horizon 负责处理网站检查和通知。Scheduler 根据每个网站配置的间隔时间来分发检查任务。
## 更新生产环境
拉取新版本并运行:
```
docker compose build --pull app
docker compose up -d
docker compose exec app php artisan migrate --force
docker compose exec app php artisan horizon:status
```
## 受控的依赖更新
Composer、npm、PHP、Node.js、MySQL、Redis 以及生产镜像依赖均使用明确的版本号。Docker 基础镜像也通过摘要(digest)进行了固定。所有更新都是有计划进行的:更改所需的版本,重新生成相关的 lock 文件,在必要时更新镜像摘要,重新构建生产镜像,并在提交前运行所有的质量检查。
Dependabot 仅提供 GitHub Actions 的更新建议供审查。它不会自动合并或部署这些更新。
## 持久化数据
Docker 将 MySQL、Redis 和公共 favicon 数据存储在命名卷(named volumes)中。请定期备份 MySQL 卷,并将生产凭证保存在 Dockploy 的环境管理中。
切勿提交 `.env`、`APP_KEY` 或生产凭证。严禁在生产环境中使用 `docker compose down --volumes`。
## 质量检查
GitHub Actions 会配合隔离的 MySQL 和 Redis 服务运行自动化测试套件。手动运行测试需要使用一个一次性的 `monitor_testing` 数据库,该数据库需与 `app/phpunit.xml` 中的配置相匹配;切勿将测试套件指向生产环境。
在具备 PHP 8.4、MySQL、Redis 和 Node.js 的环境中执行:
```
cd app
php artisan test --compact
vendor/bin/pint --test --format agent
php vendor/bin/phpstan analyse --memory-limit=1G
npm run build
```
标签:Docker, ffuf, Laravel, OpenVAS, PHP, 安全防御评估, 站点状态监控, 自托管, 请求拦截, 运维监控