# 数据持久化和目录映射配置说明

## 概述

本文档描述了Docker部署中的数据持久化和目录映射配置，确保容器重启后数据不丢失。

## 目录映射配置

### 1. 项目代码目录映射
```yaml
volumes:
  - ./:/var/www/html
```
- **用途**: 将项目根目录映射到容器内的Web根目录
- **好处**: 支持开发环境的代码热重载
- **注意**: 生产环境建议使用镜像内置代码

### 2. 应用存储目录持久化
```yaml
volumes:
  - storage_data:/var/www/html/storage
  - documents_data:/var/www/html/storage/app/private/documents
  - public_data:/var/www/html/storage/app/public
```
- **storage_data**: Laravel应用的主存储目录
- **documents_data**: 上传文档的私有存储目录
- **public_data**: 公共文件存储目录

### 3. 数据库数据持久化
```yaml
volumes:
  - mysql_data:/var/lib/mysql
```
- **用途**: MySQL数据库文件持久化
- **映射到**: `./storage/mysql`
- **重要性**: 确保数据库数据在容器重启后不丢失

### 4. 缓存数据持久化
```yaml
volumes:
  - redis_data:/data
```
- **用途**: Redis缓存和会话数据持久化
- **映射到**: `./storage/redis`
- **好处**: 保持用户会话和缓存数据

### 5. 搜索引擎数据持久化
```yaml
volumes:
  - meilisearch_data:/meili_data
```
- **用途**: Meilisearch搜索索引数据持久化
- **映射到**: `./storage/meilisearch`
- **重要性**: 避免重新构建搜索索引

### 6. 日志目录映射
```yaml
volumes:
  - app_logs:/var/log
  - queue_logs:/var/log
  - laravel_logs:/var/www/html/storage/logs
```
- **app_logs**: 应用容器系统日志
- **queue_logs**: 队列容器系统日志
- **laravel_logs**: Laravel应用日志
- **映射到**: `./storage/logs/` 相应子目录

## 存储目录结构

```
storage/
├── app/                    # Laravel应用存储
│   ├── private/
│   │   ├── documents/      # 上传文档存储
│   │   └── markdown/       # Markdown文件存储
│   └── public/             # 公共文件存储
├── framework/              # Laravel框架缓存
│   ├── cache/
│   ├── sessions/
│   ├── testing/
│   └── views/
├── logs/                   # 日志文件
│   ├── app/               # 应用容器日志
│   ├── queue/             # 队列容器日志
│   └── laravel.log        # Laravel应用日志
├── mysql/                  # MySQL数据文件
├── redis/                  # Redis数据文件
└── meilisearch/           # Meilisearch索引文件
```

## 权限配置

所有存储目录都设置为755权限，确保：
- 容器内的应用可以读写数据
- 宿主机可以访问和备份数据
- 安全性和可用性的平衡

## 初始化脚本

使用 `docker/init-storage.sh` 脚本初始化存储目录：

```bash
./docker/init-storage.sh
```

该脚本会：
1. 创建所有必要的存储目录
2. 设置正确的权限
3. 显示目录结构

## 备份建议

定期备份以下重要目录：
- `storage/mysql/` - 数据库数据
- `storage/app/private/documents/` - 上传的文档
- `storage/meilisearch/` - 搜索索引
- `storage/logs/` - 应用日志

## 故障排除

### 权限问题
如果遇到权限错误，运行：
```bash
sudo chown -R $USER:$USER storage/
chmod -R 755 storage/
```

### 目录不存在
运行初始化脚本：
```bash
./docker/init-storage.sh
```

### 数据丢失
检查卷映射配置是否正确，确保使用bind mount而不是匿名卷。