# Laravel知识库系统 - 生产环境Docker部署指南

## 概述

本指南介绍如何使用Docker在生产环境中部署Laravel知识库系统。系统包含以下组件：

- **Web应用**: Laravel应用 + Swoole (端口8000)
- **数据库**: MySQL 8.0 (端口3306)
- **缓存**: Redis 7 (端口6379)
- **搜索**: Meilisearch v1.5 (端口7700)
- **队列**: Laravel队列处理器

## 系统要求

- Docker Engine 20.10+
- Docker Compose 2.0+
- 至少4GB可用内存
- 至少10GB可用磁盘空间

## 快速开始

### 1. 环境配置

```bash
# 复制环境配置文件
cp .env.production .env

# 编辑环境配置（重要！）
nano .env
```

**必须修改的配置项：**
- `APP_KEY`: 运行 `php artisan key:generate` 生成
- `DB_PASSWORD`: 设置强密码
- `MEILISEARCH_KEY`: 设置搜索引擎主密钥
- `APP_URL`: 设置实际域名

### 2. 启动服务

```bash
# 使用启动脚本（推荐）
./docker/start-production.sh

# 或手动启动
docker-compose up -d
```

### 3. 验证部署

```bash
# 检查服务状态
./docker/check-services.sh

# 访问应用
curl http://localhost/health
```

## 服务配置详情

### MySQL数据库
- **镜像**: mysql:8.0
- **端口**: 3306
- **数据持久化**: `./storage/mysql`
- **配置文件**: `./docker/mysql/my.cnf`
- **字符集**: utf8mb4

### Redis缓存
- **镜像**: redis:7-alpine
- **端口**: 6379
- **数据持久化**: `./storage/redis`
- **配置文件**: `./docker/redis/redis.conf`
- **内存限制**: 512MB

### Meilisearch搜索
- **镜像**: getmeili/meilisearch:v1.5
- **端口**: 7700
- **数据持久化**: `./storage/meilisearch`
- **内存限制**: 1GB

### Laravel应用
- **基础镜像**: php:8.2-cli-alpine
- **Web服务器**: Swoole (通过 Laravel Octane)
- **端口**: 8000
- **PHP扩展**: pdo_mysql, redis, gd, zip, intl等
- **文档转换**: Pandoc

### 队列处理器
- **功能**: 处理文档转换等后台任务
- **命令**: `php artisan queue:work`
- **重试次数**: 3次
- **超时时间**: 90秒

## 数据持久化

所有重要数据都持久化到宿主机：

```
storage/
├── mysql/          # MySQL数据文件
├── redis/          # Redis数据文件
├── meilisearch/    # 搜索引擎数据
├── app/            # 应用上传文件
└── logs/           # 应用日志
    ├── app/        # Web应用日志
    └── queue/      # 队列处理日志
```

## 健康检查

系统包含完整的健康检查机制：

- **Web应用**: HTTP检查 `/health` 端点
- **MySQL**: 数据库连接检查
- **Redis**: Redis ping检查
- **Meilisearch**: API健康检查

## 管理命令

### 启动和停止
```bash
# 启动所有服务
./docker/start-production.sh

# 停止所有服务
./docker/stop-production.sh

# 重启特定服务
docker-compose restart app
```

### 监控和调试
```bash
# 检查服务状态
./docker/check-services.sh

# 查看日志
docker-compose logs -f app
docker-compose logs -f mysql
docker-compose logs -f queue

# 进入容器
docker-compose exec app bash
docker-compose exec mysql mysql -u root -p
```

### Laravel管理
```bash
# 运行Artisan命令
docker-compose exec app php artisan migrate
docker-compose exec app php artisan queue:work
docker-compose exec app php artisan cache:clear

# 查看队列状态
docker-compose exec app php artisan queue:monitor
```

## 性能优化

### 资源限制
- **应用容器**: 1GB内存限制
- **队列容器**: 512MB内存限制
- **Redis**: 512MB内存限制
- **Meilisearch**: 1GB内存限制

### 缓存配置
- **OPcache**: 已启用PHP操作码缓存
- **Laravel缓存**: 使用Redis存储
- **配置缓存**: 生产环境已启用

## 安全配置

### 网络安全
- 使用专用Docker网络
- 仅暴露必要端口
- 容器间通信使用内部网络

### 数据安全
- 数据库密码保护
- Redis可选密码保护
- Meilisearch主密钥保护

### 文件权限
- 应用文件使用www-data用户
- 存储目录适当权限设置

## 故障排除

### 常见问题

1. **容器启动失败**
   ```bash
   # 查看详细日志
   docker-compose logs [service_name]
   
   # 检查配置
   docker-compose config
   ```

2. **数据库连接失败**
   ```bash
   # 检查MySQL状态
   docker-compose exec mysql mysqladmin ping
   
   # 检查环境变量
   docker-compose exec app env | grep DB_
   ```

3. **权限问题**
   ```bash
   # 修复存储权限
   docker-compose exec app chown -R www-data:www-data /var/www/html/storage
   ```

4. **内存不足**
   ```bash
   # 检查资源使用
   docker stats
   
   # 调整内存限制（docker-compose.yml）
   ```

### 日志位置
- **应用日志**: `storage/logs/app/`
- **队列日志**: `storage/logs/queue/`
- **MySQL日志**: 容器内 `/var/log/mysql/`
- **Swoole日志**: 容器内 `/var/log/supervisor/`

## 备份和恢复

### 数据备份
```bash
# 备份MySQL数据
docker-compose exec mysql mysqldump -u root -p knowledge_base > backup.sql

# 备份上传文件
tar -czf storage-backup.tar.gz storage/app/

# 备份搜索数据
tar -czf meilisearch-backup.tar.gz storage/meilisearch/
```

### 数据恢复
```bash
# 恢复MySQL数据
docker-compose exec -T mysql mysql -u root -p knowledge_base < backup.sql

# 恢复上传文件
tar -xzf storage-backup.tar.gz
```

## 更新和维护

### 应用更新
```bash
# 拉取最新代码
git pull

# 重新构建镜像
docker-compose build --no-cache app

# 重启服务
docker-compose up -d

# 运行迁移
docker-compose exec app php artisan migrate
```

### 系统维护
```bash
# 清理日志
docker-compose exec app php artisan log:clear

# 清理缓存
docker-compose exec app php artisan cache:clear
docker-compose exec app php artisan config:cache

# 优化数据库
docker-compose exec mysql mysqlcheck -u root -p --optimize --all-databases
```

## 支持

如遇到问题，请检查：
1. Docker和Docker Compose版本
2. 系统资源使用情况
3. 环境变量配置
4. 网络连接状态
5. 日志文件内容