1package config
2
3import (
4 "context"
5 "fmt"
6
7 "github.com/bluesky-social/indigo/atproto/syntax"
8 "github.com/sethvargo/go-envconfig"
9)
10
11type Server struct {
12 ListenAddr string `env:"LISTEN_ADDR, default=0.0.0.0:6555"`
13 DBPath string `env:"DB_PATH, default=spindle.db"`
14 Hostname string `env:"HOSTNAME, required"`
15 JetstreamEndpoint string `env:"JETSTREAM_ENDPOINT, default=wss://jetstream1.us-west.bsky.network/subscribe"`
16 Dev bool `env:"DEV, default=false"`
17 Owner string `env:"OWNER, required"`
18 Secrets Secrets `env:",prefix=SECRETS_"`
19}
20
21func (s Server) Did() syntax.DID {
22 return syntax.DID(fmt.Sprintf("did:web:%s", s.Hostname))
23}
24
25type Secrets struct {
26 Provider string `env:"PROVIDER, default=sqlite"`
27 OpenBao OpenBaoConfig `env:",prefix=OPENBAO_"`
28}
29
30type OpenBaoConfig struct {
31 Addr string `env:"ADDR"`
32 RoleID string `env:"ROLE_ID"`
33 SecretID string `env:"SECRET_ID"`
34 Mount string `env:"MOUNT, default=spindle"`
35}
36
37type Pipelines struct {
38 Nixery string `env:"NIXERY, default=nixery.tangled.sh"`
39 WorkflowTimeout string `env:"WORKFLOW_TIMEOUT, default=5m"`
40 LogDir string `env:"LOG_DIR, default=/var/log/spindle"`
41}
42
43type Config struct {
44 Server Server `env:",prefix=SPINDLE_SERVER_"`
45 Pipelines Pipelines `env:",prefix=SPINDLE_PIPELINES_"`
46}
47
48func Load(ctx context.Context) (*Config, error) {
49 var cfg Config
50 err := envconfig.Process(ctx, &cfg)
51 if err != nil {
52 return nil, err
53 }
54
55 return &cfg, nil
56}