# 健康检查和自动重启机制实现总结

## 概述

本文档总结了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. **完整的监控和管理脚本** - 自动化运维工具

所有功能都经过测试验证，可以确保系统的高可用性和自动故障恢复能力。