ec33aedd79
ci/woodpecker/push/woodpecker Pipeline failed
- Fix standalone path: dist/standalone/novalon-website/ - Update static files path: dist/static - Replace curl with wget in health checks (Alpine compatibility) - Add monitoring and optimization scripts - Configure external network for docker-compose This resolves the deployment failure caused by Next.js 16's new standalone output structure.
261 lines
7.0 KiB
Bash
Executable File
261 lines
7.0 KiB
Bash
Executable File
#!/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
|