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>
This commit is contained in:
225
docker/validate-storage-config.sh
Executable file
225
docker/validate-storage-config.sh
Executable file
@@ -0,0 +1,225 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 数据持久化配置验证脚本
|
||||
# 全面验证Docker部署中的存储配置
|
||||
|
||||
set -e
|
||||
|
||||
echo "=========================================="
|
||||
echo "数据持久化和目录映射配置验证"
|
||||
echo "=========================================="
|
||||
|
||||
# 颜色定义
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 成功和失败计数
|
||||
SUCCESS_COUNT=0
|
||||
FAIL_COUNT=0
|
||||
|
||||
# 检查函数
|
||||
check_success() {
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e "${GREEN}✓${NC} $1"
|
||||
((SUCCESS_COUNT++))
|
||||
return 0
|
||||
else
|
||||
echo -e "${RED}✗${NC} $1"
|
||||
((FAIL_COUNT++))
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
echo ""
|
||||
echo "1. 检查存储目录结构..."
|
||||
echo "----------------------------------------"
|
||||
|
||||
# 检查所有必要的存储目录
|
||||
directories=(
|
||||
"storage/mysql:MySQL数据库存储目录"
|
||||
"storage/redis:Redis缓存存储目录"
|
||||
"storage/meilisearch:Meilisearch搜索存储目录"
|
||||
"storage/app:Laravel应用存储目录"
|
||||
"storage/app/private:私有文件存储目录"
|
||||
"storage/app/private/documents:文档上传存储目录"
|
||||
"storage/app/private/markdown:Markdown文件存储目录"
|
||||
"storage/app/public:公共文件存储目录"
|
||||
"storage/framework:Laravel框架缓存目录"
|
||||
"storage/framework/cache:缓存目录"
|
||||
"storage/framework/sessions:会话目录"
|
||||
"storage/framework/views:视图缓存目录"
|
||||
"storage/logs:日志存储目录"
|
||||
"storage/logs/app:应用日志存储目录"
|
||||
"storage/logs/queue:队列日志存储目录"
|
||||
)
|
||||
|
||||
for dir_info in "${directories[@]}"; do
|
||||
IFS=':' read -r dir desc <<< "$dir_info"
|
||||
[ -d "$dir" ]
|
||||
check_success "$desc: $dir"
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "2. 检查Docker Compose卷映射配置..."
|
||||
echo "----------------------------------------"
|
||||
|
||||
# 检查docker-compose.yml中的卷映射
|
||||
volumes=(
|
||||
"mysql_data:MySQL数据卷"
|
||||
"redis_data:Redis数据卷"
|
||||
"meilisearch_data:Meilisearch数据卷"
|
||||
"storage_data:应用存储数据卷"
|
||||
"documents_data:文档存储数据卷"
|
||||
"public_data:公共文件数据卷"
|
||||
"app_logs:应用日志卷"
|
||||
"queue_logs:队列日志卷"
|
||||
"laravel_logs:Laravel日志卷"
|
||||
)
|
||||
|
||||
for volume_info in "${volumes[@]}"; do
|
||||
IFS=':' read -r volume desc <<< "$volume_info"
|
||||
docker-compose config 2>/dev/null | grep -q "$volume"
|
||||
check_success "$desc: $volume"
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "3. 检查服务容器的卷映射..."
|
||||
echo "----------------------------------------"
|
||||
|
||||
# 检查应用容器的卷映射
|
||||
app_volumes=(
|
||||
"./:/var/www/html:项目代码目录映射"
|
||||
"storage_data:/var/www/html/storage:应用存储目录映射"
|
||||
"documents_data:/var/www/html/storage/app/private/documents:文档存储目录映射"
|
||||
"public_data:/var/www/html/storage/app/public:公共文件目录映射"
|
||||
"app_logs:/var/log:应用日志目录映射"
|
||||
"laravel_logs:/var/www/html/storage/logs:Laravel日志目录映射"
|
||||
)
|
||||
|
||||
for volume_info in "${app_volumes[@]}"; do
|
||||
IFS=':' read -r volume_mapping path desc <<< "$volume_info"
|
||||
docker-compose config 2>/dev/null | grep -q "$volume_mapping"
|
||||
check_success "应用容器 - $desc"
|
||||
done
|
||||
|
||||
# 检查队列容器的卷映射
|
||||
queue_volumes=(
|
||||
"./:/var/www/html:项目代码目录映射"
|
||||
"storage_data:/var/www/html/storage:应用存储目录映射"
|
||||
"documents_data:/var/www/html/storage/app/private/documents:文档存储目录映射"
|
||||
"public_data:/var/www/html/storage/app/public:公共文件目录映射"
|
||||
"queue_logs:/var/log:队列日志目录映射"
|
||||
"laravel_logs:/var/www/html/storage/logs:Laravel日志目录映射"
|
||||
)
|
||||
|
||||
for volume_info in "${queue_volumes[@]}"; do
|
||||
IFS=':' read -r volume_mapping path desc <<< "$volume_info"
|
||||
docker-compose config 2>/dev/null | grep -q "$volume_mapping"
|
||||
check_success "队列容器 - $desc"
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "4. 检查数据卷绑定配置..."
|
||||
echo "----------------------------------------"
|
||||
|
||||
# 检查bind mount配置
|
||||
bind_mounts=(
|
||||
"storage/mysql:MySQL数据绑定"
|
||||
"storage/redis:Redis数据绑定"
|
||||
"storage/meilisearch:Meilisearch数据绑定"
|
||||
"storage/app:应用存储绑定"
|
||||
"storage/logs/app:应用日志绑定"
|
||||
"storage/logs/queue:队列日志绑定"
|
||||
"storage/logs:Laravel日志绑定"
|
||||
)
|
||||
|
||||
for mount_info in "${bind_mounts[@]}"; do
|
||||
IFS=':' read -r mount_path desc <<< "$mount_info"
|
||||
# 检查相对路径或绝对路径
|
||||
if docker-compose config 2>/dev/null | grep -q "device:.*$mount_path" || docker-compose config 2>/dev/null | grep -q "device: ./$mount_path"; then
|
||||
check_success "$desc: $mount_path"
|
||||
else
|
||||
echo -e "${RED}✗${NC} $desc: $mount_path"
|
||||
((FAIL_COUNT++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "5. 检查目录权限..."
|
||||
echo "----------------------------------------"
|
||||
|
||||
# 检查关键目录的权限
|
||||
permission_dirs=(
|
||||
"storage/mysql"
|
||||
"storage/redis"
|
||||
"storage/meilisearch"
|
||||
"storage/app"
|
||||
"storage/logs"
|
||||
)
|
||||
|
||||
for dir in "${permission_dirs[@]}"; do
|
||||
if [ -d "$dir" ]; then
|
||||
perms=$(stat -f "%A" "$dir" 2>/dev/null || stat -c "%a" "$dir" 2>/dev/null || echo "unknown")
|
||||
if [ "$perms" = "755" ] || [ "$perms" = "unknown" ]; then
|
||||
check_success "$dir 权限正确: $perms"
|
||||
else
|
||||
echo -e "${YELLOW}⚠${NC} $dir 权限可能需要调整: $perms"
|
||||
fi
|
||||
else
|
||||
echo -e "${RED}✗${NC} $dir 目录不存在"
|
||||
((FAIL_COUNT++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "6. 验证配置文件语法..."
|
||||
echo "----------------------------------------"
|
||||
|
||||
# 验证docker-compose.yml语法
|
||||
docker-compose config --quiet 2>/dev/null
|
||||
check_success "Docker Compose配置文件语法正确"
|
||||
|
||||
echo ""
|
||||
echo "7. 创建测试文件验证写入权限..."
|
||||
echo "----------------------------------------"
|
||||
|
||||
# 测试各个存储目录的写入权限
|
||||
test_dirs=(
|
||||
"storage/app:应用存储目录"
|
||||
"storage/logs:日志存储目录"
|
||||
"storage/mysql:MySQL存储目录"
|
||||
"storage/redis:Redis存储目录"
|
||||
"storage/meilisearch:Meilisearch存储目录"
|
||||
)
|
||||
|
||||
for dir_info in "${test_dirs[@]}"; do
|
||||
IFS=':' read -r dir desc <<< "$dir_info"
|
||||
test_file="$dir/test-write-$(date +%s).tmp"
|
||||
|
||||
if echo "test" > "$test_file" 2>/dev/null; then
|
||||
rm -f "$test_file" 2>/dev/null
|
||||
check_success "$desc 写入权限正常"
|
||||
else
|
||||
echo -e "${RED}✗${NC} $desc 写入权限异常"
|
||||
((FAIL_COUNT++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "验证结果汇总"
|
||||
echo "=========================================="
|
||||
|
||||
echo -e "成功检查项: ${GREEN}$SUCCESS_COUNT${NC}"
|
||||
echo -e "失败检查项: ${RED}$FAIL_COUNT${NC}"
|
||||
|
||||
if [ $FAIL_COUNT -eq 0 ]; then
|
||||
echo -e "\n${GREEN}🎉 所有数据持久化配置检查通过!${NC}"
|
||||
echo "系统已准备好进行Docker部署。"
|
||||
exit 0
|
||||
else
|
||||
echo -e "\n${RED}❌ 发现 $FAIL_COUNT 个配置问题,请修复后重新验证。${NC}"
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user