anxin-ruoyi/docker/scripts/deploy-and-verify-logging.sh
2026-01-08 20:47:24 +08:00

232 lines
6.1 KiB
Bash

#!/bin/bash
# 部署并验证日志修复脚本
# 用于在服务器上部署更新的后端镜像并验证日志功能
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查是否在正确的目录
check_directory() {
if [[ ! -f "deploy.sh" ]]; then
log_error "请在部署目录中运行此脚本 (应包含 deploy.sh)"
exit 1
fi
}
# 停止后端服务
stop_backend() {
log_info "停止后端服务..."
./deploy.sh stop backend -e production || true
sleep 5
}
# 启动后端服务
start_backend() {
log_info "启动后端服务..."
./deploy.sh start backend -e production
# 等待服务启动
log_info "等待服务启动..."
sleep 30
}
# 检查服务状态
check_service_status() {
log_info "检查服务状态..."
./deploy.sh status backend -e production
}
# 检查日志目录
check_log_directories() {
log_info "检查容器内日志目录..."
# 检查 /app/logs 目录
if docker exec anxin-backend-prod ls -la /app/logs 2>/dev/null; then
log_success "✓ /app/logs 目录存在"
else
log_error "✗ /app/logs 目录不存在"
fi
# 检查符号链接
if docker exec anxin-backend-prod ls -la /home/ruoyi/logs 2>/dev/null; then
log_success "✓ /home/ruoyi/logs 符号链接存在"
else
log_error "✗ /home/ruoyi/logs 符号链接不存在"
fi
# 检查权限
docker exec anxin-backend-prod ls -la /app/ | grep logs || true
docker exec anxin-backend-prod ls -la /home/ruoyi/ | grep logs || true
}
# 检查启动日志
check_startup_logs() {
log_info "检查启动日志..."
# 显示最近的启动日志
./deploy.sh logs backend -e production --tail 50
# 检查是否有日志错误
if ./deploy.sh logs backend -e production --tail 100 | grep -i "Read-only file system"; then
log_error "仍然存在只读文件系统错误"
return 1
else
log_success "✓ 未发现只读文件系统错误"
fi
# 检查是否有其他日志相关错误
if ./deploy.sh logs backend -e production --tail 100 | grep -i "FileNotFoundException.*logs"; then
log_error "仍然存在日志文件未找到错误"
return 1
else
log_success "✓ 未发现日志文件未找到错误"
fi
}
# 测试日志文件创建
test_log_file_creation() {
log_info "测试日志文件创建..."
# 等待应用完全启动
sleep 10
# 检查日志文件是否被创建
if docker exec anxin-backend-prod ls -la /app/logs/ 2>/dev/null | grep -E "\.(log|out)$"; then
log_success "✓ 日志文件已创建"
docker exec anxin-backend-prod ls -la /app/logs/
else
log_warn "日志文件可能还未创建,继续等待..."
sleep 20
if docker exec anxin-backend-prod ls -la /app/logs/ 2>/dev/null | grep -E "\.(log|out)$"; then
log_success "✓ 日志文件已创建"
docker exec anxin-backend-prod ls -la /app/logs/
else
log_error "✗ 日志文件未创建"
fi
fi
}
# 运行诊断脚本
run_diagnostics() {
log_info "运行日志诊断脚本..."
# 复制诊断脚本到容器
if [[ -f "scripts/fix-logging-issues.sh" ]]; then
docker cp scripts/fix-logging-issues.sh anxin-backend-prod:/tmp/
docker exec anxin-backend-prod chmod +x /tmp/fix-logging-issues.sh
docker exec anxin-backend-prod /tmp/fix-logging-issues.sh check
else
log_warn "诊断脚本不存在,跳过诊断"
fi
}
# 检查应用健康状态
check_application_health() {
log_info "检查应用健康状态..."
# 等待健康检查
sleep 30
# 检查容器健康状态
if docker ps --filter "name=anxin-backend-prod" --format "table {{.Names}}\t{{.Status}}" | grep -i healthy; then
log_success "✓ 应用健康检查通过"
else
log_warn "应用健康检查状态未知,检查详细状态..."
docker ps --filter "name=anxin-backend-prod"
fi
}
# 显示部署总结
show_summary() {
echo ""
log_info "=== 部署验证总结 ==="
echo "----------------------------------------"
# 服务状态
echo "服务状态:"
./deploy.sh status backend -e production | grep -E "(anxin-backend-prod|State|Health)" || true
echo ""
echo "日志目录:"
docker exec anxin-backend-prod ls -la /app/logs/ 2>/dev/null | head -10 || echo "无法访问日志目录"
echo ""
echo "最近日志 (最后10行):"
./deploy.sh logs backend -e production --tail 10 || true
echo "----------------------------------------"
log_info "如果仍有问题,请检查:"
echo "1. 容器启动日志: ./deploy.sh logs backend -e production"
echo "2. 容器内部状态: docker exec -it anxin-backend-prod /bin/bash"
echo "3. 日志目录权限: docker exec anxin-backend-prod ls -la /app/logs /home/ruoyi/logs"
}
# 主函数
main() {
log_info "开始部署并验证日志修复..."
echo "========================================"
# 检查环境
check_directory
# 停止服务
stop_backend
# 启动服务
start_backend
# 检查服务状态
check_service_status
# 检查日志目录
check_log_directories
# 检查启动日志
if check_startup_logs; then
log_success "启动日志检查通过"
else
log_error "启动日志检查失败"
fi
# 测试日志文件创建
test_log_file_creation
# 运行诊断
run_diagnostics
# 检查应用健康
check_application_health
# 显示总结
show_summary
echo "========================================"
log_success "部署验证完成!"
}
# 如果脚本被直接执行
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi