config.go 932 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package config
  2. import (
  3. "crypto/rand"
  4. "encoding/hex"
  5. "log/slog"
  6. "os"
  7. )
  8. type Config struct {
  9. Port string
  10. DBPath string
  11. SessionSecret string
  12. FrontendDir string
  13. }
  14. func Load() Config {
  15. c := Config{
  16. Port: envOr("GOFLARE_PORT", ":42069"),
  17. DBPath: envOr("GOFLARE_DB_PATH", "goflare.db"),
  18. SessionSecret: os.Getenv("GOFLARE_SESSION_SECRET"),
  19. FrontendDir: envOr("GOFLARE_FRONTEND_DIR", "frontend/dist"),
  20. }
  21. if c.SessionSecret == "" {
  22. c.SessionSecret = randomHex(32)
  23. slog.Warn("GOFLARE_SESSION_SECRET not set, using random value (sessions won't survive restarts)")
  24. }
  25. return c
  26. }
  27. func envOr(key, fallback string) string {
  28. if v := os.Getenv(key); v != "" {
  29. return v
  30. }
  31. return fallback
  32. }
  33. func randomHex(n int) string {
  34. b := make([]byte, n)
  35. _, err := rand.Read(b)
  36. if err != nil {
  37. panic("failed to generate random bytes: " + err.Error())
  38. }
  39. return hex.EncodeToString(b)
  40. }