## 主要改进 - 升级 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 <noreply@anthropic.com>
287 lines
7.7 KiB
Bash
Executable File
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 |