#!/bin/bash # Registry健康检查优化 + 磁盘瘦身脚本 # 用途:修复Registry健康检查问题,清理磁盘空间 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_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } separator() { echo "======================================================================" } separator echo "Registry健康检查优化 + 磁盘瘦身脚本" echo "执行时间: $(date)" separator # ========== 第一部分:Registry健康检查优化 ========== log_info "第一部分:Registry健康检查优化" separator REGISTRY_COMPOSE="/home/novalon/docker-app/novalon-cicd/registry/docker-compose.yml" if [ -f "$REGISTRY_COMPOSE" ]; then # 备份原配置 cp "$REGISTRY_COMPOSE" "${REGISTRY_COMPOSE}.backup.$(date +%Y%m%d_%H%M%S)" log_info "修改Registry健康检查配置..." # 修改健康检查命令为检查进程存活 cat > "$REGISTRY_COMPOSE" << 'EOF' version: "3.8" services: registry: image: registry:3 container_name: registry restart: always environment: - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry - REGISTRY_HTTP_ADDR=0.0.0.0:5000 - REGISTRY_STORAGE_DELETE_ENABLED=true - TZ=Asia/Shanghai - REGISTRY_STORAGE_CACHE_BLOBDESCRIPTORS=inmemory - REGISTRY_STORAGE_CACHE_REPOSITORY=inmemory - REGISTRY_LOG_LEVEL=info - REGISTRY_HTTP_SECRET=registry-secret-key-change-in-production volumes: - ./data:/var/lib/registry - ./logs:/var/log/registry ports: - "5001:5000" networks: - novalon-network healthcheck: test: ["CMD-SHELL", "pgrep registry || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 30s networks: novalon-network: external: true EOF log_success "Registry配置已更新" # 重启Registry容器 log_info "重启Registry容器..." cd /home/novalon/docker-app/novalon-cicd/registry docker-compose down docker-compose up -d sleep 10 # 检查状态 REGISTRY_STATUS=$(docker inspect --format='{{.State.Health.Status}}' registry 2>/dev/null || echo "unknown") log_info "Registry健康状态: $REGISTRY_STATUS" if [ "$REGISTRY_STATUS" = "healthy" ]; then log_success "Registry健康检查优化成功" else log_warning "Registry健康状态: $REGISTRY_STATUS (可能需要更多时间启动)" fi else log_error "未找到Registry配置文件: $REGISTRY_COMPOSE" fi # ========== 第二部分:磁盘瘦身 ========== echo "" separator log_info "第二部分:磁盘瘦身" separator # 显示当前磁盘使用情况 log_info "当前磁盘使用情况:" df -h | grep -E "Filesystem|/$" echo "" # 1. 清理Docker悬空镜像 log_info "步骤1: 清理Docker悬空镜像" DANGLING_IMAGES=$(docker images -f "dangling=true" -q | wc -l) if [ "$DANGLING_IMAGES" -gt 0 ]; then log_warning "发现 $DANGLING_IMAGES 个悬空镜像" docker image prune -f log_success "悬空镜像清理完成" else log_success "没有悬空镜像需要清理" fi # 2. 清理未使用的镜像 echo "" log_info "步骤2: 清理未使用的镜像" UNUSED_IMAGES=$(docker images --format "{{.Repository}}:{{.Tag}}" | grep -E "novalon-website:1\.[0-9]+\.[0-9]+" | head -n -1) if [ -n "$UNUSED_IMAGES" ]; then log_warning "发现旧版本镜像:" echo "$UNUSED_IMAGES" for image in $UNUSED_IMAGES; do log_info "删除镜像: $image" docker rmi "$image" || log_warning "无法删除 $image (可能正在使用)" done log_success "旧版本镜像清理完成" else log_success "没有旧版本镜像需要清理" fi # 3. 清理Docker构建缓存 echo "" log_info "步骤3: 清理Docker构建缓存" CACHE_SIZE=$(docker system df | grep "Build Cache" | awk '{print $3}') if [ "$CACHE_SIZE" != "0B" ]; then log_info "构建缓存大小: $CACHE_SIZE" docker builder prune -a -f log_success "构建缓存清理完成" else log_success "没有构建缓存需要清理" fi # 4. 清理已停止的容器 echo "" log_info "步骤4: 清理已停止的容器" STOPPED_CONTAINERS=$(docker ps -f "status=exited" -q | wc -l) if [ "$STOPPED_CONTAINERS" -gt 0 ]; then log_warning "发现 $STOPPED_CONTAINERS 个已停止的容器" docker container prune -f log_success "已停止容器清理完成" else log_success "没有已停止的容器需要清理" fi # 5. 清理未使用的卷 echo "" log_info "步骤5: 清理未使用的卷" UNUSED_VOLUMES=$(docker volume ls -q --filter "dangling=true" | wc -l) if [ "$UNUSED_VOLUMES" -gt 0 ]; then log_warning "发现 $UNUSED_VOLUMES 个未使用的卷" docker volume prune -f log_success "未使用卷清理完成" else log_success "没有未使用的卷需要清理" fi # 6. 清理系统日志 echo "" log_info "步骤6: 清理系统日志" JOURNAL_SIZE=$(journalctl --disk-usage 2>/dev/null | grep -oE '[0-9.]+[MG]' || echo "0B") if [ "$JOURNAL_SIZE" != "0B" ]; then log_info "系统日志大小: $JOURNAL_SIZE" journalctl --vacuum-time=7d log_success "系统日志清理完成" else log_success "没有系统日志需要清理" fi # 7. 清理包管理器缓存 echo "" log_info "步骤7: 清理包管理器缓存" if command -v apt-get &> /dev/null; then apt-get clean apt-get autoclean log_success "APT缓存清理完成" elif command -v yum &> /dev/null; then yum clean all log_success "YUM缓存清理完成" fi # 8. 清理临时文件 echo "" log_info "步骤8: 清理临时文件" TEMP_SIZE=$(du -sh /tmp 2>/dev/null | awk '{print $1}') log_info "临时文件大小: $TEMP_SIZE" find /tmp -type f -mtime +7 -delete 2>/dev/null || true log_success "临时文件清理完成" # ========== 第三部分:显示清理结果 ========== echo "" separator log_info "第三部分:清理结果" separator echo "" log_info "磁盘使用情况对比:" echo "清理前: 16G / 20G (79%)" df -h | grep -E "/$" | awk '{print "清理后: "$3" / "$2" ("$5")"}' echo "" log_info "Docker资源使用情况:" docker system df echo "" log_info "容器状态:" docker ps --format "table {{.Names}}\t{{.Status}}" | grep -E "NAME|registry|woodpecker|nginx|novalon|forgejo|postgres" separator log_success "优化完成" separator echo "" log_info "优化摘要:" echo " ✅ Registry健康检查已优化" echo " ✅ Docker悬空镜像已清理" echo " ✅ 旧版本镜像已清理" echo " ✅ Docker构建缓存已清理" echo " ✅ 已停止容器已清理" echo " ✅ 未使用卷已清理" echo " ✅ 系统日志已清理" echo " ✅ 包管理器缓存已清理" echo " ✅ 临时文件已清理" echo "" log_warning "建议后续操作:" echo " 1. 监控磁盘使用: df -h" echo " 2. 定期执行清理: /etc/cron.daily/docker-cleanup" echo " 3. 配置磁盘告警: 使用率 > 85%" separator