Files
macos-tools/scripts/generate-ai-context.sh
bruno 435834dc79 feat: Harbor 版本化配置
- 添加 Harbor 快速恢复脚本 (harbor-quick-restore.sh)
- 添加完整恢复指南 (HARBOR-RESTORE-GUIDE.md)
- 添加版本信息文件 (VERSION.md)
- 更新 .gitignore 排除敏感数据
- 配置 harbor git remote
- 修复 Cloudflare Tunnel 配置

系统重装后可通过以下命令快速恢复:
git clone http://192.168.1.83:33000/gao/ljwx-harbor.git
cd ljwx-harbor
./harbor-quick-restore.sh
2026-02-27 08:12:30 +08:00

636 lines
18 KiB
Bash
Executable File

#!/bin/bash
#==============================================================================
# AI Development Context Generator
# 为 AI 开发生成完整的系统配置上下文
#==============================================================================
set -euo pipefail
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 配置
OUTPUT_FILE="${1:-/Users/brunogao/work/codes/tools/macos/AI-CONTEXT.md}"
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
echo -e "${BLUE}🤖 正在生成 AI 开发上下文...${NC}"
#==============================================================================
# 辅助函数
#==============================================================================
print_section() {
echo -e "\n${GREEN}▶ $1${NC}"
}
check_command() {
command -v "$1" >/dev/null 2>&1
}
get_service_status() {
local service=$1
if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^${service}$"; then
echo "✅ Running"
else
echo "❌ Stopped"
fi
}
safe_exec() {
local output
output=$("$@" 2>/dev/null) || echo "N/A"
echo "$output"
}
#==============================================================================
# 开始生成文档
#==============================================================================
cat > "$OUTPUT_FILE" << 'HEADER'
# AI Development Context
> **自动生成时间**: TIMESTAMP_PLACEHOLDER
> **用途**: 为 AI 辅助开发提供完整的系统配置上下文
---
HEADER
# 替换时间戳
sed -i '' "s/TIMESTAMP_PLACEHOLDER/$TIMESTAMP/g" "$OUTPUT_FILE"
#==============================================================================
# 1. 系统基础信息
#==============================================================================
print_section "收集系统信息..."
cat >> "$OUTPUT_FILE" << EOF
## 🖥️ 系统基础信息
### 硬件配置
- **主机名**: $(hostname)
- **架构**: $(uname -m)
- **CPU**: $(sysctl -n machdep.cpu.brand_string)
- **CPU 核心数**: $(sysctl -n hw.ncpu) cores
- **内存**: $(echo "scale=2; $(sysctl -n hw.memsize) / 1024 / 1024 / 1024" | bc) GB
- **磁盘空间**: $(df -h / | awk 'NR==2 {print $2 " (可用: " $4 ")"}')
### 操作系统
- **系统版本**: $(sw_vers -productName) $(sw_vers -productVersion)
- **内核版本**: $(uname -r)
- **Shell**: $SHELL ($($SHELL --version | head -n1))
### 网络配置
- **主 IP**: $(ipconfig getifaddr en0 2>/dev/null || echo "未检测到")
- **公网 IP**: $(curl -s ifconfig.me 2>/dev/null || echo "无法获取")
- **DNS 服务器**: $(scutil --dns | grep 'nameserver\[0\]' | head -1 | awk '{print $3}')
---
EOF
#==============================================================================
# 2. 开发工具和环境
#==============================================================================
print_section "收集开发环境信息..."
cat >> "$OUTPUT_FILE" << EOF
## 🛠️ 开发工具和环境
### 包管理器
$(if check_command brew; then
echo "- **Homebrew**: $(brew --version | head -n1)"
echo " - 安装路径: $(brew --prefix)"
echo " - 已安装包数量: $(brew list --formula | wc -l | xargs) 个"
else
echo "- **Homebrew**: ❌ 未安装"
fi)
### 容器运行时
$(if check_command docker; then
echo "- **Docker**: $(docker --version)"
echo " - 运行中容器: $(docker ps -q | wc -l | xargs) 个"
echo " - 总容器数: $(docker ps -aq | wc -l | xargs) 个"
echo " - 镜像数: $(docker images -q | wc -l | xargs) 个"
else
echo "- **Docker**: ❌ 未安装"
fi)
$(if check_command orbctl; then
echo "- **OrbStack**: $(orbctl version 2>/dev/null | head -n1 || echo "已安装")"
else
echo "- **OrbStack**: ❌ 未安装"
fi)
### Kubernetes
$(if check_command kubectl; then
echo "- **kubectl**: $(kubectl version --client --short 2>/dev/null || kubectl version --client 2>&1 | head -n1)"
if kubectl cluster-info >/dev/null 2>&1; then
echo " - 集群状态: ✅ 连接正常"
echo " - 节点数: $(kubectl get nodes --no-headers 2>/dev/null | wc -l | xargs)"
echo " - 命名空间: $(kubectl get ns --no-headers 2>/dev/null | wc -l | xargs) 个"
echo " - Pod 总数: $(kubectl get pods -A --no-headers 2>/dev/null | wc -l | xargs)"
else
echo " - 集群状态: ❌ 未连接"
fi
else
echo "- **kubectl**: ❌ 未安装"
fi)
$(if check_command helm; then
echo "- **Helm**: $(helm version --short 2>/dev/null || echo "已安装")"
echo " - 已部署 Release: $(helm list -A 2>/dev/null | tail -n +2 | wc -l | xargs) 个"
else
echo "- **Helm**: ❌ 未安装"
fi)
### 编程语言
$(if check_command python3; then
echo "- **Python**: $(python3 --version)"
echo " - pip: $(pip3 --version | awk '{print $2}')"
else
echo "- **Python**: ❌ 未安装"
fi)
$(if check_command node; then
echo "- **Node.js**: $(node --version)"
echo " - npm: $(npm --version)"
else
echo "- **Node.js**: ❌ 未安装"
fi)
$(if check_command go; then
echo "- **Go**: $(go version | awk '{print $3}')"
else
echo "- **Go**: ❌ 未安装"
fi)
### AI 工具
$(if check_command ollama; then
echo "- **Ollama**: ✅ 已安装"
if pgrep -x ollama >/dev/null; then
echo " - 状态: 🟢 运行中"
echo " - 已安装模型:"
ollama list 2>/dev/null | tail -n +2 | while read -r line; do
model=$(echo "$line" | awk '{print $1}')
size=$(echo "$line" | awk '{print $2}')
echo " - $model ($size)"
done
else
echo " - 状态: 🔴 未运行"
fi
else
echo "- **Ollama**: ❌ 未安装"
fi)
$(if check_command claude-qwen; then
echo "- **Claude-Qwen**: ✅ 已安装"
else
echo "- **Claude-Qwen**: ❌ 未安装"
fi)
---
EOF
#==============================================================================
# 3. DevOps 服务配置
#==============================================================================
print_section "收集 DevOps 服务配置..."
cat >> "$OUTPUT_FILE" << EOF
## 🚀 DevOps 服务配置
### Gitea (Git 托管 + CI/CD)
- **状态**: $(get_service_status "gitea")
- **HTTP 端口**: 33000
- **SSH 端口**: 32222
- **访问地址**: http://$(ipconfig getifaddr en0 2>/dev/null || echo "192.168.1.83"):33000
- **数据目录**: ~/ops/data/gitea
- **备份目录**: ~/ops/backups/gitea
$(if [ -d ~/ops/data/gitea ]; then
echo "- **数据占用**: $(du -sh ~/ops/data/gitea 2>/dev/null | awk '{print $1}')"
fi)
- **管理命令**:
\`\`\`bash
cd ~/ops/gitea
./gitea-data-protection.sh start|stop|restart|health
./gitea-backup.sh # 手动备份
./gitea-restore.sh # 恢复备份
\`\`\`
### Harbor (容器镜像仓库)
- **状态**: $(get_service_status "harbor-core")
- **HTTP 端口**: 8080
- **HTTPS 端口**: 8443
- **访问地址**: http://$(ipconfig getifaddr en0 2>/dev/null || echo "192.168.1.83"):8080
- **数据目录**: ~/ops/data/harbor
- **备份目录**: ~/ops/backups/harbor
- **默认凭据**: admin / admin123
$(if [ -d ~/ops/data/harbor ]; then
echo "- **数据占用**: $(du -sh ~/ops/data/harbor 2>/dev/null | awk '{print $1}')"
fi)
- **管理命令**:
\`\`\`bash
cd ~/ops/harbor
./harbor-data-protection.sh start|stop|restart|health
./harbor-k8s-images.sh sync # 同步 K8s 镜像
./harbor-k8s-images.sh list # 列出镜像
\`\`\`
### GitLab (可选)
- **状态**: $(get_service_status "gitlab")
- **HTTP 端口**: 8890
- **SSH 端口**: 8929
- **访问地址**: http://$(ipconfig getifaddr en0 2>/dev/null || echo "192.168.1.83"):8890
- **数据目录**: ~/ops/data/gitlab
- **默认凭据**: root / admin123
- **管理命令**:
\`\`\`bash
cd ~/ops/gitlab
./gitlab-data-protection.sh start|stop|restart|health
\`\`\`
---
EOF
#==============================================================================
# 4. Kubernetes 集群状态
#==============================================================================
print_section "收集 Kubernetes 集群信息..."
cat >> "$OUTPUT_FILE" << EOF
## ☸️ Kubernetes 集群状态
EOF
if check_command kubectl && kubectl cluster-info >/dev/null 2>&1; then
cat >> "$OUTPUT_FILE" << EOF
### 集群信息
- **集群类型**: $(kubectl config current-context 2>/dev/null || echo "未知")
- **API Server**: $(kubectl cluster-info 2>/dev/null | head -n1 | grep -oE 'https?://[^ ]+' || echo "N/A")
### 节点状态
\`\`\`
$(kubectl get nodes 2>/dev/null || echo "无法获取节点信息")
\`\`\`
### 命名空间列表
\`\`\`
$(kubectl get namespaces 2>/dev/null | head -n 20 || echo "无法获取命名空间")
\`\`\`
### 关键工作负载
\`\`\`
$(kubectl get pods -A --field-selector=status.phase!=Running 2>/dev/null | head -n 20 || echo "所有 Pod 运行正常")
\`\`\`
### Helm Releases
\`\`\`
$(helm list -A 2>/dev/null || echo "无 Helm Release")
\`\`\`
EOF
else
cat >> "$OUTPUT_FILE" << EOF
⚠️ Kubernetes 集群未连接或未配置
EOF
fi
cat >> "$OUTPUT_FILE" << EOF
---
EOF
#==============================================================================
# 5. 项目结构和关键路径
#==============================================================================
print_section "生成项目结构..."
cat >> "$OUTPUT_FILE" << EOF
## 📁 项目结构和关键路径
### 核心目录
\`\`\`
~/ops/ # 运行时根目录
├── logs/ # 统一日志目录
├── backups/ # 备份存储
│ ├── gitea/ # Gitea 备份
│ ├── harbor/ # Harbor 备份
│ └── gitlab/ # GitLab 备份
├── data/ # 运行时数据
│ ├── gitea/ # Gitea 数据(仓库、数据库)
│ ├── harbor/ # Harbor 数据(镜像、数据库)
│ └── gitlab/ # GitLab 数据
├── gitea/ # Gitea 管理脚本
├── harbor/ # Harbor 管理脚本
└── gitlab/ # GitLab 管理脚本
\`\`\`
### 工具脚本位置
- **主部署脚本**: \`~/work/codes/tools/macos/deploy.sh\`
- **初始化脚本**: \`~/work/codes/tools/macos/init-ops.sh\`
- **Gitea 脚本**: \`~/ops/gitea/*.sh\`
- **Harbor 脚本**: \`~/ops/harbor/*.sh\`
- **K8s 工具**: \`~/work/codes/tools/macos/k8s/*.sh\`
- **镜像缓存**: \`~/work/codes/tools/macos/k8s/cache-image.sh\`
### 配置文件
- **Docker Compose**:
- Gitea: \`~/ops/gitea/docker-compose.yml\`
- Harbor: \`~/ops/harbor/docker-compose.yml\`
- GitLab: \`~/ops/gitlab/docker-compose.yml\`
- **Harbor 配置**: \`~/ops/harbor/harbor.yml\`
- **K8s 配置**: \`~/.kube/config\`
---
EOF
#==============================================================================
# 6. 常用工作流和最佳实践
#==============================================================================
print_section "生成工作流文档..."
cat >> "$OUTPUT_FILE" << EOF
## 🔄 常用工作流
### 1. AI 辅助开发流程
\`\`\`bash
# 1. 启动 AI 助手
claude-qwen project
# 2. 在项目目录中开发
cd ~/your-project
# 3. 提交代码到 Gitea
git remote add origin git@$(ipconfig getifaddr en0 2>/dev/null || echo "192.168.1.83"):32222/username/repo.git
git push -u origin master
# 4. Gitea Actions 自动触发 CI/CD
# 查看工作流状态: http://your-ip:33000/username/repo/actions
\`\`\`
### 2. 容器镜像管理
\`\`\`bash
# 拉取镜像并推送到 Harbor
docker pull nginx:alpine
docker tag nginx:alpine harbor.omniverseai.net:8080/library/nginx:alpine
docker push harbor.omniverseai.net:8080/library/nginx:alpine
# 或使用自动缓存脚本
cd ~/work/codes/tools/macos/k8s
./cache-image.sh nginx:alpine
\`\`\`
### 3. Kubernetes 部署
\`\`\`bash
# 修复 ImagePullBackOff(自动缓存镜像并更新部署)
cd ~/work/codes/tools/macos/k8s
./cache-image.sh --update-deployment namespace/deployment-name
# 手动部署应用
kubectl apply -f your-app.yaml
# 查看状态
kubectl get pods -A
kubectl describe pod <pod-name> -n <namespace>
\`\`\`
### 4. 备份和恢复
\`\`\`bash
# Gitea 备份
cd ~/ops/gitea && ./gitea-backup.sh
# Harbor 备份
cd ~/ops/harbor && ./harbor-data-protection.sh backup
# 查看备份
ls -lh ~/ops/backups/gitea/
ls -lh ~/ops/backups/harbor/
# 恢复(会自动创建安全备份)
cd ~/ops/gitea && ./gitea-restore.sh
cd ~/ops/harbor && ./harbor-data-protection.sh restore
\`\`\`
---
EOF
#==============================================================================
# 7. 环境变量和配置
#==============================================================================
print_section "收集环境配置..."
cat >> "$OUTPUT_FILE" << EOF
## ⚙️ 环境变量和配置
### 关键环境变量
\`\`\`bash
# 主机 IP(用于服务访问)
export HOST_IP=\$(ipconfig getifaddr en0)
# Harbor 配置
export HARBOR_HOST=harbor.omniverseai.net
export HARBOR_PORT=8080
export HARBOR_HTTPS_PORT=8443
export HARBOR_ADMIN_PASSWORD=admin123
# Gitea 配置
export GITEA_HTTP_PORT=33000
export GITEA_SSH_PORT=32222
# GitLab 配置(可选)
export GITLAB_HTTP_PORT=8890
export GITLAB_SSH_PORT=8929
# Ollama 配置
export OLLAMA_HOST=localhost:11434
\`\`\`
### Docker 网络
\`\`\`
$(docker network ls 2>/dev/null | grep -E "core-network|harbor|gitea" || echo "无相关网络")
\`\`\`
---
EOF
#==============================================================================
# 8. 快速参考
#==============================================================================
print_section "生成快速参考..."
cat >> "$OUTPUT_FILE" << EOF
## 📚 快速参考
### 服务访问地址
| 服务 | HTTP | SSH/HTTPS | 凭据 |
|------|------|-----------|------|
| Gitea | http://$(ipconfig getifaddr en0 2>/dev/null || echo "192.168.1.83"):33000 | :32222 | 自行注册 |
| Harbor | http://$(ipconfig getifaddr en0 2>/dev/null || echo "192.168.1.83"):8080 | :8443 | admin/admin123 |
| GitLab | http://$(ipconfig getifaddr en0 2>/dev/null || echo "192.168.1.83"):8890 | :8929 | root/admin123 |
| Ollama | http://localhost:11434 | - | - |
### 常用命令速查
| 任务 | 命令 |
|------|------|
| **查看所有服务** | \`docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"\` |
| **重启所有服务** | \`cd ~/ops && docker-compose restart\` |
| **查看日志** | \`docker logs -f <service-name>\` |
| **K8s 集群状态** | \`kubectl get pods -A\` |
| **修复镜像拉取** | \`cd ~/work/codes/tools/macos/k8s && ./cache-image.sh --update-deployment ns/deploy\` |
| **AI 开发助手** | \`claude-qwen project\` |
| **列出 Ollama 模型** | \`ollama list\` |
### 故障排查
1. **服务无法启动**
\`\`\`bash
docker ps -a # 查看所有容器
docker logs <container-name> # 查看日志
docker-compose down && docker-compose up -d # 重启服务
\`\`\`
2. **K8s Pod ImagePullBackOff**
\`\`\`bash
cd ~/work/codes/tools/macos/k8s
./cache-image.sh --update-deployment <namespace>/<deployment>
\`\`\`
3. **磁盘空间不足**
\`\`\`bash
docker system prune -a # 清理未使用的镜像和容器
docker volume prune # 清理未使用的卷
\`\`\`
4. **网络问题**
\`\`\`bash
docker network ls # 查看网络
docker network inspect core-network # 检查网络配置
\`\`\`
---
EOF
#==============================================================================
# 9. 系统健康检查
#==============================================================================
print_section "执行健康检查..."
cat >> "$OUTPUT_FILE" << EOF
## 🏥 系统健康检查
### 关键服务状态
EOF
# 检查 Docker 服务
if docker ps >/dev/null 2>&1; then
cat >> "$OUTPUT_FILE" << EOF
- ✅ Docker 运行正常
EOF
# 列出运行中的服务
cat >> "$OUTPUT_FILE" << EOF
- 运行中的容器:
EOF
docker ps --format ' - {{.Names}} ({{.Status}})' >> "$OUTPUT_FILE"
else
cat >> "$OUTPUT_FILE" << EOF
- ❌ Docker 未运行
EOF
fi
# 检查 K8s 集群
if kubectl cluster-info >/dev/null 2>&1; then
cat >> "$OUTPUT_FILE" << EOF
- ✅ Kubernetes 集群正常
EOF
# 检查异常 Pod
unhealthy_pods=$(kubectl get pods -A --field-selector=status.phase!=Running 2>/dev/null | tail -n +2 | wc -l | xargs)
if [ "$unhealthy_pods" -gt 0 ]; then
cat >> "$OUTPUT_FILE" << EOF
- ⚠️ 发现 $unhealthy_pods 个异常 Pod
EOF
fi
else
cat >> "$OUTPUT_FILE" << EOF
- ⚠️ Kubernetes 集群未连接
EOF
fi
# 检查磁盘空间
disk_usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$disk_usage" -gt 80 ]; then
cat >> "$OUTPUT_FILE" << EOF
- ⚠️ 磁盘使用率: ${disk_usage}% (建议清理)
EOF
else
cat >> "$OUTPUT_FILE" << EOF
- ✅ 磁盘使用率: ${disk_usage}%
EOF
fi
# 检查内存使用
memory_pressure=$(vm_stat | awk '/Pages free/ {free=$3} /Pages active/ {active=$3} /Pages inactive/ {inactive=$3} END {print (free/(free+active+inactive))*100}')
cat >> "$OUTPUT_FILE" << EOF
- 内存空闲: $(printf "%.1f" "$memory_pressure")%
### 建议
EOF
# 生成建议
if [ "$disk_usage" -gt 80 ]; then
cat >> "$OUTPUT_FILE" << EOF
- 🔧 磁盘空间不足,建议执行: \`docker system prune -a\`
EOF
fi
if [ "$unhealthy_pods" -gt 0 ]; then
cat >> "$OUTPUT_FILE" << EOF
- 🔧 存在异常 Pod,建议检查: \`kubectl get pods -A --field-selector=status.phase!=Running\`
EOF
fi
cat >> "$OUTPUT_FILE" << EOF
---
## 📝 更新日志
- **生成时间**: $TIMESTAMP
- **生成脚本**: \`~/work/codes/tools/macos/scripts/generate-ai-context.sh\`
- **更新方式**: \`./scripts/generate-ai-context.sh [输出文件路径]\`
---
**提示**: 此文档会随着系统配置变化而变化,建议定期重新生成以保持最新。
EOF
echo -e "${GREEN}✅ 上下文文档已生成: $OUTPUT_FILE${NC}"
echo -e "${BLUE}📄 文档大小: $(du -h "$OUTPUT_FILE" | awk '{print $1}')${NC}"
echo -e "\n${YELLOW}💡 使用建议:${NC}"
echo -e " 1. 将此文档作为 Claude Code 的项目上下文"
echo -e " 2. 在 AI 开发时引用相关配置"
echo -e " 3. 定期更新以保持信息准确"
echo -e "\n${BLUE}🔄 更新命令: ./scripts/generate-ai-context.sh${NC}"