Monorepo for Tangled
tangled.org
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 Tap Tap `env:",prefix=TAP_"`
17 PlcUrl string `env:"PLC_URL, default=https://plc.directory"`
18 Dev bool `env:"DEV, default=false"`
19 Owner string `env:"OWNER, required"`
20 Secrets Secrets `env:",prefix=SECRETS_"`
21 LogDir string `env:"LOG_DIR, default=/var/log/spindle"`
22 QueueSize int `env:"QUEUE_SIZE, default=100"`
23 MaxJobCount int `env:"MAX_JOB_COUNT, default=2"` // max number of pipelines that run at a time
24 MaxConcurrentWorkflows int `env:"MAX_CONCURRENT_WORKFLOWS, default=8"` // max number of workflow containers running at once (memory cap)
25 DockerSocket string `env:"DOCKER_SOCKET"` // path to a docker socket to expose to workflow containers
26}
27
28type Tap struct {
29 Embed bool `env:"EMBED, default=true"`
30 Url string `env:"URL, default=http://[::1]:2480"`
31 Bind string `env:"BIND, default=[::1]:2480"`
32 DBPath string `env:"DB_PATH, default=tap.db"`
33 RelayUrl string `env:"RELAY_URL, default=https://bsky.network"`
34 AdminPassword string `env:"ADMIN_PASSWORD"`
35}
36
37func (s Server) Did() syntax.DID {
38 return syntax.DID(fmt.Sprintf("did:web:%s", s.Hostname))
39}
40
41type Secrets struct {
42 Provider string `env:"PROVIDER, default=sqlite"`
43 OpenBao OpenBaoConfig `env:",prefix=OPENBAO_"`
44}
45
46type OpenBaoConfig struct {
47 ProxyAddr string `env:"PROXY_ADDR, default=http://127.0.0.1:8200"`
48 Mount string `env:"MOUNT, default=spindle"`
49}
50
51type NixeryPipelines struct {
52 Nixery string `env:"NIXERY, default=nixery.tangled.sh"`
53 WorkflowTimeout string `env:"WORKFLOW_TIMEOUT, default=5m"`
54 MaxJobMemoryMB int64 `env:"MAX_JOB_MEMORY_MB, default=6144"` // per-container memory limit in MiB (default 6 GiB)
55}
56
57type S3 struct {
58 LogBucket string `env:"LOG_BUCKET"`
59}
60
61type Config struct {
62 Server Server `env:",prefix=SPINDLE_SERVER_"`
63 NixeryPipelines NixeryPipelines `env:",prefix=SPINDLE_NIXERY_PIPELINES_"`
64 S3 S3 `env:",prefix=SPINDLE_S3_"`
65}
66
67func Load(ctx context.Context) (*Config, error) {
68 var cfg Config
69 err := envconfig.Process(ctx, &cfg)
70 if err != nil {
71 return nil, err
72 }
73
74 return &cfg, nil
75}