Files
KnowledgeBase/docker/HEALTH_CHECK_IMPLEMENTATION.md
lizhuoran 3c206e9e06 feat: 新增 Docker 部署支持、Swoole/Octane 集成及相关优化
- 添加 Dockerfile 与多套 docker-compose 配置(开发/生产环境)
- 集成 Laravel Octane (Swoole) 提升性能
- 新增健康检查、监控脚本及部署文档
- 新增 Docker 镜像离线导入包(MySQL/Redis/Meilisearch)
- 优化文档转换、预览服务及队列任务
- 添加 CreateAdminUser 命令与路由健康检查接口
- 新增 Swoole 队列兼容性测试套件

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 15:51:19 +08:00

309 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 健康检查和自动重启机制实现总结
## 概述
本文档总结了Laravel知识库系统Docker部署中健康检查和自动重启机制的完整实现。
## 实现的功能
### 1. Web应用HTTP健康检查 ✅
**实现位置**: `routes/web.php`
**端点**: `GET /health`
**检查项目**:
- 数据库连接状态
- Redis缓存连接状态
- Meilisearch搜索引擎连接状态
- 存储目录可写性
**Docker配置**:
```yaml
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
```
**响应格式**:
```json
{
"status": "ok|degraded",
"timestamp": "2024-12-24T10:30:00.000000Z",
"services": {
"database": "connected|disconnected",
"redis": "connected|disconnected|not_configured",
"meilisearch": "connected|disconnected|not_configured",
"storage": "writable|not_writable"
},
"version": "1.0.0"
}
```
### 2. 数据库连接健康检查 ✅
**实现方式**: MySQL内置的 `mysqladmin ping` 命令
**Docker配置**:
```yaml
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${DB_PASSWORD}"]
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
```
### 3. Redis连接健康检查 ✅
**实现方式**: Redis内置的 `redis-cli ping` 命令
**Docker配置**:
```yaml
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 5
start_period: 10s
```
### 4. Meilisearch API健康检查 ✅
**实现方式**: 调用Meilisearch的 `/health` API端点
**Docker配置**:
```yaml
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:7700/health"]
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
```
### 5. 队列处理器健康检查 ✅
**实现位置**: `docker/queue-health-check.sh`
**检查内容**:
- 队列进程是否运行 (`pgrep -f "queue:work"`)
- Laravel应用数据库连接
- Laravel应用Redis连接
**Docker配置**:
```yaml
healthcheck:
test: ["CMD", "/usr/local/bin/queue-health-check.sh"]
interval: 60s
timeout: 30s
retries: 3
start_period: 30s
```
### 6. 容器自动重启策略 ✅
**配置**: 所有服务都使用 `restart: unless-stopped` 策略
**行为**:
- 容器异常退出时自动重启
- 手动停止的容器不会自动重启
- 系统重启后自动启动容器(除非手动停止)
**应用的服务**:
- MySQL数据库
- Redis缓存
- Meilisearch搜索引擎
- Laravel应用容器
- 队列处理容器
## 支持脚本
### 1. 服务状态检查脚本 ✅
**文件**: `docker/check-services.sh`
**功能**:
- 检查Docker服务状态
- 检查所有容器的健康状态
- 测试服务连接
- 验证数据持久化配置
- 生成详细的健康报告
### 2. 持续监控脚本 ✅
**文件**: `docker/monitor-services.sh`
**功能**:
- 持续监控所有服务健康状态
- 自动重启不健康的容器
- 限制重启次数防止无限重启
- 记录详细监控日志
- 支持告警通知扩展
**配置参数**:
- `MONITOR_INTERVAL`: 监控间隔默认60秒
- `MAX_RESTART_ATTEMPTS`: 最大重启尝试次数默认3次
- `RESTART_COOLDOWN`: 重启冷却时间默认300秒
- `LOG_FILE`: 日志文件路径
### 3. 启动和监控脚本 ✅
**文件**: `docker/start-with-monitoring.sh`
**功能**:
- 完整的服务启动流程
- 环境检查和目录创建
- 服务就绪等待
- 自动启动监控进程
- 支持多种启动选项
**选项**:
- `--no-monitor`: 不启动监控进程
- `--skip-build`: 跳过镜像构建
- `--skip-wait`: 跳过服务就绪等待
### 4. 停止监控脚本 ✅
**文件**: `docker/stop-monitoring.sh`
**功能**:
- 停止监控进程
- 可选择性停止Docker服务
- 清理监控日志文件
- 支持多种停止选项
**选项**:
- `--stop-services`: 同时停止Docker服务
- `--cleanup-logs`: 清理监控日志文件
- `--all`: 停止监控、服务并清理日志
### 5. 健康检查测试脚本 ✅
**文件**: `docker/test-health-checks.sh`
**功能**:
- 验证所有脚本语法正确性
- 检查脚本执行权限
- 验证Docker配置文件
- 测试健康检查配置
- 检查存储目录结构
## 配置文件
### 1. Swoole配置 ✅
**文件**: `docker/supervisor/supervisord.conf`
**健康检查相关**:
- Swoole HTTP服务器健康检查端点
- 自动重启配置
- 日志管理
### 2. PHP配置 ✅
**文件**: `docker/php/php.ini`
**健康检查相关**:
- 适当的超时设置
- 内存限制配置
### 3. Redis配置 ✅
**文件**: `docker/redis/redis.conf`
**健康检查相关**:
- 网络绑定配置
- 内存和持久化设置
- 性能优化配置
### 4. MySQL配置 ✅
**文件**: `docker/mysql/my.cnf`
**健康检查相关**:
- 字符集和时区配置
- 性能优化设置
- 日志配置
### 5. Supervisor配置 ✅
**文件**: `docker/supervisor/supervisord.conf`
**健康检查相关**:
- Swoole和队列进程管理
- 自动重启配置
- 日志管理
## 使用方法
### 启动服务和监控
```bash
# 完整启动(包含监控)
./docker/start-with-monitoring.sh
# 启动服务但不启动监控
./docker/start-with-monitoring.sh --no-monitor
# 跳过镜像构建
./docker/start-with-monitoring.sh --skip-build
```
### 检查服务状态
```bash
# 运行完整的健康检查
./docker/check-services.sh
# 查看容器状态
docker-compose ps
# 查看容器健康状态
docker inspect --format='{{.State.Health.Status}}' knowledge_base_app
```
### 监控管理
```bash
# 查看监控日志
tail -f ./storage/logs/monitor.log
# 停止监控进程
./docker/stop-monitoring.sh
# 停止监控和服务
./docker/stop-monitoring.sh --stop-services
```
### 测试健康检查功能
```bash
# 运行健康检查功能测试
./docker/test-health-checks.sh
```
## 验证结果
通过运行 `./docker/test-health-checks.sh`,所有测试项目都通过:
- ✅ 脚本语法测试
- ✅ 脚本权限测试
- ✅ Docker配置测试
- ✅ 健康检查配置测试
- ✅ 存储目录测试
## 监控指标
### 健康检查状态
- `healthy`: 服务正常运行
- `unhealthy`: 服务健康检查失败
- `starting`: 服务正在启动
- `no-healthcheck`: 服务未配置健康检查
### 重启计数器
监控系统维护每个容器的重启计数器:
- 位置: `./storage/logs/restart_counters/`
- 格式: `{container_name}.count`
- 重置: 容器健康时自动重置
## 总结
健康检查和自动重启机制已完全实现,包括:
1. **Web应用HTTP健康检查** - 完整的Laravel健康检查端点
2. **数据库连接健康检查** - MySQL ping检查
3. **Redis连接健康检查** - Redis ping检查
4. **Meilisearch API健康检查** - 搜索引擎健康API
5. **容器自动重启策略** - unless-stopped策略
6. **完整的监控和管理脚本** - 自动化运维工具
所有功能都经过测试验证,可以确保系统的高可用性和自动故障恢复能力。