feat: 三种部署方式 — embed单容器 + 二进制部署 + K8s

新增三种部署方式(原有 docker-compose 不受影响):

1. Docker embed 单容器 (docker-compose.embed.yml):
   - go:embed 前端嵌入后端二进制
   - 不需要 nginx 容器,3容器→2容器
   - 镜像仅 54.8MB (vs 原来 1.16GB)
   - 用法: make docker-embed

2. 二进制部署 (deploy/binary/):
   - make build-binary 生成单二进制
   - install.sh 自动创建 systemd 服务
   - 适合无 Docker 环境
   - 用法: scp aiops + install.sh, bash install.sh install

3. Kubernetes 部署 (deploy/k8s/):
   - devops 命名空间全套 yaml
   - MySQL StatefulSet + Redis StatefulSet + Backend Deployment
   - ConfigMap + Secret + Ingress
   - 用法: kubectl apply -f deploy/k8s/

核心改动:
- backend/cmd/embed.go: go:embed 前端 + SPA fallback 路由
- backend/Dockerfile.embed: 四阶段构建 (前端→后端embed→agent→runtime)
- Makefile: build-binary + docker-embed 目标
- deploy/README.md: 四种部署方式对比文档
This commit is contained in:
Logan authored and attacker committed 2026-06-21 14:20:29 +08:00
1 parent 24f955832e
commit 4631b02f13
15 files changed
+1218 -3

No files matched your search

+116
View File
@@ -0,0 +1,116 @@
# backend.yaml — AIOps 后端 (Deployment + Service)
# ----------------------------------------------------------------------------
# - 镜像 aiops-backend:latest(前端通过 go:embed 内嵌进同一二进制)
# - 暴露两个端口:
# 8080 = API + WebSocket
# 80 = go:embed 前端 (SPA 静态资源)
# - 配置: ConfigMap aiops-config 挂载到 /app/configs/config.yaml
# - 密码: Secret aiops-secret 以环境变量注入(DB_PASSWORD / JWT_SECRET)
# - Service: ClusterIP,对外暴露 80 与 8080
#
# 部署: kubectl apply -f backend.yaml
# ----------------------------------------------------------------------------
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: aiops-backend
namespace: devops
labels:
app.kubernetes.io/name: aiops
app.kubernetes.io/component: backend
spec:
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app.kubernetes.io/name: aiops
app.kubernetes.io/component: backend
template:
metadata:
labels:
app.kubernetes.io/name: aiops
app.kubernetes.io/component: backend
spec:
containers:
- name: aiops-backend
image: aiops-backend:latest
imagePullPolicy: IfNotPresent
env:
# ---- 数据库连接参数(对应 config.yaml 的 ${DB_*} 占位)----
- {name: DB_HOST, value: mysql}
- {name: DB_PORT, value: "3306"}
- {name: DB_USER, value: aiops}
- {name: DB_NAME, value: aiops}
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: aiops-secret
key: database-password
# ---- Redis 连接参数(本环境无密码)----
- {name: REDIS_HOST, value: redis}
- {name: REDIS_PORT, value: "6379"}
- {name: REDIS_PASSWORD, value: ""}
# ---- JWT ----
- name: JWT_SECRET
valueFrom:
secretKeyRef:
name: aiops-secret
key: jwt-secret
- {name: TZ, value: Asia/Shanghai}
ports:
- {name: api, containerPort: 8080} # API + WebSocket
- {name: web, containerPort: 80} # go:embed 前端
resources:
requests:
cpu: 100m
memory: 512Mi
limits:
cpu: 500m
memory: 1Gi
livenessProbe:
httpGet:
path: /health
port: api
initialDelaySeconds: 20
periodSeconds: 30
timeoutSeconds: 3
failureThreshold: 3
readinessProbe:
httpGet:
path: /health
port: api
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 3
volumeMounts:
- name: config
mountPath: /app/configs
readOnly: true
volumes:
- name: config
configMap:
name: aiops-config
---
# Service — 对内暴露 80 (前端) 与 8080 (API)
apiVersion: v1
kind: Service
metadata:
name: aiops-backend
namespace: devops
labels:
app.kubernetes.io/name: aiops
app.kubernetes.io/component: backend
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: aiops
app.kubernetes.io/component: backend
ports:
- {name: api, port: 8080, targetPort: 8080}
- {name: web, port: 80, targetPort: 80}