Freigabe-Anpassung und Soft-Trash
release-tag / release-image (push) Successful in 1m34s

This commit is contained in:
2026-07-29 11:08:03 +02:00
parent a33ff09c41
commit dc369dab65
14 changed files with 1233 additions and 122 deletions
+29 -23
View File
@@ -39,7 +39,11 @@ func main() {
log.Fatalf("initialize store: %v", err)
}
aiService, aiTimeout, err := aiServiceFromEnv(cfg.Mode, s.DataDir())
stagingStore, err := stagingStoreFromEnv(s.DataDir())
if err != nil {
log.Fatal(err)
}
aiService, aiTimeout, err := aiServiceFromEnv(cfg.Mode, stagingStore)
if err != nil {
log.Fatal(err)
}
@@ -62,7 +66,7 @@ func main() {
log.Fatal(err)
}
app := newApp(s, sub, cfg).withAI(aiService)
app := newApp(s, sub, cfg).withStaging(stagingStore).withAI(aiService)
handler := requestLogger(optionalBasicAuth(app.routes()))
writeTimeout := 60 * time.Second
@@ -81,6 +85,7 @@ func main() {
log.Printf("KB service listening on %s", listen)
log.Printf("Mode: %s (writable=%t)", cfg.Mode, cfg.Writable)
log.Printf("Data directory: %s (%d JSON files indexed)", s.DataDir(), s.Count())
log.Printf("Staging directory: %s (%d JSON files)", stagingStore.Dir(), stagingStore.Count())
if reloadInterval > 0 {
log.Printf("Automatic index reload: %s", reloadInterval)
}
@@ -148,7 +153,26 @@ func startAutoReload(s *store.Store, interval time.Duration) {
}
}
func aiServiceFromEnv(mode, dataDir string) (*aifallback.Service, time.Duration, error) {
func stagingStoreFromEnv(dataDir string) (*staging.Store, error) {
stagingDir := strings.TrimSpace(os.Getenv("STAGING_DIR"))
if stagingDir == "" {
stagingDir = filepath.Join(filepath.Dir(dataDir), "staging")
}
stagingAbs, err := filepath.Abs(stagingDir)
if err != nil {
return nil, err
}
dataAbs, err := filepath.Abs(dataDir)
if err != nil {
return nil, err
}
if pathContains(dataAbs, stagingAbs) || pathContains(stagingAbs, dataAbs) {
return nil, fmt.Errorf("STAGING_DIR (%s) must be separate from DATA_DIR (%s)", stagingAbs, dataAbs)
}
return staging.New(stagingAbs)
}
func aiServiceFromEnv(mode string, st *staging.Store) (*aifallback.Service, time.Duration, error) {
enabled, err := envBool("AI_FALLBACK_ENABLED", false)
if err != nil {
return nil, 0, err
@@ -176,26 +200,8 @@ func aiServiceFromEnv(mode, dataDir string) (*aifallback.Service, time.Duration,
if err != nil || minScore < 0 || minScore > 1 {
return nil, 0, fmt.Errorf("OLLAMA_STAGING_MIN_SCORE must be between 0 and 1")
}
stagingDir := strings.TrimSpace(os.Getenv("STAGING_DIR"))
if stagingDir == "" {
stagingDir = filepath.Join(filepath.Dir(dataDir), "staging")
}
stagingAbs, err := filepath.Abs(stagingDir)
if err != nil {
return nil, 0, err
}
dataAbs, err := filepath.Abs(dataDir)
if err != nil {
return nil, 0, err
}
if pathContains(dataAbs, stagingAbs) || pathContains(stagingAbs, dataAbs) {
return nil, 0, fmt.Errorf("STAGING_DIR (%s) must be separate from DATA_DIR (%s)", stagingAbs, dataAbs)
}
st, err := staging.New(stagingAbs)
if err != nil {
return nil, 0, err
if st == nil {
return nil, 0, fmt.Errorf("staging store is required for AI fallback")
}
svc, err := aifallback.New(aifallback.Config{
BaseURL: envOr("OLLAMA_BASE_URL", "http://ollama:11434"),