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

+78
View File
@@ -0,0 +1,78 @@
# configmap.yaml — 后端配置 (ConfigMap) + 敏感信息 (Secret)
# ----------------------------------------------------------------------------
# ConfigMap aiops-config:
# - 内含 config.yaml,DB/Redis 连接信息以环境变量占位(${VAR})。
# - 后端 Deployment 将其挂载到 /app/configs/config.yaml(viper 搜索路径 ./configs)。
#
# Secret aiops-secret:
# - 存放 MySQL 密码与 JWT 密钥(明文敏感信息不放 ConfigMap)。
# - 由 backend Deployment / mysql StatefulSet 以环境变量注入。
#
# 部署: kubectl apply -f configmap.yaml
# ----------------------------------------------------------------------------
---
apiVersion: v1
kind: ConfigMap
metadata:
name: aiops-config
namespace: devops
labels:
app.kubernetes.io/name: aiops
app.kubernetes.io/component: backend
data:
config.yaml: |
# AIOps 后端配置
# DB/Redis 连接通过环境变量注入(见 backend Deployment 的 env 段)。
# 敏感字段 (password / jwt) 由 Secret aiops-secret 提供。
# 注意: viper.AutomaticEnv 默认不替换嵌套键中的点(.),如需 DATABASE_HOST ->
# database.host 生效,请在 backend 启动时设置:
# viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
mode: release
port: "8080"
log_level: info
# ---- 数据库 (MySQL) ----
database:
driver: mysql
host: "${DB_HOST}" # -> mysql (k8s Service)
port: 3306
user: "${DB_USER}" # -> aiops
password: "${DB_PASSWORD}" # <- Secret aiops-secret (database-password)
dbname: "${DB_NAME}" # -> aiops
charset: utf8mb4
max_conn: 100
max_idle: 10
# ---- Redis ----
redis:
driver: redis # redka(内嵌) / redis(外部)
host: "${REDIS_HOST}" # -> redis (k8s Service)
port: 6379
password: "${REDIS_PASSWORD}" # 本环境 Redis 无密码,留空
db: 0
# ---- JWT ----
jwt:
secret: "${JWT_SECRET}" # <- Secret aiops-secret (jwt-secret)
expire_hour: 24
# ---- WebSocket ----
websocket:
read_buffer_size: 1024
write_buffer_size: 1024
---
apiVersion: v1
kind: Secret
metadata:
name: aiops-secret
namespace: devops
labels:
app.kubernetes.io/name: aiops
type: Opaque
stringData:
# MySQL 业务账号密码
database-password: "aiops_pass_2026"
# MySQL root 密码(StatefulSet 初始化用)
mysql-root-password: "aiops_root_2026"
# JWT 签名密钥(生产请替换为强随机值)
jwt-secret: "aiops-jwt-secret-change-in-production-2026"