fix(rag): 全文索引在容器里根本没持久化 —— 补 /data 卷 + BLEVE_PATH #8
@@ -132,7 +132,7 @@ export function TaskDetailDrawer({ task, onClose }: { task: AdminTask; onClose:
|
||||
text={
|
||||
task.status === "running" || task.status === "submitted"
|
||||
? "任务还在跑,轨迹要等收尾才落库(这里是复盘视图,不是实时流)"
|
||||
: "这次运行没有留下轨迹(可能早于轨迹落库功能上线)"
|
||||
: "这次运行没有留下轨迹(早于轨迹落库功能上线,或收尾时落库失败——后者会在 gateway 日志里有 [task] 告警)"
|
||||
}
|
||||
/>
|
||||
) : (
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -382,7 +383,6 @@ func (h *Handler) AdminSetTenantStatus(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, gin.H{"status": "ok"})
|
||||
}
|
||||
|
||||
|
||||
// AdminMembers: GET /api/v1/admin/tenants/:id/members —— 某租户成员列表。
|
||||
func (h *Handler) AdminMembers(c *gin.Context) {
|
||||
rows, err := h.db.ListMembers(c.Request.Context(), c.Param("id"))
|
||||
@@ -564,7 +564,11 @@ func (h *Handler) TestModel(c *gin.Context) {
|
||||
func (h *Handler) broadcastActive(ctx context.Context) {
|
||||
for _, kind := range []string{contract.ConfigKindChat, contract.ConfigKindEmbedding} {
|
||||
if cfg := h.db.ActiveConfig(ctx, kind); cfg != nil {
|
||||
_ = h.bus.PublishConfigUpdated(kind, cfg)
|
||||
// 广播失败 = dispatcher/mcp-go 拿不到新配置,症状是"控制台改了模型却不生效",
|
||||
// 而改配置的人这边一切正常。必须留痕,否则只能靠猜。
|
||||
if err := h.bus.PublishConfigUpdated(kind, cfg); err != nil {
|
||||
log.Printf("[admin] ⚠️ %s 配置广播失败: %v(dispatcher/mcp-go 仍在用旧配置,需重启或重试保存)", kind, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,11 +16,11 @@ import (
|
||||
"github.com/gin-contrib/sse"
|
||||
"github.com/gin-gonic/gin"
|
||||
|
||||
"github.com/sundynix/sundynix-shared/blob"
|
||||
"github.com/sundynix/sundynix-gateway/internal/dsl"
|
||||
"github.com/sundynix/sundynix-gateway/internal/nats"
|
||||
"github.com/sundynix/sundynix-gateway/internal/payment"
|
||||
"github.com/sundynix/sundynix-gateway/internal/store"
|
||||
"github.com/sundynix/sundynix-shared/blob"
|
||||
"github.com/sundynix/sundynix-shared/contract"
|
||||
)
|
||||
|
||||
@@ -139,7 +139,11 @@ func (h *Handler) startTokenRecorder(taskID string) {
|
||||
func() {
|
||||
_ = h.cache.StreamAppend(ctx, store.ChannelToken, taskID, "done", "")
|
||||
if out.Len() > 0 {
|
||||
_ = h.db.SaveTaskOutput(context.Background(), taskID, out.String())
|
||||
// 失败必须出声:这是**唯一**的持久副本(Redis 流 10min 后就没了),
|
||||
// 丢了就再也复盘不了,界面上只会显示"这次运行没有输出"。
|
||||
if err := h.db.SaveTaskOutput(context.Background(), taskID, out.String()); err != nil {
|
||||
log.Printf("[task] ⚠️ 输出落库失败 task=%s len=%d: %v(该次运行将无法复盘)", taskID, out.Len(), err)
|
||||
}
|
||||
}
|
||||
cancel()
|
||||
},
|
||||
@@ -170,8 +174,12 @@ func (h *Handler) startExecRecorder(taskID string) {
|
||||
func() {
|
||||
_ = h.cache.StreamAppend(ctx, store.ChannelExec, taskID, "done", "")
|
||||
if len(evs) > 0 {
|
||||
if b, err := json.Marshal(evs); err == nil {
|
||||
_ = h.db.SaveTaskTrace(context.Background(), taskID, string(b))
|
||||
// 同上:轨迹只有这一份持久副本,静默失败会表现为"这次运行没有轨迹"。
|
||||
b, err := json.Marshal(evs)
|
||||
if err != nil {
|
||||
log.Printf("[task] ⚠️ 轨迹序列化失败 task=%s events=%d: %v(轨迹将丢失)", taskID, len(evs), err)
|
||||
} else if err := h.db.SaveTaskTrace(context.Background(), taskID, string(b)); err != nil {
|
||||
log.Printf("[task] ⚠️ 轨迹落库失败 task=%s events=%d: %v(该次运行将无法复盘)", taskID, len(evs), err)
|
||||
}
|
||||
}
|
||||
cancel()
|
||||
|
||||
@@ -2,6 +2,7 @@ package middleware
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
@@ -35,6 +36,10 @@ func Audit(db *store.Postgres) gin.HandlerFunc {
|
||||
}
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
||||
defer cancel()
|
||||
_ = db.AppendAudit(ctx, entry)
|
||||
// best-effort:审计失败不阻断主流程(业务已经做完了),但必须留痕 ——
|
||||
// 静默失败意味着敏感操作没有记录,而没人知道记录缺了。
|
||||
if err := db.AppendAudit(ctx, entry); err != nil {
|
||||
log.Printf("[audit] ⚠️ 审计留痕写入失败 actor=%s %s %s: %v", entry.Actor, entry.Action, entry.Path, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user