Files
gaoandClaude 70f845cd17 feat: 添加 Harbor 和 GitLab 模块,完善系统配置文档
- 新增 Harbor 容器镜像仓库维护模块
- 新增 GitLab 代码托管平台维护模块
- 创建 SYSTEM-CONFIG.md 系统配置概览文档
- 完善 README.md 项目说明文档
- 更新部署脚本支持新模块
- 集成 Ollama AI 模型服务配置信息

主要功能:
- Harbor: Docker 镜像仓库管理 (端口 8080/8443)
- GitLab: 企业级代码托管 (端口 8890/8929)
- 系统配置文档:便于 Claude 和 CI/CD 理解架构
- 统一备份策略和健康监控
- 模块化部署和管理

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-20 21:22:20 +08:00

481 lines
12 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# macOS 工具集 - ops 目录结构初始化脚本
# 用于在 ~/ops/ 目录创建完整的项目结构
set -euo pipefail
# 配置
PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}"
OPS_DIR="${HOME}/ops"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log() {
echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}"
}
warn() {
echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}"
}
error() {
echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}"
exit 1
}
info() {
echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1${NC}"
}
# 检查依赖
check_dependencies() {
log "🔍 检查系统依赖..."
# 检查基本命令
for cmd in mkdir cp chmod; do
if ! command -v "$cmd" >/dev/null 2>&1; then
error "缺少必要命令: $cmd"
fi
done
# 检查 Docker(Gitea 模块需要)
if command -v docker >/dev/null 2>&1; then
log "✅ Docker 已安装"
DOCKER_AVAILABLE=true
else
warn "Docker 未安装,Gitea 模块将无法使用"
DOCKER_AVAILABLE=false
fi
# 检查 Homebrew(brew 模块需要)
if command -v brew >/dev/null 2>&1; then
log "✅ Homebrew 已安装"
BREW_AVAILABLE=true
else
warn "Homebrew 未安装,brew 模块将无法使用"
BREW_AVAILABLE=false
fi
}
# 创建基础目录结构
create_base_structure() {
log "📁 创建基础目录结构..."
# 主要目录
local dirs=(
"${OPS_DIR}"
"${OPS_DIR}/logs"
"${OPS_DIR}/backups"
"${OPS_DIR}/data"
"${OPS_DIR}/backups/brew"
"${OPS_DIR}/backups/gitea"
"${OPS_DIR}/backups/harbor"
"${OPS_DIR}/backups/gitlab"
"${OPS_DIR}/data/gitea"
"${OPS_DIR}/data/harbor"
"${OPS_DIR}/data/gitlab"
)
for dir in "${dirs[@]}"; do
if [[ ! -d "$dir" ]]; then
mkdir -p "$dir"
log "✅ 创建目录: $dir"
else
info "ℹ️ 目录已存在: $dir"
fi
done
# 设置权限
chmod 755 "${OPS_DIR}"
chmod 755 "${OPS_DIR}/logs"
chmod 755 "${OPS_DIR}/backups"
chmod 755 "${OPS_DIR}/data"
}
# 部署 brew 模块
deploy_brew_module() {
if [[ "$BREW_AVAILABLE" != true ]]; then
warn "跳过 brew 模块部署(Homebrew 未安装)"
return
fi
log "🍺 部署 Homebrew 维护模块..."
local brew_target_dir="${OPS_DIR}/brew"
# 创建目录
mkdir -p "$brew_target_dir"
# 复制文件
local files=(
"brew/brew_maintain.sh"
"brew/brew_backup.sh"
"brew/brew_restore.sh"
"brew/com.ljwx.brew.maintenance.plist"
"brew/README.md"
)
for file in "${files[@]}"; do
local src="${PROJECT_ROOT}/$file"
local dst="${brew_target_dir}/$(basename "$file")"
if [[ -f "$src" ]]; then
cp "$src" "$dst"
chmod +x "$dst" 2>/dev/null || true # 只对脚本设置可执行权限
log "✅ 复制: $(basename "$file")"
else
warn "文件不存在: $src"
fi
done
# 复制定时任务配置到 LaunchAgents
local launchd_file="${HOME}/Library/LaunchAgents/com.ljwx.brew.maintenance.plist"
if [[ -f "${PROJECT_ROOT}/brew/com.ljwx.brew.maintenance.plist" ]]; then
cp "${PROJECT_ROOT}/brew/com.ljwx.brew.maintenance.plist" "$launchd_file"
log "✅ 安装定时任务配置"
fi
}
# 部署 gitea 模块
deploy_gitea_module() {
if [[ "$DOCKER_AVAILABLE" != true ]]; then
warn "跳过 gitea 模块部署(Docker 未安装)"
return
fi
log "🐙 部署 Gitea 维护模块..."
local gitea_target_dir="${OPS_DIR}/gitea"
# 创建目录
mkdir -p "$gitea_target_dir"
# 复制文件
local files=(
"gitea/docker-compose.yml"
"gitea/gitea-data-protection.sh"
"gitea/gitea-backup.sh"
"gitea/gitea-restore.sh"
"gitea/.env.example"
"gitea/README.md"
)
for file in "${files[@]}"; do
local src="${PROJECT_ROOT}/$file"
local dst="${gitea_target_dir}/$(basename "$file")"
if [[ -f "$src" ]]; then
cp "$src" "$dst"
chmod +x "$dst" 2>/dev/null || true # 只对脚本设置可执行权限
log "✅ 复制: $(basename "$file")"
else
warn "文件不存在: $src"
fi
done
# 创建 .env 文件(如果不存在)
local env_file="${gitea_target_dir}/.env"
if [[ ! -f "$env_file" ]] && [[ -f "${PROJECT_ROOT}/gitea/.env.example" ]]; then
cp "${PROJECT_ROOT}/gitea/.env.example" "$env_file"
log "✅ 创建环境配置文件: .env"
info "💡 请根据需要编辑 ${env_file}"
fi
}
# 部署 harbor 模块
deploy_harbor_module() {
if [[ "$DOCKER_AVAILABLE" != true ]]; then
warn "跳过 harbor 模块部署(Docker 未安装)"
return
fi
log "🐙 部署 Harbor 维护模块..."
local harbor_target_dir="${OPS_DIR}/harbor"
# 创建目录
mkdir -p "$harbor_target_dir"
# 复制文件
local files=(
"harbor/harbor.yml"
"harbor/docker-compose.yml"
"harbor/harbor-data-protection.sh"
"harbor/harbor-backup.sh"
"harbor/harbor-restore.sh"
"harbor/.env.example"
"harbor/common"
"harbor/README.md"
)
for file in "${files[@]}"; do
local src="${PROJECT_ROOT}/$file"
local dst="${harbor_target_dir}/$(basename "$file")"
if [[ -f "$src" ]] || [[ -d "$src" ]]; then
if [[ -d "$src" ]]; then
cp -r "$src" "$dst"
else
cp "$src" "$dst"
fi
chmod +x "$dst" 2>/dev/null || true # 只对脚本设置可执行权限
log "✅ 复制: $(basename "$file")"
else
warn "文件不存在: $src"
fi
done
# 创建 .env 文件(如果不存在)
local env_file="${harbor_target_dir}/.env"
if [[ ! -f "$env_file" ]] && [[ -f "${PROJECT_ROOT}/harbor/.env.example" ]]; then
cp "${PROJECT_ROOT}/harbor/.env.example" "$env_file"
log "✅ 创建环境配置文件: .env"
info "💡 请根据需要编辑 ${env_file}"
fi
}
# 部署 gitlab 模块
deploy_gitlab_module() {
if [[ "$DOCKER_AVAILABLE" != true ]]; then
warn "跳过 gitlab 模块部署(Docker 未安装)"
return
fi
log "🦊 部署 GitLab 维护模块..."
local gitlab_target_dir="${OPS_DIR}/gitlab"
# 创建目录
mkdir -p "$gitlab_target_dir"
# 复制文件
local files=(
"gitlab/docker-compose.yml"
"gitlab/gitlab-data-protection.sh"
"gitlab/gitlab-backup.sh"
"gitlab/gitlab-restore.sh"
"gitlab/.env.example"
"gitlab/README.md"
)
for file in "${files[@]}"; do
local src="${PROJECT_ROOT}/$file"
local dst="${gitlab_target_dir}/$(basename "$file")"
if [[ -f "$src" ]]; then
cp "$src" "$dst"
chmod +x "$dst" 2>/dev/null || true # 只对脚本设置可执行权限
log "✅ 复制: $(basename "$file")"
else
warn "文件不存在: $src"
fi
done
# 复制配置目录
if [[ -d "${PROJECT_ROOT}/gitlab/config" ]]; then
cp -r "${PROJECT_ROOT}/gitlab/config" "${gitlab_target_dir}/"
log "✅ 复制: config/"
fi
# 创建 .env 文件(如果不存在)
local env_file="${gitlab_target_dir}/.env"
if [[ ! -f "$env_file" ]] && [[ -f "${PROJECT_ROOT}/gitlab/.env.example" ]]; then
cp "${PROJECT_ROOT}/gitlab/.env.example" "$env_file"
log "✅ 创建环境配置文件: .env"
info "💡 请根据需要编辑 ${env_file}"
fi
}
# 创建项目总 README
create_main_readme() {
local readme_file="${OPS_DIR}/README.md"
if [[ ! -f "$readme_file" ]]; then
log "📖 创建项目总 README..."
cat > "$readme_file" << 'EOF'
# macOS 工具集 - ops 目录
这是 macOS 工具集的运行时目录,包含各个维护模块的部署文件。
## 目录结构
```
~/ops/
├── logs/ # 统一日志目录
├── backups/ # 统一备份目录
│ ├── brew/ # Homebrew 备份
│ └── gitea/ # Gitea 备份
├── data/ # 运行时数据目录
│ └── gitea/ # Gitea 运行时数据
├── brew/ # Homebrew 维护模块
├── gitea/ # Gitea 维护模块
└── README.md # 本文档
```
## 模块使用
### Homebrew 模块
```bash
cd ~/ops/brew
./brew_maintain.sh # 手动维护
./brew_backup.sh # 手动备份
./brew_restore.sh # 恢复
```
### Gitea 模块
```bash
cd ~/ops/gitea
./gitea-data-protection.sh setup # 初始化设置
./gitea-data-protection.sh start # 启动服务
./gitea-backup.sh # 手动备份
./gitea-restore.sh # 恢复
```
## 部署时间
部署时间: $(date '+%Y-%m-%d %H:%M:%S')
部署来源: $(basename "$PROJECT_ROOT")
## 注意事项
- 定期检查日志文件: `~/ops/logs/`
- 定期检查备份文件: `~/ops/backups/`
- 定期运行健康检查
EOF
log "✅ 创建: README.md"
else
info "ℹ️ README.md 已存在"
fi
}
# 验证部署
verify_deployment() {
log "🔍 验证部署结果..."
local errors=0
# 检查基础目录
local base_dirs=(
"${OPS_DIR}"
"${OPS_DIR}/logs"
"${OPS_DIR}/backups"
"${OPS_DIR}/data"
)
for dir in "${base_dirs[@]}"; do
if [[ -d "$dir" ]]; then
log "✅ 目录存在: $(basename "$dir")"
else
error "❌ 目录缺失: $dir"
((errors++))
fi
done
# 检查模块部署
if [[ "$BREW_AVAILABLE" == true ]]; then
if [[ -d "${OPS_DIR}/brew" ]]; then
log "✅ brew 模块已部署"
else
warn "⚠️ brew 模块部署失败"
fi
fi
if [[ "$DOCKER_AVAILABLE" == true ]]; then
if [[ -d "${OPS_DIR}/gitea" ]]; then
log "✅ gitea 模块已部署"
else
warn "⚠️ gitea 模块部署失败"
fi
fi
if [[ $errors -gt 0 ]]; then
error "部署验证失败,发现 $errors 个错误"
fi
}
# 显示后续步骤
show_next_steps() {
log "🎉 ops 目录初始化完成!"
echo ""
echo -e "${BLUE}📋 后续步骤:${NC}"
echo ""
if [[ "$BREW_AVAILABLE" == true ]]; then
echo -e "${GREEN}🍺 Homebrew 模块:${NC}"
echo " cd ~/ops/brew"
echo " ./brew_maintain.sh # 测试运行"
echo ""
fi
if [[ "$DOCKER_AVAILABLE" == true ]]; then
echo -e "${GREEN}🐙 Gitea 模块:${NC}"
echo " cd ~/ops/gitea"
echo " ./gitea-data-protection.sh setup # 初始化设置"
echo " ./gitea-data-protection.sh start # 启动服务"
echo " open http://192.168.1.83:33000 # 访问 Gitea"
echo ""
fi
echo -e "${BLUE}📁 重要目录:${NC}"
echo " ~/ops/logs/ # 查看运行日志"
echo " ~/ops/backups/ # 查看备份文件"
echo ""
echo -e "${YELLOW}💡 提示:${NC}"
echo " - 定期检查日志文件了解运行状态"
echo " - 定期验证备份文件完整性"
echo " - 根据需要编辑配置文件"
}
# 主函数
main() {
echo -e "${BLUE}"
echo "=================================================="
echo " macOS 工具集 - ops 目录初始化脚本"
echo "=================================================="
echo -e "${NC}"
echo ""
log "🚀 开始初始化 ops 目录结构..."
echo "目标目录: ${OPS_DIR}"
echo "项目源码: ${PROJECT_ROOT}"
echo ""
# 检查依赖
check_dependencies
echo ""
# 创建基础结构
create_base_structure
echo ""
# 部署模块
deploy_brew_module
echo ""
deploy_gitea_module
echo ""
# 创建文档
create_main_readme
echo ""
# 验证部署
verify_deployment
echo ""
# 显示后续步骤
show_next_steps
}
# 执行主函数
main "$@"