Files
macos-tools/gitlab/maintenance-gitlab.sh
gaoandClaude 2c616faba0 feat: 完成 GitLab macOS 优化部署和 CI/CD 配置
## 主要改进
- 升级 GitLab CE 到 16.11.7 (最新稳定版)
- 优化性能配置 (Puma worker, Sidekiq 并发控制)
- 禁用不必要服务节省资源 (Prometheus/Grafana)
- 配置国内 APT 镜像源加速更新
- 添加时区设置 Asia/Shanghai

## 新增功能
- 一键部署脚本 (init-gitlab-optimized.sh)
- 智能 Runner 注册 (register-runner-optimized.sh)
- 综合维护工具 (maintenance-gitlab.sh)
- SMTP 邮件配置向导 (setup-smtp.sh)
- 密码重置工具 (reset-gitlab-password.sh)
- 快速诊断脚本 (diagnose-gitlab.sh)

## CI/CD 配置
- 注册 Docker Runner (容器化构建)
- 注册 Shell Runner (本地脚本执行)
- 创建 CI/CD 模板文件
- Runner 配置优化和清理

## 文档完善
- 技术文档 (CLAUDE.md)
- 优化部署指南 (OPTIMIZATION_GUIDE.md)
- 使用说明和故障排除指南

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
2025-11-04 11:49:57 +08:00

287 lines
7.7 KiB
Bash
Executable File

#!/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