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