- 新增 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 <[email protected]>
481 lines
12 KiB
Bash
Executable File
481 lines
12 KiB
Bash
Executable File
#!/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 "$@" |