From 249ba3d4aa015508d33129f5b7e36124dba46876 Mon Sep 17 00:00:00 2001 From: Connor <963408438@qq.com> Date: Fri, 16 Jan 2026 10:30:59 +0800 Subject: [PATCH] =?UTF-8?q?-=20SQLite=20=E7=BA=AF=20Go=20=E9=A9=B1?= =?UTF-8?q?=E5=8A=A8=EF=BC=88`modernc.org/sqlite`=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20`CGO=5FENABLED=3D0`=20=E8=B7=A8=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E7=BC=96=E8=AF=91=20-=20=E4=BC=98=E5=8C=96=E5=B9=B6?= =?UTF-8?q?=E5=8F=91=E6=80=A7=E8=83=BD=EF=BC=88WAL=20=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=EF=BC=89=EF=BC=8C=E8=A7=A3=E5=86=B3=20"database=20is=20locked"?= =?UTF-8?q?=20=E9=94=99=E8=AF=AF=20-=20Docker=20=E8=B7=A8=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E6=94=AF=E6=8C=81=20`host.docker.internal`=20?= =?UTF-8?q?=E8=AE=BF=E9=97=AE=E5=AE=BF=E4=B8=BB=E6=9C=BA=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=20-=20=E7=B2=BE=E7=AE=80=E6=96=87=E6=A1=A3=E5=92=8C=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DOCKER_HOST_ACCESS.md | 79 +++++++++ Dockerfile | 14 +- README.md | 256 +++++----------------------- docker-compose.yml | 5 + go.mod | 24 +-- go.sum | 67 +++++--- infrastructure/database/database.go | 19 ++- 7 files changed, 203 insertions(+), 261 deletions(-) create mode 100644 DOCKER_HOST_ACCESS.md diff --git a/DOCKER_HOST_ACCESS.md b/DOCKER_HOST_ACCESS.md new file mode 100644 index 0000000..3368f84 --- /dev/null +++ b/DOCKER_HOST_ACCESS.md @@ -0,0 +1,79 @@ +# Docker 容器访问宿主机服务指南 + +## 核心配置 + +Docker 容器内使用 `http://host.docker.internal:端口号` 访问宿主机服务。 + +### macOS / Windows + +直接使用,无需额外配置。 + +### Linux + +**docker-compose** - 已在 `docker-compose.yml` 配置: +```yaml +extra_hosts: + - "host.docker.internal:host-gateway" +``` + +**docker run** - 需添加参数: +```bash +docker run --add-host=host.docker.internal:host-gateway ... +``` + +## Ollama 配置示例 + +### 1. 宿主机启动服务 + +```bash +# 监听所有接口(重要) +export OLLAMA_HOST=0.0.0.0:11434 +ollama serve +``` + +### 2. 前端 AI 服务配置 + +| 字段 | 值 | +|------|-----| +| Base URL | `http://host.docker.internal:11434/v1` | +| Provider | `openai` | +| Model | `qwen2.5:latest` | +| API Key | `ollama` 或留空 | + +### 3. 其他服务端口 + +| 服务 | 默认端口 | Base URL | +|------|---------|----------| +| Ollama | 11434 | `http://host.docker.internal:11434/v1` | +| LM Studio | 1234 | `http://host.docker.internal:1234/v1` | +| vLLM | 8000 | `http://host.docker.internal:8000/v1` | + +## 验证和故障排查 + +### 测试连接 + +```bash +# 进入容器测试 +docker exec -it huobao-drama sh +wget -O- http://host.docker.internal:11434/api/tags + +# 查看容器日志 +docker logs huobao-drama -f +``` + +### 常见问题 + +**Connection refused** + +1. **宿主机服务未运行** - 检查服务状态 + ```bash + curl http://localhost:11434/api/tags + ``` + +2. **服务未监听 0.0.0.0** - Ollama 默认只监听 127.0.0.1 + ```bash + export OLLAMA_HOST=0.0.0.0:11434 + ollama serve + ``` + +3. **防火墙阻止** - 检查防火墙规则或临时关闭测试 diff --git a/Dockerfile b/Dockerfile index 8d03e94..aa9390b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,17 +24,14 @@ RUN npm run build FROM golang:1.23-alpine AS backend-builder # 配置 Go 代理(国内镜像加速) -ENV GOPROXY=https://goproxy.cn,direct \ +ENV GOPROXY=https://goproxy.cn,direct \ GO111MODULE=on -# 安装必要的构建工具(包括 gcc、musl-dev 和 sqlite-dev 用于 CGO) +# 安装必要的构建工具(纯 Go 编译,无需 CGO) RUN apk add --no-cache \ git \ ca-certificates \ - tzdata \ - gcc \ - musl-dev \ - sqlite-dev + tzdata WORKDIR /app @@ -50,8 +47,8 @@ COPY . . # 复制前端构建产物 COPY --from=frontend-builder /app/web/dist ./web/dist -# 构建后端可执行文件(启用 CGO 以支持 go-sqlite3) -RUN CGO_ENABLED=1 go build -ldflags="-w -s" -o huobao-drama . +# 构建后端可执行文件(纯 Go 编译,使用 modernc.org/sqlite) +RUN CGO_ENABLED=0 go build -ldflags="-w -s" -o huobao-drama . # ==================== 阶段3: 运行时镜像 ==================== FROM alpine:latest @@ -61,7 +58,6 @@ RUN apk add --no-cache \ ca-certificates \ tzdata \ ffmpeg \ - sqlite-libs \ wget \ && rm -rf /var/cache/apk/* diff --git a/README.md b/README.md index 0df6f48..c20a06c 100644 --- a/README.md +++ b/README.md @@ -230,25 +230,10 @@ go run main.go ### 🐳 Docker 部署(推荐) -使用 Docker 部署是最简单快捷的方式,已内置默认配置,开箱即用。 - -#### 快速体验(推荐新手) +#### 方式一:Docker Compose(推荐) ```bash -# 从 Docker Hub 拉取并运行 -docker run -d \ - --name huobao-drama \ - -p 5678:5678 \ - --restart unless-stopped \ - huobao/huobao-drama:latest -``` - -访问: `http://localhost:5678` 即可开始使用! - -#### 方式一:使用 Docker Compose - -```bash -# 启动服务(使用内置配置) +# 启动服务 docker-compose up -d # 查看日志 @@ -258,66 +243,27 @@ docker-compose logs -f docker-compose down ``` -**自定义配置**(可选): -```bash -# 1. 取消 docker-compose.yml 中配置文件挂载的注释 -# 2. 复制并修改配置文件 -cp configs/config.example.yaml configs/config.yaml -vim configs/config.yaml - -# 3. 重启服务 -docker-compose up -d -``` - -#### 方式二:使用 Docker 命令 - -**基础启动**(使用内置配置): +#### 方式二:Docker 命令 + +> **注意**:Linux 用户需添加 `--add-host=host.docker.internal:host-gateway` 以访问宿主机服务 + ```bash +# 从 Docker Hub 运行 docker run -d \ --name huobao-drama \ -p 5678:5678 \ -v $(pwd)/data:/app/data \ --restart unless-stopped \ huobao/huobao-drama:latest -``` -**自定义配置启动**: -```bash -# 挂载自定义配置文件 -docker run -d \ - --name huobao-drama \ - -p 5678:5678 \ - -v $(pwd)/data:/app/data \ - -v $(pwd)/configs/config.yaml:/app/configs/config.yaml:ro \ - --restart unless-stopped \ - huobao/huobao-drama:latest -``` - -**查看日志**: -```bash +# 查看日志 docker logs -f huobao-drama ``` -#### 方式三:本地构建镜像 - +**本地构建**(可选): ```bash -# 1. 构建镜像 docker build -t huobao-drama:latest . - -# 2. 运行容器 -docker run -d \ - --name huobao-drama \ - -p 5678:5678 \ - -v $(pwd)/data:/app/data \ - --restart unless-stopped \ - huobao-drama:latest -``` - -#### 镜像仓库 - -**Docker Hub**(国际): -```bash -docker pull huobao/huobao-drama:latest +docker run -d --name huobao-drama -p 5678:5678 -v $(pwd)/data:/app/data huobao-drama:latest ``` **Docker 部署优势:** @@ -328,24 +274,21 @@ docker pull huobao/huobao-drama:latest - ✅ 自动健康检查和重启 - ✅ 自动处理文件权限,无需手动配置 -**📝 数据持久化说明:** +#### 🔗 访问宿主机服务(Ollama/本地模型) -Docker 部署使用命名卷 `huobao-data` 存储数据库和上传文件: -- 数据会自动持久化,重启容器不会丢失 -- 容器内 `app` 用户自动拥有完整读写权限 -- 无需担心传统部署中的权限问题 +容器已配置支持访问宿主机服务,直接使用 `http://host.docker.internal:端口号` 即可。 -如需备份数据: -```bash -# 查看卷位置 -docker volume inspect huobao-drama_huobao-data +**配置步骤:** -# 备份数据 -docker run --rm -v huobao-drama_huobao-data:/data -v $(pwd):/backup alpine tar czf /backup/huobao-data-backup.tar.gz -C /data . +1. **宿主机启动服务(监听所有接口)** + ```bash + export OLLAMA_HOST=0.0.0.0:11434 && ollama serve + ``` -# 恢复数据 -docker run --rm -v huobao-drama_huobao-data:/data -v $(pwd):/backup alpine tar xzf /backup/huobao-data-backup.tar.gz -C /data -``` +2. **前端 AI 服务配置** + - Base URL: `http://host.docker.internal:11434/v1` + - Provider: `openai` + - Model: `qwen2.5:latest` --- @@ -491,130 +434,6 @@ server { --- -## 🔧 开发指南 - -### 添加新功能 - -#### 1. 添加API接口 - -```bash -# 创建Handler -vim api/handlers/your_handler.go - -# 注册路由 -vim api/routes/routes.go -``` - -示例: -```go -// api/handlers/your_handler.go -func (h *YourHandler) YourMethod(c *gin.Context) { - // 处理逻辑 - response.Success(c, data) -} - -// api/routes/routes.go -your := api.Group("/your") -{ - your.GET("", yourHandler.List) - your.POST("", yourHandler.Create) -} -``` - -#### 2. 添加业务服务 - -```go -// application/services/your_service.go -type YourService struct { - db *gorm.DB - log *logger.Logger -} - -func NewYourService(db *gorm.DB, log *logger.Logger) *YourService { - return &YourService{db: db, log: log} -} - -func (s *YourService) YourMethod() error { - // 业务逻辑 - return nil -} -``` - -#### 3. 添加前端页面 - -```bash -# 创建页面组件 -vim web/src/views/YourPage.vue - -# 注册路由 -vim web/src/router/index.ts - -# 添加API调用 -vim web/src/api/your-api.ts -``` - -### 调试技巧 - -**后端调试:** -```bash -# 启用详细日志 -export LOG_LEVEL=debug -go run main.go - -# 使用dlv调试器 -dlv debug main.go -``` - -**前端调试:** -```bash -cd web -npm run dev -# 打开浏览器 DevTools -``` - -**数据库查询:** -```bash -sqlite3 data/drama_generator.db -.tables -.schema dramas -SELECT * FROM dramas; -``` - ---- - -## 🛠️ 常用命令 - -```bash -# 开发模式 -go run main.go # 启动后端服务 -cd web && npm run dev # 启动前端开发服务器 - -# 编译构建 -cd web && npm run build && cd .. # 构建前端 -go build -o huobao-drama . # 编译后端 - -# 依赖管理 -go mod download # 下载Go依赖 -go mod tidy # 清理Go依赖 -cd web && npm install && cd .. # 安装前端依赖 - -# 代码检查 -go fmt ./... # 格式化代码 -go vet ./... # 代码检查 -cd web && npm run lint && cd .. # 前端代码检查 - -# 清理 -go clean # 清理Go构建缓存 -rm -rf web/dist # 清理前端构建产物 -rm -f huobao-drama # 删除可执行文件 - -# 测试 -go test ./... # 运行Go测试 -cd web && npm run test && cd .. # 运行前端测试 -``` - ---- - ## 🎨 技术栈 ### 后端技术 @@ -624,7 +443,7 @@ cd web && npm run test && cd .. # 运行前端测试 - **数据库**: SQLite - **日志**: Zap - **视频处理**: FFmpeg -- **AI服务**: 豆包 Doubao API +- **AI服务**: OpenAI、Gemini、火山等 ### 前端技术 - **框架**: Vue 3.4+ @@ -644,6 +463,13 @@ cd web && npm run test && cd .. # 运行前端测试 ## 📝 常见问题 +### Q: Docker 容器如何访问宿主机的 Ollama? +A: 使用 `http://host.docker.internal:11434/v1` 作为 Base URL。注意两点: +1. 宿主机 Ollama 需监听 `0.0.0.0`:`export OLLAMA_HOST=0.0.0.0:11434 && ollama serve` +2. Linux 用户使用 `docker run` 需添加:`--add-host=host.docker.internal:host-gateway` + +详见:[DOCKER_HOST_ACCESS.md](docs/DOCKER_HOST_ACCESS.md) + ### Q: FFmpeg未安装或找不到? A: 确保FFmpeg已安装并在PATH环境变量中。运行 `ffmpeg -version` 验证。 @@ -657,20 +483,20 @@ A: GORM会在首次启动时自动创建表,检查日志确认迁移是否成 ## � 更新日志 / Changelog +### v1.0.2 (2026-01-16) + +#### 🚀 重大更新 +- SQLite 纯 Go 驱动(`modernc.org/sqlite`),支持 `CGO_ENABLED=0` 跨平台编译 +- 优化并发性能(WAL 模式),解决 "database is locked" 错误 +- Docker 跨平台支持 `host.docker.internal` 访问宿主机服务 +- 精简文档和部署指南 + ### v1.0.1 (2026-01-14) -#### 🐛 Bug Fixes / 问题修复 -- 修复 视频生成 API 响应解析问题 -- 修复视频生成客户端选择逻辑 - -#### ✨ Features / 新增功能 -- 添加 OpenAI Sora 视频端点配置(/videos 和 /videos/{taskId}) -- 优化错误处理,支持 JSON 对象和字符串格式的错误响应 - -#### 🔧 Improvements / 改进 -- 完善视频生成服务的 provider 识别 -- 优化客户端请求格式(支持 Sora/Doubao 模型) -- 改进日志输出,便于调试 +#### 🐛 Bug Fixes / 🔧 Improvements +- 修复视频生成 API 响应解析问题 +- 添加 OpenAI Sora 视频端点配置 +- 优化错误处理和日志输出 --- diff --git a/docker-compose.yml b/docker-compose.yml index b7ecdf2..1610fc8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,6 +16,11 @@ services: # 例如:- ./data:/app/data (需要 chmod 777 ./data) environment: - TZ=Asia/Shanghai + # 访问宿主机服务说明: + # 使用 host.docker.internal 代替 127.0.0.1 + # 例如:http://host.docker.internal:11434 (Ollama) + extra_hosts: + - "host.docker.internal:host-gateway" # 统一支持所有平台 restart: unless-stopped healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5678/health"] diff --git a/go.mod b/go.mod index 7d91b00..07052f7 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.23.0 require ( github.com/gin-gonic/gin v1.9.1 github.com/google/uuid v1.6.0 - github.com/minio/minio-go/v7 v7.0.97 github.com/robfig/cron/v3 v3.0.1 github.com/spf13/viper v1.17.0 go.uber.org/zap v1.26.0 @@ -13,6 +12,7 @@ require ( gorm.io/driver/mysql v1.5.2 gorm.io/driver/sqlite v1.6.0 gorm.io/gorm v1.30.0 + modernc.org/sqlite v1.34.4 ) require ( @@ -22,50 +22,52 @@ require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-ini/ini v1.67.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.14.0 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/goccy/go-json v0.10.2 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.2.11 // indirect - github.com/klauspost/crc32 v1.3.0 // indirect 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-isatty v0.0.20 // indirect github.com/mattn/go-sqlite3 v1.14.22 // indirect - github.com/minio/crc64nvme v1.1.0 // indirect - github.com/minio/md5-simd v1.1.2 // 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/ncruces/go-strftime v0.1.9 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect - github.com/philhofer/fwd v1.2.0 // indirect - github.com/rs/xid v1.6.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/sagikazarmark/locafero v0.3.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.10.0 // indirect github.com/spf13/cast v1.5.1 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/testify v1.9.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/tinylib/msgp v1.3.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect go.uber.org/goleak v1.2.1 // indirect go.uber.org/multierr v1.10.0 // indirect golang.org/x/arch v0.3.0 // indirect golang.org/x/crypto v0.36.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 // indirect golang.org/x/net v0.38.0 // indirect golang.org/x/sys v0.34.0 // indirect golang.org/x/text v0.26.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect + modernc.org/libc v1.55.3 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.8.0 // indirect + modernc.org/strutil v1.2.0 // indirect + modernc.org/token v1.1.0 // indirect ) diff --git a/go.sum b/go.sum index 437b3cf..e4e8281 100644 --- a/go.sum +++ b/go.sum @@ -77,8 +77,6 @@ github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SU github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= -github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -149,6 +147,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -158,6 +158,8 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -177,14 +179,9 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -github.com/klauspost/crc32 v1.3.0 h1:sSmTt3gUt81RP655XGZPElI0PelVTZ6YwCRnPSupoFM= -github.com/klauspost/crc32 v1.3.0/go.mod h1:D7kQaZhnkX/Y0tstFGf8VUzv2UofNGqCjnC3zdHB0Hw= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -197,18 +194,12 @@ github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE= github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ= -github.com/minio/crc64nvme v1.1.0 h1:e/tAguZ+4cw32D+IO/8GSf5UVr9y+3eJcxZI2WOO/7Q= -github.com/minio/crc64nvme v1.1.0/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= -github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.97 h1:lqhREPyfgHTB/ciX8k2r8k0D93WaFqxbJX36UZq5occ= -github.com/minio/minio-go/v7 v7.0.97/go.mod h1:re5VXuo0pwEtoNLsNuSr0RrLfT/MBtohwdaSmPPSRSk= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -216,23 +207,23 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= -github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +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/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 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/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= -github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ= github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= @@ -263,8 +254,6 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.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/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= -github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= @@ -307,8 +296,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 h1:mchzmB1XO2pMaKFRqk/+MV3mgGG96aqaPXaMifQU47w= +golang.org/x/exp v0.0.0-20231108232855-2478ac86f678/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -332,6 +321,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -385,6 +376,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -485,6 +478,8 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= +golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -611,6 +606,32 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ= +modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= +modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y= +modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s= +modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= +modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw= +modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U= +modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= +modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= +modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= +modernc.org/sqlite v1.34.4 h1:sjdARozcL5KJBvYQvLlZEmctRgW9xqIZc2ncN7PU0P8= +modernc.org/sqlite v1.34.4/go.mod h1:3QQFCG2SEMtc2nv+Wq4cQCH7Hjcg+p/RMlS1XK+zwbk= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/infrastructure/database/database.go b/infrastructure/database/database.go index bd29d06..87c9d9a 100644 --- a/infrastructure/database/database.go +++ b/infrastructure/database/database.go @@ -11,6 +11,7 @@ import ( "gorm.io/driver/mysql" "gorm.io/driver/sqlite" "gorm.io/gorm" + _ "modernc.org/sqlite" ) func NewDatabase(cfg config.DatabaseConfig) (*gorm.DB, error) { @@ -31,7 +32,13 @@ func NewDatabase(cfg config.DatabaseConfig) (*gorm.DB, error) { var err error if cfg.Type == "sqlite" { - db, err = gorm.Open(sqlite.Open(dsn), gormConfig) + // 使用 modernc.org/sqlite 纯 Go 驱动(无需 CGO) + // 添加并发优化参数:WAL 模式、busy_timeout、cache + dsnWithParams := dsn + "?_journal_mode=WAL&_busy_timeout=5000&_synchronous=NORMAL&cache=shared" + db, err = gorm.Open(sqlite.Dialector{ + DriverName: "sqlite", + DSN: dsnWithParams, + }, gormConfig) } else { db, err = gorm.Open(mysql.Open(dsn), gormConfig) } @@ -45,8 +52,14 @@ func NewDatabase(cfg config.DatabaseConfig) (*gorm.DB, error) { return nil, fmt.Errorf("failed to get database instance: %w", err) } - sqlDB.SetMaxIdleConns(cfg.MaxIdle) - sqlDB.SetMaxOpenConns(cfg.MaxOpen) + // SQLite 连接池配置(限制并发连接数) + if cfg.Type == "sqlite" { + sqlDB.SetMaxIdleConns(1) + sqlDB.SetMaxOpenConns(1) // SQLite 单写入,限制为 1 + } else { + sqlDB.SetMaxIdleConns(cfg.MaxIdle) + sqlDB.SetMaxOpenConns(cfg.MaxOpen) + } sqlDB.SetConnMaxLifetime(time.Hour) if err := sqlDB.Ping(); err != nil {