config.go raw

   1  package main
   2  
   3  import (
   4  	"os"
   5  	"path/filepath"
   6  	"time"
   7  
   8  	"go-simpler.org/env"
   9  	"next.orly.dev/pkg/lol/chk"
  10  	"next.orly.dev/pkg/lol/log"
  11  )
  12  
  13  // Config holds the database server configuration.
  14  type Config struct {
  15  	// Listen is the gRPC server listen address
  16  	Listen string `env:"ORLY_DB_LISTEN" default:"127.0.0.1:50051" usage:"gRPC server listen address"`
  17  
  18  	// DataDir is the database data directory
  19  	DataDir string `env:"ORLY_DATA_DIR" usage:"database data directory"`
  20  
  21  	// LogLevel is the logging level
  22  	LogLevel string `env:"ORLY_DB_LOG_LEVEL" default:"info" usage:"log level (trace, debug, info, warn, error)"`
  23  
  24  	// Badger configuration
  25  	BlockCacheMB int `env:"ORLY_DB_BLOCK_CACHE_MB" default:"1024" usage:"block cache size in MB"`
  26  	IndexCacheMB int `env:"ORLY_DB_INDEX_CACHE_MB" default:"512" usage:"index cache size in MB"`
  27  	ZSTDLevel    int `env:"ORLY_DB_ZSTD_LEVEL" default:"3" usage:"ZSTD compression level (1-19)"`
  28  
  29  	// Query cache configuration
  30  	QueryCacheSizeMB   int           `env:"ORLY_DB_QUERY_CACHE_SIZE_MB" default:"256" usage:"query cache size in MB"`
  31  	QueryCacheMaxAge   time.Duration `env:"ORLY_DB_QUERY_CACHE_MAX_AGE" default:"5m" usage:"query cache max age"`
  32  	QueryCacheDisabled bool          `env:"ORLY_DB_QUERY_CACHE_DISABLED" default:"false" usage:"disable query cache"`
  33  
  34  	// Serial cache configuration
  35  	SerialCachePubkeys  int `env:"ORLY_SERIAL_CACHE_PUBKEYS" default:"100000" usage:"serial cache pubkeys capacity"`
  36  	SerialCacheEventIds int `env:"ORLY_SERIAL_CACHE_EVENT_IDS" default:"500000" usage:"serial cache event IDs capacity"`
  37  
  38  	// gRPC server configuration
  39  	MaxConcurrentQueries int `env:"ORLY_DB_MAX_CONCURRENT_QUERIES" default:"3" usage:"max concurrent queries"`
  40  	StreamBatchSize      int `env:"ORLY_DB_STREAM_BATCH_SIZE" default:"100" usage:"events per stream batch"`
  41  }
  42  
  43  // loadConfig loads configuration from environment variables.
  44  func loadConfig() *Config {
  45  	cfg := &Config{}
  46  	if err := env.Load(cfg, nil); chk.E(err) {
  47  		log.E.F("failed to load config: %v", err)
  48  		os.Exit(1)
  49  	}
  50  
  51  	// Set default data directory if not specified
  52  	if cfg.DataDir == "" {
  53  		home, err := os.UserHomeDir()
  54  		if chk.E(err) {
  55  			log.E.F("failed to get home directory: %v", err)
  56  			os.Exit(1)
  57  		}
  58  		cfg.DataDir = filepath.Join(home, ".local", "share", "ORLY")
  59  	}
  60  
  61  	// Ensure data directory exists
  62  	if err := os.MkdirAll(cfg.DataDir, 0700); chk.E(err) {
  63  		log.E.F("failed to create data directory %s: %v", cfg.DataDir, err)
  64  		os.Exit(1)
  65  	}
  66  
  67  	return cfg
  68  }
  69