diff --git a/backend/config/config.go b/backend/config/config.go index 381741c..71305d4 100644 --- a/backend/config/config.go +++ b/backend/config/config.go @@ -64,7 +64,7 @@ func Load() *Config { viper.SetDefault("port", "8080") viper.SetDefault("log_level", "info") viper.SetDefault("database.driver", "sqlite") - viper.SetDefault("database.dbname", "data/aiops.db") + viper.SetDefault("database.dbname", "sqlite3.db") viper.SetDefault("database.host", "localhost") viper.SetDefault("database.port", 3306) viper.SetDefault("database.charset", "utf8mb4") diff --git a/deploy/kubernetes/README.md b/deploy/kubernetes/README.md index 6e0032c..676ec0f 100644 --- a/deploy/kubernetes/README.md +++ b/deploy/kubernetes/README.md @@ -16,6 +16,7 @@ AIOps 平台在 Kubernetes 上的部署清单(Go/Gin 后端 + go:embed 前端 | `mysql.yaml` | MySQL 8.0 StatefulSet + Headless Service + 10Gi 持久卷 | | `redis.yaml` | Redis 7 StatefulSet + Headless Service + 2Gi 持久卷 | | `deployment.yaml` | AIOps Deployment(embed 单端口 8080)+ NodePort Service (30080) | +| `pvc-aiops-data.yaml` | local 模式 PVC:`sqlite3.db` / `redka.db` 与 `/app/aiops` 同级 | | `ingress.yaml` | Ingress:所有流量 → aiops:8080(含 WebSocket 支持) | ## 架构 @@ -123,6 +124,17 @@ kubectl -n devops get pvc ## 配置说明 +### local 模式(默认 `MODE=local`) + +- 容器内工作目录 `/app`,数据文件与二进制同级: + - `/app/aiops` — 应用二进制(镜像内) + - `/app/sqlite3.db` — SQLite(PVC 持久化) + - `/app/redka.db` — 本地缓存(PVC 持久化) +- `replicas` 必须为 **1**(SQLite 不支持多副本共享);`./run.sh kubernetes scale` 扩到 >1 时会自动切 `MODE=release` + MySQL/Redis +- 旧版 PVC 若存有 `data/sqlite3.db`,init 容器会自动迁移到根路径 + +### 集群凭据 + | 项目 | 来源 | 值 | |------|------|----| | MySQL 业务账号 | Secret `aiops-secret` | 用户 `aiops` / 密码 `aiops_pass_2026` / 库 `aiops` | diff --git a/deploy/kubernetes/configmap.yaml b/deploy/kubernetes/configmap.yaml index f1fc72b..e2aa4b8 100644 --- a/deploy/kubernetes/configmap.yaml +++ b/deploy/kubernetes/configmap.yaml @@ -15,7 +15,7 @@ data: database: driver: sqlite - dbname: data/sqlite3.db + dbname: sqlite3.db max_conn: 100 max_idle: 10 diff --git a/deploy/kubernetes/deployment.yaml b/deploy/kubernetes/deployment.yaml index 77fbe93..4bcefe6 100644 --- a/deploy/kubernetes/deployment.yaml +++ b/deploy/kubernetes/deployment.yaml @@ -37,6 +37,25 @@ spec: hostNetwork: true dnsPolicy: ClusterFirstWithHostNet enableServiceLinks: false + # 首次部署时在 PVC 中预创建库文件,避免 subPath 挂载成目录 // Logan.Li + initContainers: + - name: init-local-db + image: busybox:1.36 + command: + - sh + - -c + - | + if [ -f /vol/data/sqlite3.db ] && [ ! -f /vol/sqlite3.db ]; then + cp /vol/data/sqlite3.db /vol/sqlite3.db + fi + if [ -f /vol/data/redka/redka.db ] && [ ! -f /vol/redka.db ]; then + cp /vol/data/redka/redka.db /vol/redka.db + fi + [ -f /vol/sqlite3.db ] || install -m 644 /dev/null /vol/sqlite3.db + [ -f /vol/redka.db ] || install -m 644 /dev/null /vol/redka.db + volumeMounts: + - name: data + mountPath: /vol containers: - name: aiops image: 10.10.10.72/library/aiops:embed @@ -77,8 +96,13 @@ spec: readOnly: true - name: uploads mountPath: /app/uploads + # local 模式:sqlite3.db / redka.db 与 /app/aiops 同级持久化 // Logan.Li - name: data - mountPath: /app/data + mountPath: /app/sqlite3.db + subPath: sqlite3.db + - name: data + mountPath: /app/redka.db + subPath: redka.db readinessProbe: httpGet: diff --git a/deploy/kubernetes/pvc-aiops-data.yaml b/deploy/kubernetes/pvc-aiops-data.yaml index ab8eb14..4e67ca0 100644 --- a/deploy/kubernetes/pvc-aiops-data.yaml +++ b/deploy/kubernetes/pvc-aiops-data.yaml @@ -1,4 +1,4 @@ -# pvc-aiops-data.yaml — local 模式 SQLite + redka 数据持久化 +# pvc-aiops-data.yaml — local 模式 sqlite3.db + redka.db 持久化(挂载到 /app/ 与二进制同级) # 部署: kubectl apply -f pvc-aiops-data.yaml apiVersion: v1 kind: PersistentVolumeClaim diff --git a/deploy/kubernetes/quick-deploy.yaml b/deploy/kubernetes/quick-deploy.yaml index c06619c..d8faf90 100644 --- a/deploy/kubernetes/quick-deploy.yaml +++ b/deploy/kubernetes/quick-deploy.yaml @@ -4,7 +4,7 @@ # # 两种模式: # 远程模式 (默认): MODE=release, 连接外部 MySQL + Redis -# 本地模式: MODE=local, 自动 SQLite (data/sqlite3.db) + redka 本地缓存 +# 本地模式: MODE=local, 自动 SQLite (sqlite3.db) + redka (redka.db),与二进制同级 /app/ --- apiVersion: v1 kind: ConfigMap @@ -19,7 +19,7 @@ data: database: driver: sqlite - dbname: data/sqlite3.db + dbname: sqlite3.db redis: driver: redka @@ -55,6 +55,24 @@ spec: spec: hostNetwork: true dnsPolicy: ClusterFirstWithHostNet + initContainers: + - name: init-local-db + image: busybox:1.36 + command: + - sh + - -c + - | + if [ -f /vol/data/sqlite3.db ] && [ ! -f /vol/sqlite3.db ]; then + cp /vol/data/sqlite3.db /vol/sqlite3.db + fi + if [ -f /vol/data/redka/redka.db ] && [ ! -f /vol/redka.db ]; then + cp /vol/data/redka/redka.db /vol/redka.db + fi + [ -f /vol/sqlite3.db ] || install -m 644 /dev/null /vol/sqlite3.db + [ -f /vol/redka.db ] || install -m 644 /dev/null /vol/redka.db + volumeMounts: + - name: data + mountPath: /vol containers: - name: aiops image: aiops:embed @@ -84,7 +102,11 @@ spec: subPath: config.yaml readOnly: true - name: data - mountPath: /app/data + mountPath: /app/sqlite3.db + subPath: sqlite3.db + - name: data + mountPath: /app/redka.db + subPath: redka.db resources: requests: cpu: 100m diff --git a/run.sh b/run.sh index 333826a..4eb8eac 100755 --- a/run.sh +++ b/run.sh @@ -238,7 +238,7 @@ cmd_dev() { info "前端地址: http://localhost:$FRONTEND_PORT" info "后端地址: http://localhost:$BACKEND_PORT" info "健康检查: http://localhost:$BACKEND_PORT/health" - info "数据库: SQLite (backend/sqlite3.db)" + info "数据库: SQLite (./sqlite3.db)" echo "" info "使用 './run.sh stop' 停止服务" else @@ -272,9 +272,12 @@ cmd_status() { else warning "前端: 未运行" fi - if [ -f "$SCRIPT_DIR/$BACKEND_DIR/sqlite3.db" ]; then + if [ -f "$SCRIPT_DIR/sqlite3.db" ]; then + local db_size=$(du -h "$SCRIPT_DIR/sqlite3.db" | cut -f1) + info "数据库: SQLite (./sqlite3.db, $db_size)" + elif [ -f "$SCRIPT_DIR/$BACKEND_DIR/sqlite3.db" ]; then local db_size=$(du -h "$SCRIPT_DIR/$BACKEND_DIR/sqlite3.db" | cut -f1) - info "数据库: SQLite (sqlite3.db, $db_size)" + info "数据库: SQLite (backend/sqlite3.db 旧路径, $db_size)" fi }