fix: favicon .ico 生成 + README 更新 + run.sh kubernetes 别名
- 新增 frontend/public/favicon.ico (4 size: 16/32/48/64) - index.html .ico 引用调整到 .svg 前面(兼容旧浏览器) - README.md 全量更新:Kubernetes 完整命令列表 + K8s 管理亮点 - run.sh 主入口添加 k8s 别名(向后兼容) - aiops-development skill 更新部署命令和 favicon 文档
This commit is contained in:
1 parent
f061785266
commit
65636b3f5a
14 files changed
+458
-521
No files matched your search
@@ -7,10 +7,10 @@
|
||||
# ./run.sh docker up 构建+启动 (MySQL+Redis+Backend+Nginx)
|
||||
#
|
||||
# 方式 2 — Kubernetes (embed 单容器):
|
||||
# ./run.sh k8s deploy 构建镜像+全量部署 (embed 前端嵌入后端)
|
||||
# ./run.sh k8s upgrade 重新构建+滚动更新
|
||||
# ./run.sh k8s status 查看资源状态
|
||||
# ./run.sh k8s logs/exec 日志/进入容器
|
||||
# ./run.sh kubernetes deploy 构建镜像+全量部署 (embed 前端嵌入后端)
|
||||
# ./run.sh kubernetes upgrade 重新构建+滚动更新
|
||||
# ./run.sh kubernetes status 查看资源状态
|
||||
# ./run.sh kubernetes logs/exec 日志/进入容器
|
||||
#
|
||||
# 方式 3 — 独立二进制:
|
||||
# ./run.sh build 编译独立二进制 (embed 前端)
|
||||
@@ -471,7 +471,7 @@ YAML
|
||||
|
||||
# 静态编译(CGO_ENABLED=1 因为 SQLite 需要 CGO)
|
||||
info "编译中..."
|
||||
CGO_ENABLED=1 GOPROXY=https://goproxy.cn,direct GONOSUMCHECK='*' GOTOOLCHAIN=go1.22.2 go build -ldflags="-w -s" -o "$STANDALONE_BIN" ./cmd/
|
||||
CGO_ENABLED=1 GOPROXY=https://goproxy.cn,direct GONOSUMCHECK='*' GOTOOLCHAIN=go1.24.0 go build -ldflags="-w -s" -o "$STANDALONE_BIN" ./cmd/
|
||||
|
||||
if [ -f "$STANDALONE_BIN" ]; then
|
||||
local bin_size=$(du -h "$STANDALONE_BIN" | cut -f1)
|
||||
@@ -549,13 +549,13 @@ cmd_binary() {
|
||||
# ============================================================
|
||||
# Kubernetes 部署 (embed 单容器模式)
|
||||
# ============================================================
|
||||
K8S_NAMESPACE="devops"
|
||||
K8S_MANIFEST_DIR="$SCRIPT_DIR/deploy/kubernetes"
|
||||
K8S_IMAGE="aiops:embed"
|
||||
K8S_NODE_PORT=30080
|
||||
KUBERNETES_NAMESPACE="devops"
|
||||
KUBERNETES_MANIFEST_DIR="$SCRIPT_DIR/deploy/kubernetes"
|
||||
KUBERNETES_IMAGE="aiops:embed"
|
||||
KUBERNETES_NODE_PORT=30080
|
||||
|
||||
# 检测 kubectl 和 Docker
|
||||
check_k8s_deps() {
|
||||
check_kubernetes_deps() {
|
||||
if ! command -v kubectl &>/dev/null; then
|
||||
error "kubectl 未安装,请先安装 kubectl"
|
||||
exit 1
|
||||
@@ -592,15 +592,15 @@ load_image_to_cluster() {
|
||||
warning "如集群无法拉取镜像,请手动推送: docker push <registry>/$image"
|
||||
}
|
||||
|
||||
# K8s 构建镜像
|
||||
cmd_k8s_build() {
|
||||
# Kubernetes 构建镜像
|
||||
cmd_kubernetes_build() {
|
||||
if ! command -v docker &>/dev/null; then
|
||||
error "Docker 未安装"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
banner "========== 构建 embed 镜像 =========="
|
||||
info "镜像: $K8S_IMAGE"
|
||||
info "镜像: $KUBERNETES_IMAGE"
|
||||
|
||||
# 版本信息
|
||||
local version=$(git describe --tags --abbrev=0 2>/dev/null || echo "dev")
|
||||
@@ -610,93 +610,93 @@ cmd_k8s_build() {
|
||||
docker build -f Dockerfile.embed \
|
||||
--build-arg VERSION="$version" \
|
||||
--build-arg BUILD_TIME="$build_time" \
|
||||
-t "$K8S_IMAGE" . || {
|
||||
-t "$KUBERNETES_IMAGE" . || {
|
||||
error "镜像构建失败"
|
||||
exit 1
|
||||
}
|
||||
|
||||
local img_size=$(docker images "$K8S_IMAGE" --format "{{.Size}}" | head -1)
|
||||
success "镜像构建完成: $K8S_IMAGE ($img_size)"
|
||||
local img_size=$(docker images "$KUBERNETES_IMAGE" --format "{{.Size}}" | head -1)
|
||||
success "镜像构建完成: $KUBERNETES_IMAGE ($img_size)"
|
||||
|
||||
# 加载到本地集群
|
||||
load_image_to_cluster "$K8S_IMAGE"
|
||||
load_image_to_cluster "$KUBERNETES_IMAGE"
|
||||
}
|
||||
|
||||
# K8s 部署
|
||||
cmd_k8s() {
|
||||
# Kubernetes 部署
|
||||
cmd_kubernetes() {
|
||||
local action=${1:-help}
|
||||
|
||||
case "$action" in
|
||||
deploy|up)
|
||||
check_k8s_deps
|
||||
banner "========== K8s 部署 ($K8S_NAMESPACE) =========="
|
||||
check_kubernetes_deps
|
||||
banner "========== Kubernetes 部署 ($KUBERNETES_NAMESPACE) =========="
|
||||
|
||||
# 1. 构建镜像
|
||||
cmd_k8s_build
|
||||
cmd_kubernetes_build
|
||||
|
||||
# 2. 部署基础设施
|
||||
info "部署 Namespace + Secret + ConfigMap..."
|
||||
kubectl apply -f "$K8S_MANIFEST_DIR/namespace.yaml"
|
||||
kubectl apply -f "$K8S_MANIFEST_DIR/secret.yaml"
|
||||
kubectl apply -f "$K8S_MANIFEST_DIR/configmap.yaml"
|
||||
kubectl apply -f "$KUBERNETES_MANIFEST_DIR/namespace.yaml"
|
||||
kubectl apply -f "$KUBERNETES_MANIFEST_DIR/secret.yaml"
|
||||
kubectl apply -f "$KUBERNETES_MANIFEST_DIR/configmap.yaml"
|
||||
|
||||
info "部署 MySQL + Redis..."
|
||||
kubectl apply -f "$K8S_MANIFEST_DIR/mysql.yaml"
|
||||
kubectl apply -f "$K8S_MANIFEST_DIR/redis.yaml"
|
||||
kubectl apply -f "$KUBERNETES_MANIFEST_DIR/mysql.yaml"
|
||||
kubectl apply -f "$KUBERNETES_MANIFEST_DIR/redis.yaml"
|
||||
|
||||
# 3. 等待数据库就绪
|
||||
info "等待 MySQL 就绪..."
|
||||
kubectl -n "$K8S_NAMESPACE" rollout status statefulset/mysql --timeout=120s 2>/dev/null || {
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" rollout status statefulset/mysql --timeout=120s 2>/dev/null || {
|
||||
warning "MySQL 启动较慢,继续部署应用(可在后台自行完成初始化)"
|
||||
}
|
||||
info "等待 Redis 就绪..."
|
||||
kubectl -n "$K8S_NAMESPACE" rollout status statefulset/redis --timeout=60s 2>/dev/null || true
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" rollout status statefulset/redis --timeout=60s 2>/dev/null || true
|
||||
|
||||
# 4. 部署应用
|
||||
info "部署 AIOps 应用..."
|
||||
kubectl apply -f "$K8S_MANIFEST_DIR/deployment.yaml"
|
||||
kubectl -n "$K8S_NAMESPACE" rollout status deployment/aiops --timeout=180s 2>/dev/null || {
|
||||
warning "应用正在启动,查看日志: ./run.sh k8s logs"
|
||||
kubectl apply -f "$KUBERNETES_MANIFEST_DIR/deployment.yaml"
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" rollout status deployment/aiops --timeout=180s 2>/dev/null || {
|
||||
warning "应用正在启动,查看日志: ./run.sh kubernetes logs"
|
||||
}
|
||||
|
||||
# 5. Ingress(可选)
|
||||
if [ -f "$K8S_MANIFEST_DIR/ingress.yaml" ]; then
|
||||
if [ -f "$KUBERNETES_MANIFEST_DIR/ingress.yaml" ]; then
|
||||
info "部署 Ingress(如集群无 Ingress Controller 会跳过)..."
|
||||
kubectl apply -f "$K8S_MANIFEST_DIR/ingress.yaml" 2>/dev/null || true
|
||||
kubectl apply -f "$KUBERNETES_MANIFEST_DIR/ingress.yaml" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
echo ""
|
||||
success "部署完成!"
|
||||
echo ""
|
||||
kubectl -n "$K8S_NAMESPACE" get pods,svc
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" get pods,svc
|
||||
echo ""
|
||||
local node_ip=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}' 2>/dev/null)
|
||||
info "访问地址: http://${node_ip:-<NODE_IP>}:$K8S_NODE_PORT"
|
||||
info "健康检查: http://${node_ip:-<NODE_IP>}:$K8S_NODE_PORT/health"
|
||||
info "访问地址: http://${node_ip:-<NODE_IP>}:$KUBERNETES_NODE_PORT"
|
||||
info "健康检查: http://${node_ip:-<NODE_IP>}:$KUBERNETES_NODE_PORT/health"
|
||||
;;
|
||||
|
||||
upgrade|update)
|
||||
check_k8s_deps
|
||||
banner "========== K8s 滚动更新 =========="
|
||||
cmd_k8s_build
|
||||
check_kubernetes_deps
|
||||
banner "========== Kubernetes 滚动更新 =========="
|
||||
cmd_kubernetes_build
|
||||
info "触发滚动更新..."
|
||||
kubectl -n "$K8S_NAMESPACE" rollout restart deployment/aiops
|
||||
kubectl -n "$K8S_NAMESPACE" rollout status deployment/aiops --timeout=180s
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" rollout restart deployment/aiops
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" rollout status deployment/aiops --timeout=180s
|
||||
success "滚动更新完成"
|
||||
;;
|
||||
|
||||
delete|down|remove)
|
||||
check_k8s_deps
|
||||
banner "========== K8s 清理 ($K8S_NAMESPACE) =========="
|
||||
warning "这将删除 $K8S_NAMESPACE 命名空间中的所有资源"
|
||||
check_kubernetes_deps
|
||||
banner "========== Kubernetes 清理 ($KUBERNETES_NAMESPACE) =========="
|
||||
warning "这将删除 $KUBERNETES_NAMESPACE 命名空间中的所有资源"
|
||||
warning "MySQL/Redis 持久卷(PVC)需手动删除"
|
||||
echo ""
|
||||
read -p "确认删除?[y/N] " confirm
|
||||
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
|
||||
kubectl delete -f "$K8S_MANIFEST_DIR/" --ignore-not-found 2>/dev/null
|
||||
kubectl delete -f "$KUBERNETES_MANIFEST_DIR/" --ignore-not-found 2>/dev/null
|
||||
echo ""
|
||||
info "PVC 状态(需手动清理):"
|
||||
kubectl -n "$K8S_NAMESPACE" get pvc 2>/dev/null || echo " 无 PVC"
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" get pvc 2>/dev/null || echo " 无 PVC"
|
||||
success "清理完成"
|
||||
else
|
||||
info "已取消"
|
||||
@@ -704,94 +704,94 @@ cmd_k8s() {
|
||||
;;
|
||||
|
||||
build|image)
|
||||
cmd_k8s_build
|
||||
cmd_kubernetes_build
|
||||
;;
|
||||
|
||||
status|ps)
|
||||
check_k8s_deps
|
||||
banner "========== K8s 状态 ($K8S_NAMESPACE) =========="
|
||||
check_kubernetes_deps
|
||||
banner "========== Kubernetes 状态 ($KUBERNETES_NAMESPACE) =========="
|
||||
echo ""
|
||||
echo "--- Pods ---"
|
||||
kubectl -n "$K8S_NAMESPACE" get pods -o wide 2>/dev/null
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" get pods -o wide 2>/dev/null
|
||||
echo ""
|
||||
echo "--- Services ---"
|
||||
kubectl -n "$K8S_NAMESPACE" get svc 2>/dev/null
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" get svc 2>/dev/null
|
||||
echo ""
|
||||
echo "--- PVC ---"
|
||||
kubectl -n "$K8S_NAMESPACE" get pvc 2>/dev/null
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" get pvc 2>/dev/null
|
||||
echo ""
|
||||
echo "--- Ingress ---"
|
||||
kubectl -n "$K8S_NAMESPACE" get ingress 2>/dev/null
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" get ingress 2>/dev/null
|
||||
;;
|
||||
|
||||
logs|log)
|
||||
check_k8s_deps
|
||||
check_kubernetes_deps
|
||||
local follow=${2:--f}
|
||||
info "应用日志 (Ctrl+C 退出):"
|
||||
kubectl -n "$K8S_NAMESPACE" logs $follow deployment/aiops --tail=100
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" logs $follow deployment/aiops --tail=100
|
||||
;;
|
||||
|
||||
exec|shell|sh)
|
||||
check_k8s_deps
|
||||
check_kubernetes_deps
|
||||
info "进入容器 Shell..."
|
||||
kubectl -n "$K8S_NAMESPACE" exec -it deployment/aiops -- bash || \
|
||||
kubectl -n "$K8S_NAMESPACE" exec -it deployment/aiops -- sh
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" exec -it deployment/aiops -- bash || \
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" exec -it deployment/aiops -- sh
|
||||
;;
|
||||
|
||||
mysql|db)
|
||||
check_k8s_deps
|
||||
check_kubernetes_deps
|
||||
info "进入 MySQL..."
|
||||
kubectl -n "$K8S_NAMESPACE" exec -it mysql-0 -- mysql -uaiops -paiops_pass_2026 aiops
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" exec -it mysql-0 -- mysql -uaiops -paiops_pass_2026 aiops
|
||||
;;
|
||||
|
||||
redis)
|
||||
check_k8s_deps
|
||||
check_kubernetes_deps
|
||||
info "进入 Redis CLI..."
|
||||
kubectl -n "$K8S_NAMESPACE" exec -it redis-0 -- redis-cli
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" exec -it redis-0 -- redis-cli
|
||||
;;
|
||||
|
||||
scale)
|
||||
check_k8s_deps
|
||||
check_kubernetes_deps
|
||||
local replicas=${2:-1}
|
||||
info "扩缩容到 $replicas 副本..."
|
||||
kubectl -n "$K8S_NAMESPACE" scale deployment/aiops --replicas="$replicas"
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" scale deployment/aiops --replicas="$replicas"
|
||||
;;
|
||||
|
||||
port-forward|pf)
|
||||
check_k8s_deps
|
||||
check_kubernetes_deps
|
||||
local local_port=${2:-8080}
|
||||
info "端口转发 localhost:$local_port → aiops:8080 (Ctrl+C 退出):"
|
||||
kubectl -n "$K8S_NAMESPACE" port-forward svc/aiops "$local_port":8080
|
||||
kubectl -n "$KUBERNETES_NAMESPACE" port-forward svc/aiops "$local_port":8080
|
||||
;;
|
||||
|
||||
help|--help|-h)
|
||||
echo "K8s 部署命令 (embed 单容器模式):"
|
||||
echo "Kubernetes 部署命令 (embed 单容器模式):"
|
||||
echo ""
|
||||
echo " ${GREEN}部署${NC}"
|
||||
echo " ./run.sh k8s deploy 构建镜像 + 全量部署"
|
||||
echo " ./run.sh k8s upgrade 重新构建镜像 + 滚动更新"
|
||||
echo " ./run.sh k8s delete 删除所有 K8s 资源(保留 PVC)"
|
||||
echo " ./run.sh kubernetes deploy 构建镜像 + 全量部署"
|
||||
echo " ./run.sh kubernetes upgrade 重新构建镜像 + 滚动更新"
|
||||
echo " ./run.sh kubernetes delete 删除所有 Kubernetes 资源(保留 PVC)"
|
||||
echo ""
|
||||
echo " ${CYAN}运维${NC}"
|
||||
echo " ./run.sh k8s status 查看资源状态"
|
||||
echo " ./run.sh k8s logs 查看应用日志(默认 follow)"
|
||||
echo " ./run.sh k8s exec 进入容器 Shell"
|
||||
echo " ./run.sh k8s mysql 进入 MySQL CLI"
|
||||
echo " ./run.sh k8s redis 进入 Redis CLI"
|
||||
echo " ./run.sh k8s scale 3 扩缩容到 3 副本"
|
||||
echo " ./run.sh k8s port-forward 端口转发到本机 8080"
|
||||
echo " ./run.sh kubernetes status 查看资源状态"
|
||||
echo " ./run.sh kubernetes logs 查看应用日志(默认 follow)"
|
||||
echo " ./run.sh kubernetes exec 进入容器 Shell"
|
||||
echo " ./run.sh kubernetes mysql 进入 MySQL CLI"
|
||||
echo " ./run.sh kubernetes redis 进入 Redis CLI"
|
||||
echo " ./run.sh kubernetes scale 3 扩缩容到 3 副本"
|
||||
echo " ./run.sh kubernetes port-forward 端口转发到本机 8080"
|
||||
echo ""
|
||||
echo " ${YELLOW}镜像${NC}"
|
||||
echo " ./run.sh k8s build 仅构建 embed 镜像"
|
||||
echo " ./run.sh kubernetes build 仅构建 embed 镜像"
|
||||
echo ""
|
||||
echo " 镜像: $K8S_IMAGE"
|
||||
echo " 命名空间: $K8S_NAMESPACE"
|
||||
echo " NodePort: $K8S_NODE_PORT"
|
||||
echo " 镜像: $KUBERNETES_IMAGE"
|
||||
echo " 命名空间: $KUBERNETES_NAMESPACE"
|
||||
echo " NodePort: $KUBERNETES_NODE_PORT"
|
||||
;;
|
||||
|
||||
*)
|
||||
error "未知 k8s 子命令: $action"
|
||||
cmd_k8s help
|
||||
error "未知 kubernetes 子命令: $action"
|
||||
cmd_kubernetes help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
@@ -820,17 +820,17 @@ cmd_help() {
|
||||
echo " ./run.sh docker ps 查看容器状态"
|
||||
echo ""
|
||||
echo -e " ${MAGENTA}Kubernetes 部署 (embed 单容器)${NC}"
|
||||
echo " ./run.sh k8s deploy 构建镜像 + 全量部署到 K8s"
|
||||
echo " ./run.sh k8s upgrade 重新构建 + 滚动更新"
|
||||
echo " ./run.sh k8s delete 删除所有 K8s 资源"
|
||||
echo " ./run.sh k8s status 查看资源状态"
|
||||
echo " ./run.sh k8s logs 查看应用日志"
|
||||
echo " ./run.sh k8s exec 进入容器 Shell"
|
||||
echo " ./run.sh k8s mysql 进入 MySQL CLI"
|
||||
echo " ./run.sh k8s redis 进入 Redis CLI"
|
||||
echo " ./run.sh k8s scale 3 扩缩容"
|
||||
echo " ./run.sh k8s port-forward 端口转发到本机"
|
||||
echo " ./run.sh k8s build 仅构建 embed 镜像"
|
||||
echo " ./run.sh kubernetes deploy 构建镜像 + 全量部署到 Kubernetes"
|
||||
echo " ./run.sh kubernetes upgrade 重新构建 + 滚动更新"
|
||||
echo " ./run.sh kubernetes delete 删除所有 Kubernetes 资源"
|
||||
echo " ./run.sh kubernetes status 查看资源状态"
|
||||
echo " ./run.sh kubernetes logs 查看应用日志"
|
||||
echo " ./run.sh kubernetes exec 进入容器 Shell"
|
||||
echo " ./run.sh kubernetes mysql 进入 MySQL CLI"
|
||||
echo " ./run.sh kubernetes redis 进入 Redis CLI"
|
||||
echo " ./run.sh kubernetes scale 3 扩缩容"
|
||||
echo " ./run.sh kubernetes port-forward 端口转发到本机"
|
||||
echo " ./run.sh kubernetes build 仅构建 embed 镜像"
|
||||
echo ""
|
||||
echo -e " ${YELLOW}编译 & 独立二进制${NC}"
|
||||
echo " ./run.sh build 编译独立二进制 ./$BACKEND_DIR/$STANDALONE_BIN"
|
||||
@@ -894,10 +894,10 @@ main() {
|
||||
cmd_binary "$@"
|
||||
;;
|
||||
|
||||
# Kubernetes 部署
|
||||
k8s|kubernetes)
|
||||
# Kubernetes 部署 (k8s 为别名)
|
||||
kubernetes|k8s)
|
||||
shift
|
||||
cmd_k8s "$@"
|
||||
cmd_kubernetes "$@"
|
||||
;;
|
||||
|
||||
# 帮助
|
||||
|
||||
Reference in new issue
Block a user