#!/bin/bash # GitLab 维护和优化脚本 # 适用于 macOS 环境的性能优化和维护 set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 显示帮助信息 show_help() { echo -e "${BLUE}GitLab macOS 维护脚本${NC}" echo "========================" echo "用法: $0 [命令]" echo "" echo "命令:" echo " status - 显示 GitLab 服务状态" echo " health - 健康检查" echo " optimize - 性能优化" echo " cleanup - 清理资源" echo " backup - 手动备份" echo " logs - 查看日志" echo " update - 更新配置" echo " help - 显示此帮助信息" } # 检查服务状态 check_status() { echo -e "${BLUE}📊 GitLab 服务状态${NC}" echo "==================" # 检查容器状态 echo "🐳 容器状态:" docker ps | grep gitlab || echo " ❌ GitLab 容器未运行" # 检查服务状态 echo -e "\n⚙️ 服务状态:" if docker ps | grep -q gitlab-ce; then docker exec gitlab-ce gitlab-ctl status 2>/dev/null | grep -E "(run:|down:)" | head -10 || echo " ❌ 无法获取服务状态" fi # 检查端口 echo -e "\n🌐 网络端口:" for port in 8891 8929; do if lsof -i :$port >/dev/null 2>&1; then echo " ✅ 端口 $port 正在使用" else echo " ❌ 端口 $port 未使用" fi done # 检查磁盘使用 echo -e "\n💾 磁盘使用:" for dir in ~/ops/data/gitlab ~/ops/backups/gitlab ~/ops/logs; do if [[ -d "$dir" ]]; then echo " $(du -sh "$dir" 2>/dev/null | cut -f1) $(basename "$dir")" fi done } # 健康检查 health_check() { echo -e "${BLUE}🏥 GitLab 健康检查${NC}" echo "==================" # Web UI 检查 echo -e "🌐 Web UI:" if curl -f http://localhost:8891/-/readiness >/dev/null 2>&1; then echo " ✅ Web UI 正常" else echo " ❌ Web UI 不可访问" fi # API 检查 echo -e "🔌 API:" if curl -f http://localhost:8891/api/v4/version >/dev/null 2>&1; then echo " ✅ API 正常" else echo " ❌ API 不可访问" fi # 数据库连接检查 echo -e "💾 数据库:" if docker ps | grep -q gitlab-ce; then if docker exec gitlab-ce gitlab-rails runner "ActiveRecord::Base.connection.execute('SELECT 1')" >/dev/null 2>&1; then echo " ✅ 数据库连接正常" else echo " ❌ 数据库连接失败" fi fi # Runner 状态检查 echo -e "🏃 Runner:" if docker ps | grep -q gitlab-runner; then echo " ✅ Runner 容器运行中" else echo " ❌ Runner 容器未运行" fi } # 性能优化 optimize_performance() { echo -e "${BLUE}⚡ GitLab 性能优化${NC}" echo "==================" # 清理 Docker 资源 echo -e "🧹 清理 Docker 资源..." docker system prune -f --volumes # 清理 GitLab 日志 echo -e "📝 清理 GitLab 日志..." if [[ -d ~/ops/logs ]]; then find ~/ops/logs -name "*.log" -mtime +7 -delete 2>/dev/null || true echo " ✅ 旧日志已清理" fi # 优化 PostgreSQL echo -e "🗄️ 优化 PostgreSQL..." if docker ps | grep -q gitlab-ce; then docker exec gitlab-ce gitlab-rails runner "ActiveRecord::Base.connection.execute('VACUUM ANALYZE')" 2>/dev/null || echo " ⚠️ PostgreSQL 跳过(可能正在使用)" fi # 重启服务(如果需要) echo -e "🔄 是否重启 GitLab 服务以应用优化?(y/N):" read -r RESTART if [[ "$RESTART" =~ ^[Yy]$ ]]; then docker-compose restart echo " ✅ GitLab 服务已重启" fi } # 清理资源 cleanup_resources() { echo -e "${BLUE}🧹 清理 GitLab 资源${NC}" echo "==================" # 清理旧的备份文件 echo -e "📦 清理旧备份..." if [[ -d ~/ops/backups/gitlab ]]; then find ~/ops/backups/gitlab -name "*.tar.gz" -mtime +30 -delete 2>/dev/null || true echo " ✅ 30天前的备份已清理" fi # 清理 Docker 未使用的镜像 echo -e "🐳 清理 Docker 镜像..." docker image prune -f # 清理 Runner 缓存 echo -e "🏃 清理 Runner 缓存..." if docker ps | grep -q gitlab-runner; then docker exec gitlab-runner gitlab-runner verify --delete 2>/dev/null || true fi echo -e "${GREEN}✅ 资源清理完成${NC}" } # 手动备份 manual_backup() { echo -e "${BLUE}💾 手动备份 GitLab${NC}" echo "==================" BACKUP_NAME="gitlab-backup-$(date +%Y%m%d-%H%M%S)" BACKUP_DIR=~/ops/backups/gitlab echo -e "📦 创建备份: $BACKUP_NAME" # 创建备份目录 mkdir -p "$BACKUP_DIR" # 备份数据目录 echo -e "📁 备份数据目录..." tar -czf "$BACKUP_DIR/$BACKUP_NAME.tar.gz" \ -C ~/ops/data/gitlab \ --exclude='logs/*.log' \ . 2>/dev/null || echo " ⚠️ 数据目录备份失败" # 备份配置文件 echo -e "⚙️ 备份配置文件..." tar -czf "$BACKUP_DIR/$BACKUP_NAME-config.tar.gz" \ -C "$SCRIPT_DIR" \ config docker-compose.yml .env* 2>/dev/null || echo " ⚠️ 配置备份失败" # 创建备份元数据 cat > "$BACKUP_DIR/$BACKUP_NAME.meta" << EOF 备份时间: $(date) GitLab 版本: $(docker exec gitlab-ce gitlab-rails runner "puts Gitlab::VERSION" 2>/dev/null || echo "Unknown") 备份类型: 手动备份 备份内容: - 数据目录 - 配置文件 EOF echo -e "${GREEN}✅ 备份完成: $BACKUP_NAME${NC}" echo " 备份位置: $BACKUP_DIR" } # 查看日志 show_logs() { echo -e "${BLUE}📝 GitLab 日志${NC}" echo "==================" echo "可用的日志选项:" echo "1. GitLab 主日志 (docker logs)" echo "2. GitLab 服务日志" echo "3. 应用日志" echo "4. 退出" read -p "请选择 (1-4): " choice case $choice in 1) echo -e "📋 容器日志 (最近 50 行):" docker logs --tail 50 gitlab-ce ;; 2) echo -e "⚙️ 服务日志:" docker exec gitlab-ce gitlab-ctl tail 2>/dev/null || echo " ❌ 无法获取服务日志" ;; 3) echo -e "📱 应用日志:" if [[ -f ~/ops/logs/gitlab-protection.log ]]; then tail -20 ~/ops/logs/gitlab-protection.log else echo " ❌ 应用日志文件不存在" fi ;; 4) echo "退出" ;; *) echo "无效选择" ;; esac } # 更新配置 update_config() { echo -e "${BLUE}🔄 更新 GitLab 配置${NC}" echo "==================" # 检查是否有新的配置 if [[ ! -f "$SCRIPT_DIR/.env.production" ]]; then echo -e "${YELLOW}创建新的生产环境配置...${NC}" # 这里可以添加配置更新逻辑 fi echo -e "🔄 是否重新应用 GitLab 配置?(y/N):" read -r RECONFIGURE if [[ "$RECONFIGURE" =~ ^[Yy]$ ]]; then docker exec gitlab-ce gitlab-ctl reconfigure echo -e "${GREEN}✅ 配置已重新应用${NC}" fi } # 主逻辑 case "${1:-help}" in "status") check_status ;; "health") health_check ;; "optimize") optimize_performance ;; "cleanup") cleanup_resources ;; "backup") manual_backup ;; "logs") show_logs ;; "update") update_config ;; "help"|*) show_help ;; esac