forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
at master 4.5 kB view raw
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.org"` 17 AppviewName string `env:"APPVIEW_Name, default=Tangled"` 18 Dev bool `env:"DEV, default=false"` 19 DisallowedNicknamesFile string `env:"DISALLOWED_NICKNAMES_FILE"` 20 21 // temporarily, to add users to default knot and spindle 22 AppPassword string `env:"APP_PASSWORD"` 23 24 // uhhhh this is because knot1 is under icy's did 25 TmpAltAppPassword string `env:"ALT_APP_PASSWORD"` 26} 27 28type OAuthConfig struct { 29 ClientSecret string `env:"CLIENT_SECRET"` 30 ClientKid string `env:"CLIENT_KID"` 31} 32 33type PlcConfig struct { 34 PLCURL string `env:"URL, default=https://plc.directory"` 35} 36 37type JetstreamConfig struct { 38 Endpoint string `env:"ENDPOINT, default=wss://jetstream1.us-east.bsky.network/subscribe"` 39} 40 41type ConsumerConfig struct { 42 RetryInterval time.Duration `env:"RETRY_INTERVAL, default=60s"` 43 MaxRetryInterval time.Duration `env:"MAX_RETRY_INTERVAL, default=120m"` 44 ConnectionTimeout time.Duration `env:"CONNECTION_TIMEOUT, default=5s"` 45 WorkerCount int `env:"WORKER_COUNT, default=64"` 46 QueueSize int `env:"QUEUE_SIZE, default=100"` 47} 48 49type ResendConfig struct { 50 ApiKey string `env:"API_KEY"` 51 SentFrom string `env:"SENT_FROM, default=noreply@notifs.tangled.sh"` 52} 53 54type CamoConfig struct { 55 Host string `env:"HOST, default=https://camo.tangled.sh"` 56 SharedSecret string `env:"SHARED_SECRET"` 57} 58 59type AvatarConfig struct { 60 Host string `env:"HOST, default=https://avatar.tangled.sh"` 61 SharedSecret string `env:"SHARED_SECRET"` 62} 63 64type PosthogConfig struct { 65 ApiKey string `env:"API_KEY"` 66 Endpoint string `env:"ENDPOINT, default=https://eu.i.posthog.com"` 67} 68 69type RedisConfig struct { 70 Addr string `env:"ADDR, default=localhost:6379"` 71 Password string `env:"PASS"` 72 DB int `env:"DB, default=0"` 73} 74 75type PdsConfig struct { 76 Host string `env:"HOST, default=https://tngl.sh"` 77 AdminSecret string `env:"ADMIN_SECRET"` 78} 79 80type Cloudflare struct { 81 ApiToken string `env:"API_TOKEN"` 82 ZoneId string `env:"ZONE_ID"` 83 TurnstileSiteKey string `env:"TURNSTILE_SITE_KEY"` 84 TurnstileSecretKey string `env:"TURNSTILE_SECRET_KEY"` 85} 86 87type LabelConfig struct { 88 DefaultLabelDefs []string `env:"DEFAULTS, default=at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/wontfix,at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/good-first-issue,at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/duplicate,at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/documentation,at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/assignee"` // delimiter=, 89 GoodFirstIssue string `env:"GFI, default=at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/good-first-issue"` 90} 91 92func (cfg RedisConfig) ToURL() string { 93 u := &url.URL{ 94 Scheme: "redis", 95 Host: cfg.Addr, 96 Path: fmt.Sprintf("/%d", cfg.DB), 97 } 98 99 if cfg.Password != "" { 100 u.User = url.UserPassword("", cfg.Password) 101 } 102 103 return u.String() 104} 105 106type Config struct { 107 Core CoreConfig `env:",prefix=TANGLED_"` 108 Jetstream JetstreamConfig `env:",prefix=TANGLED_JETSTREAM_"` 109 Knotstream ConsumerConfig `env:",prefix=TANGLED_KNOTSTREAM_"` 110 Spindlestream ConsumerConfig `env:",prefix=TANGLED_SPINDLESTREAM_"` 111 Resend ResendConfig `env:",prefix=TANGLED_RESEND_"` 112 Posthog PosthogConfig `env:",prefix=TANGLED_POSTHOG_"` 113 Camo CamoConfig `env:",prefix=TANGLED_CAMO_"` 114 Avatar AvatarConfig `env:",prefix=TANGLED_AVATAR_"` 115 OAuth OAuthConfig `env:",prefix=TANGLED_OAUTH_"` 116 Redis RedisConfig `env:",prefix=TANGLED_REDIS_"` 117 Plc PlcConfig `env:",prefix=TANGLED_PLC_"` 118 Pds PdsConfig `env:",prefix=TANGLED_PDS_"` 119 Cloudflare Cloudflare `env:",prefix=TANGLED_CLOUDFLARE_"` 120 Label LabelConfig `env:",prefix=TANGLED_LABEL_"` 121} 122 123func LoadConfig(ctx context.Context) (*Config, error) { 124 var cfg Config 125 err := envconfig.Process(ctx, &cfg) 126 if err != nil { 127 return nil, err 128 } 129 130 return &cfg, nil 131}