Files
breakpilot-lehrer/edu-search-service/internal/config/config.go
Benjamin Boenisch 414e0f5ec0
All checks were successful
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-school (push) Successful in 28s
CI / test-go-edu-search (push) Successful in 27s
CI / test-python-klausur (push) Successful in 1m45s
CI / test-python-agent-core (push) Successful in 16s
CI / test-nodejs-website (push) Successful in 21s
feat: edu-search-service migriert, voice-service/geo-service entfernt
- edu-search-service von breakpilot-pwa nach breakpilot-lehrer kopiert (ohne vendor)
- opensearch + edu-search-service in docker-compose.yml hinzugefuegt
- voice-service aus docker-compose.yml entfernt (jetzt in breakpilot-core)
- geo-service aus docker-compose.yml entfernt (nicht mehr benoetigt)
- CI/CD: edu-search-service zu Gitea Actions und Woodpecker hinzugefuegt
  (Go lint, test mit go mod download, build, SBOM)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 18:36:38 +01:00

128 lines
3.9 KiB
Go

package config
import (
"os"
"strconv"
)
type Config struct {
// Server
Port string
// OpenSearch
OpenSearchURL string
OpenSearchUsername string
OpenSearchPassword string
IndexName string
// Crawler
UserAgent string
RateLimitPerSec float64
MaxDepth int
MaxPagesPerRun int
// Paths
SeedsDir string
RulesDir string
// API
APIKey string
// Backend Integration
BackendURL string // URL to Python Backend for Seeds API
SeedsFromAPI bool // If true, fetch seeds from API instead of files
// Embedding/Semantic Search
EmbeddingProvider string // "openai", "ollama", or "none"
OpenAIAPIKey string // API Key for OpenAI embeddings
EmbeddingModel string // Model name (e.g., "text-embedding-3-small")
EmbeddingDimension int // Vector dimension (1536 for OpenAI small)
OllamaURL string // Ollama base URL for local embeddings
SemanticSearchEnabled bool // Enable semantic search features
// Scheduler
SchedulerEnabled bool // Enable automatic crawl scheduling
SchedulerInterval string // Crawl interval (e.g., "24h", "168h" for weekly)
// PostgreSQL (for Staff/Publications database)
DBHost string
DBPort string
DBUser string
DBPassword string
DBName string
DBSSLMode string
// Staff Crawler
StaffCrawlerEmail string // Contact email for CrossRef polite pool
}
func Load() *Config {
return &Config{
Port: getEnv("PORT", "8084"),
OpenSearchURL: getEnv("OPENSEARCH_URL", "http://opensearch:9200"),
OpenSearchUsername: getEnv("OPENSEARCH_USERNAME", "admin"),
OpenSearchPassword: getEnv("OPENSEARCH_PASSWORD", "admin"),
IndexName: getEnv("INDEX_NAME", "bp_documents_v1"),
UserAgent: getEnv("USER_AGENT", "BreakpilotEduCrawler/1.0 (+contact: security@breakpilot.com)"),
RateLimitPerSec: getEnvFloat("RATE_LIMIT_PER_SEC", 0.2),
MaxDepth: getEnvInt("MAX_DEPTH", 4),
MaxPagesPerRun: getEnvInt("MAX_PAGES_PER_RUN", 500),
SeedsDir: getEnv("SEEDS_DIR", "./seeds"),
RulesDir: getEnv("RULES_DIR", "./rules"),
APIKey: getEnv("EDU_SEARCH_API_KEY", ""),
BackendURL: getEnv("BACKEND_URL", "http://backend:8000"),
SeedsFromAPI: getEnvBool("SEEDS_FROM_API", true),
// Embedding/Semantic Search
EmbeddingProvider: getEnv("EMBEDDING_PROVIDER", "none"), // "openai", "ollama", or "none"
OpenAIAPIKey: getEnv("OPENAI_API_KEY", ""),
EmbeddingModel: getEnv("EMBEDDING_MODEL", "text-embedding-3-small"),
EmbeddingDimension: getEnvInt("EMBEDDING_DIMENSION", 1536),
OllamaURL: getEnv("OLLAMA_URL", "http://ollama:11434"),
SemanticSearchEnabled: getEnvBool("SEMANTIC_SEARCH_ENABLED", false),
// Scheduler
SchedulerEnabled: getEnvBool("SCHEDULER_ENABLED", false),
SchedulerInterval: getEnv("SCHEDULER_INTERVAL", "24h"),
// PostgreSQL
DBHost: getEnv("DB_HOST", "postgres"),
DBPort: getEnv("DB_PORT", "5432"),
DBUser: getEnv("DB_USER", "postgres"),
DBPassword: getEnv("DB_PASSWORD", "postgres"),
DBName: getEnv("DB_NAME", "breakpilot"),
DBSSLMode: getEnv("DB_SSLMODE", "disable"),
// Staff Crawler
StaffCrawlerEmail: getEnv("STAFF_CRAWLER_EMAIL", "crawler@breakpilot.de"),
}
}
func getEnvBool(key string, fallback bool) bool {
if value := os.Getenv(key); value != "" {
return value == "true" || value == "1" || value == "yes"
}
return fallback
}
func getEnv(key, fallback string) string {
if value := os.Getenv(key); value != "" {
return value
}
return fallback
}
func getEnvInt(key string, fallback int) int {
if value := os.Getenv(key); value != "" {
if i, err := strconv.Atoi(value); err == nil {
return i
}
}
return fallback
}
func getEnvFloat(key string, fallback float64) float64 {
if value := os.Getenv(key); value != "" {
if f, err := strconv.ParseFloat(value, 64); err == nil {
return f
}
}
return fallback
}