diff --git a/backend/go.mod b/backend/go.mod index f50223c..746c56f 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -3,13 +3,16 @@ module ezops go 1.24.0 require ( + github.com/creack/pty v1.1.24 github.com/gin-gonic/gin v1.9.1 + github.com/glebarez/sqlite v1.11.0 github.com/go-ldap/ldap/v3 v3.4.10 github.com/golang-jwt/jwt/v5 v5.2.0 github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.3 github.com/gosnmp/gosnmp v1.35.0 github.com/nalgeon/redka v0.2.0 + github.com/pkg/sftp v1.13.10 github.com/redis/go-redis/v9 v9.7.0 github.com/spf13/viper v1.18.2 go.uber.org/zap v1.26.0 @@ -17,7 +20,6 @@ require ( gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/mysql v1.5.2 gorm.io/driver/postgres v1.5.4 - gorm.io/driver/sqlite v1.6.0 gorm.io/gorm v1.30.0 ) @@ -26,11 +28,12 @@ require ( github.com/bytedance/sonic v1.9.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect - github.com/creack/pty v1.1.24 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect + github.com/glebarez/go-sqlite v1.21.2 // indirect github.com/go-asn1-ber/asn1-ber v1.5.7 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect @@ -49,12 +52,11 @@ require ( github.com/leodido/go-urn v1.2.4 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-isatty v0.0.19 // indirect - github.com/mattn/go-sqlite3 v1.14.22 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect - github.com/pkg/sftp v1.13.10 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect @@ -72,4 +74,8 @@ require ( golang.org/x/text v0.32.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + modernc.org/libc v1.22.5 // indirect + modernc.org/mathutil v1.5.0 // indirect + modernc.org/memory v1.5.0 // indirect + modernc.org/sqlite v1.23.1 // indirect ) diff --git a/backend/go.sum b/backend/go.sum index bb87560..638df2f 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -22,6 +22,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= @@ -32,6 +34,10 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= +github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= +github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= +github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= github.com/go-asn1-ber/asn1-ber v1.5.7 h1:DTX+lbVTWaTw1hQ+PbZPlnDZPEIs0SS/GCZAl535dDk= github.com/go-asn1-ber/asn1-ber v1.5.7/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-ldap/ldap/v3 v3.4.10 h1:ot/iwPOhfpNVgB1o+AVXljizWZ9JTp7YF5oeyONmcJU= @@ -55,6 +61,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= @@ -127,6 +135,9 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= @@ -153,9 +164,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= @@ -269,9 +280,15 @@ gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs= gorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8= gorm.io/driver/postgres v1.5.4 h1:Iyrp9Meh3GmbSuyIAGyjkN+n9K+GHX9b9MqsTL4EJCo= gorm.io/driver/postgres v1.5.4/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C/BH0= -gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ= -gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8= gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= +modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= +modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM= +modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/backend/main.go b/backend/main.go index b6aa1ae..cb59104 100644 --- a/backend/main.go +++ b/backend/main.go @@ -265,6 +265,21 @@ func loadConfig() *config.Config { // CLI flags 覆盖(最高优先级)// Logan.Li applyFlags() + // --mode local 快捷模式:自动配置 SQLite + redka 本地缓存 // Logan.Li + if *flagMode == "local" || viper.GetString("mode") == "local" { + // 数据库:SQLite,文件名 sqlite3.db + if *flagDBDriver == "" { + viper.Set("database.driver", "sqlite") + } + if *flagDBName == "" { + viper.Set("database.dbname", "data/sqlite3.db") + } + // 缓存:redka 本地内嵌(无需外部 Redis) + if *flagRedisDriver == "" { + viper.Set("redis.driver", "redka") + } + } + // 解析配置 // Logan.Li var cfg config.Config if err := viper.Unmarshal(&cfg); err != nil { diff --git a/backend/pkg/database/database.go b/backend/pkg/database/database.go index 9b999d9..a2a0a5e 100644 --- a/backend/pkg/database/database.go +++ b/backend/pkg/database/database.go @@ -9,7 +9,7 @@ import ( "gorm.io/driver/mysql" "gorm.io/driver/postgres" - "gorm.io/driver/sqlite" + "github.com/glebarez/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) diff --git a/deploy/kubernetes/quick-deploy.yaml b/deploy/kubernetes/quick-deploy.yaml index 6132404..8c6a3a4 100644 --- a/deploy/kubernetes/quick-deploy.yaml +++ b/deploy/kubernetes/quick-deploy.yaml @@ -1,6 +1,10 @@ -# quick-deploy.yaml — AIOps 快速部署 (ConfigMap + Deployment, 含 Service) +# quick-deploy.yaml — AIOps 单容器快速部署 # 部署: kubectl apply -f quick-deploy.yaml -# 注意: 此文件自包含, 不依赖其他 YAML +# 此文件自包含 (ConfigMap + Deployment + Service), 不依赖其他 YAML +# +# 两种模式: +# 远程模式 (默认): MODE=release, 连接外部 MySQL + Redis +# 本地模式: MODE=local, 自动 SQLite (data/sqlite3.db) + redka 本地缓存 --- apiVersion: v1 kind: ConfigMap @@ -13,24 +17,6 @@ data: port: "8080" log_level: info - database: - driver: mysql - host: 10.10.10.75 - port: 3306 - user: root - password: aiops_root_2026 - dbname: aiops - charset: utf8mb4 - max_conn: 100 - max_idle: 10 - - redis: - driver: redis - host: 10.10.10.75 - port: 6379 - password: "" - db: 0 - jwt: secret: "aiops-jwt-secret-key-2026" expire_hour: 24 @@ -68,24 +54,33 @@ spec: imagePullPolicy: IfNotPresent ports: - containerPort: 8080 - # ── 环境变量 (仅覆盖代码默认值) ── env: + # 运行模式: local=SQLite+redka, release=需配置外部DB/Redis + - name: MODE + value: "local" - name: TZ value: Asia/Shanghai + # 远程数据库 (MODE=release 时生效) - name: DATABASE_DRIVER value: "mysql" - name: DATABASE_HOST value: "10.10.10.75" + - name: DATABASE_PORT + value: "3306" - name: DATABASE_USER value: "root" - name: DATABASE_PASSWORD value: "aiops_root_2026" - name: DATABASE_DBNAME value: "aiops" + # 远程 Redis (MODE=release 时生效) - name: REDIS_DRIVER value: "redis" - name: REDIS_HOST value: "10.10.10.75" + - name: REDIS_PORT + value: "6379" + # JWT - name: JWT_SECRET value: "aiops-jwt-secret-key-2026" volumeMounts: @@ -93,8 +88,6 @@ spec: mountPath: /app/config.yaml subPath: config.yaml readOnly: true - - name: uploads - mountPath: /app/uploads - name: data mountPath: /app/data resources: @@ -108,8 +101,6 @@ spec: - name: config configMap: name: aiops-config - - name: uploads - emptyDir: {} - name: data emptyDir: {} --- diff --git a/docker-compose.yml b/docker-compose.yml index c0b503e..5faefd1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -60,8 +60,11 @@ services: restart: unless-stopped ports: - "8080:8080" + environment: + - MODE=${MODE:-release} volumes: - ./backend/config.yaml:/app/config.yaml + - ./backend/data:/app/data - /var/run/docker.sock:/var/run/docker.sock depends_on: mysql: diff --git a/run.sh b/run.sh index 90da7ae..8d1f71c 100755 --- a/run.sh +++ b/run.sh @@ -379,9 +379,9 @@ ensure_binary_config() { if [ -f "$cfg" ]; then return 0 fi - info "生成默认 config.yaml (SQLite + 无Redis)..." + info "生成默认 config.yaml (local 模式: SQLite + redka 本地缓存)..." cat > "$cfg" << 'YAML' -mode: "release" +mode: "local" port: "8080" log_level: "info" @@ -391,7 +391,7 @@ database: port: 3306 user: "" password: "" - dbname: "data/aiops.db" + dbname: "data/sqlite3.db" charset: "utf8mb4" max_conn: 100 max_idle: 10 @@ -399,11 +399,12 @@ database: redis: host: "localhost" port: 6379 + driver: "redka" password: "" db: 0 jwt: - secret: "CHANGE_ME_JWT_SECRET" # ⚠️ 生产环境必须替换 + secret: "aiops-local-dev-secret-change-in-production" expire_hour: 24 websocket: @@ -459,7 +460,7 @@ load_binary_args() { done < "$BINARY_ARGS_FILE" fi if [ ${#_out[@]} -eq 0 ]; then - _out=(--port 8080 --db-driver sqlite) + _out=(--mode local --port 8080) fi } @@ -645,7 +646,8 @@ cmd_build() { info "使用方法:" echo " ./run.sh binary upgrade # 停服重编译并后台启动" echo " ./$BACKEND_DIR/$STANDALONE_BIN --port 8080 # 前台启动" - echo " ./$BACKEND_DIR/$STANDALONE_BIN --config config.yaml # 使用配置文件" + echo " ./$BACKEND_DIR/$STANDALONE_BIN --mode local # 本地模式 (SQLite + redka)" + echo " ./$BACKEND_DIR/$STANDALONE_BIN --config config.yaml # 使用配置文件" ;; agent) banner "========== 编译 Agent ==========" @@ -759,11 +761,11 @@ cmd_binary() { ;; help|--help|-h) echo "独立二进制命令:" - echo " ./run.sh binary upgrade [--port 8080 --db-driver sqlite] 停服→清旧→重编译→启动" + echo " ./run.sh binary upgrade [--port 8080] 停服→清旧→重编译→启动 (默认 --mode local)" echo " ./run.sh binary start [args...] 后台启动(参数会持久化)" echo " ./run.sh binary stop [port] 停止进程" echo " ./run.sh binary status 查看状态" - echo " ./run.sh binary [--port 8080 ...] 前台运行(开发调试)" + echo " ./run.sh binary [--mode local --port 8080 ...] 前台运行 (SQLite + redka)" ;; run|*) cd "$SCRIPT_DIR/$BACKEND_DIR"