forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
1package config 2 3import ( 4 "context" 5 "fmt" 6 "net/url" 7 "time" 8 9 "github.com/sethvargo/go-envconfig" 10) 11 12type CoreConfig struct { 13 CookieSecret string `env:"COOKIE_SECRET, default=00000000000000000000000000000000"` 14 DbPath string `env:"DB_PATH, default=appview.db"` 15 ListenAddr string `env:"LISTEN_ADDR, default=0.0.0.0:3000"` 16 AppviewHost string `env:"APPVIEW_HOST, default=https://tangled.sh"` 17 Dev bool `env:"DEV, default=false"` 18 DisallowedNicknamesFile string `env:"DISALLOWED_NICKNAMES_FILE"` 19 20 // temporarily, to add users to default spindle 21 AppPassword string `env:"APP_PASSWORD"` 22} 23 24type OAuthConfig struct { 25 Jwks string `env:"JWKS"` 26} 27 28type JetstreamConfig struct { 29 Endpoint string `env:"ENDPOINT, default=wss://jetstream1.us-east.bsky.network/subscribe"` 30} 31 32type ConsumerConfig struct { 33 RetryInterval time.Duration `env:"RETRY_INTERVAL, default=60s"` 34 MaxRetryInterval time.Duration `env:"MAX_RETRY_INTERVAL, default=120m"` 35 ConnectionTimeout time.Duration `env:"CONNECTION_TIMEOUT, default=5s"` 36 WorkerCount int `env:"WORKER_COUNT, default=64"` 37 QueueSize int `env:"QUEUE_SIZE, default=100"` 38} 39 40type ResendConfig struct { 41 ApiKey string `env:"API_KEY"` 42 SentFrom string `env:"SENT_FROM, default=noreply@notifs.tangled.sh"` 43} 44 45type CamoConfig struct { 46 Host string `env:"HOST, default=https://camo.tangled.sh"` 47 SharedSecret string `env:"SHARED_SECRET"` 48} 49 50type AvatarConfig struct { 51 Host string `env:"HOST, default=https://avatar.tangled.sh"` 52 SharedSecret string `env:"SHARED_SECRET"` 53} 54 55type PosthogConfig struct { 56 ApiKey string `env:"API_KEY"` 57 Endpoint string `env:"ENDPOINT, default=https://eu.i.posthog.com"` 58} 59 60type RedisConfig struct { 61 Addr string `env:"ADDR, default=localhost:6379"` 62 Password string `env:"PASS"` 63 DB int `env:"DB, default=0"` 64} 65 66type PdsConfig struct { 67 Host string `env:"HOST, default=https://tngl.sh"` 68 AdminSecret string `env:"ADMIN_SECRET"` 69} 70 71type Cloudflare struct { 72 ApiToken string `env:"API_TOKEN"` 73 ZoneId string `env:"ZONE_ID"` 74} 75 76func (cfg RedisConfig) ToURL() string { 77 u := &url.URL{ 78 Scheme: "redis", 79 Host: cfg.Addr, 80 Path: fmt.Sprintf("/%d", cfg.DB), 81 } 82 83 if cfg.Password != "" { 84 u.User = url.UserPassword("", cfg.Password) 85 } 86 87 return u.String() 88} 89 90type Config struct { 91 Core CoreConfig `env:",prefix=TANGLED_"` 92 Jetstream JetstreamConfig `env:",prefix=TANGLED_JETSTREAM_"` 93 Knotstream ConsumerConfig `env:",prefix=TANGLED_KNOTSTREAM_"` 94 Spindlestream ConsumerConfig `env:",prefix=TANGLED_SPINDLESTREAM_"` 95 Resend ResendConfig `env:",prefix=TANGLED_RESEND_"` 96 Posthog PosthogConfig `env:",prefix=TANGLED_POSTHOG_"` 97 Camo CamoConfig `env:",prefix=TANGLED_CAMO_"` 98 Avatar AvatarConfig `env:",prefix=TANGLED_AVATAR_"` 99 OAuth OAuthConfig `env:",prefix=TANGLED_OAUTH_"` 100 Redis RedisConfig `env:",prefix=TANGLED_REDIS_"` 101 Pds PdsConfig `env:",prefix=TANGLED_PDS_"` 102 Cloudflare Cloudflare `env:",prefix=TANGLED_CLOUDFLARE_"` 103} 104 105func LoadConfig(ctx context.Context) (*Config, error) { 106 var cfg Config 107 err := envconfig.Process(ctx, &cfg) 108 if err != nil { 109 return nil, err 110 } 111 112 return &cfg, nil 113}