This repository has no description
1package config
2
3import (
4 "context"
5 "time"
6
7 "github.com/bluesky-social/indigo/atproto/syntax"
8 "github.com/sethvargo/go-envconfig"
9 "tangled.org/core/xrpc/serviceauth"
10)
11
12type Server struct {
13 ListenAddr string `env:"LISTEN_ADDR, default=0.0.0.0:6555"`
14 DBPath string `env:"DB_PATH, default=spindle.db"`
15 RepoDir string `env:"REPO_DIR, default=repos"`
16 Hostname string `env:"HOSTNAME, required"`
17 JetstreamEndpoint string `env:"JETSTREAM_ENDPOINT, default=wss://jetstream1.us-west.bsky.network/subscribe"`
18 Tap Tap `env:",prefix=TAP_"`
19 PlcUrl string `env:"PLC_URL, default=https://plc.directory"`
20 Dev bool `env:"DEV, default=false"`
21 DevExtraHosts []string `env:"DEV_EXTRA_HOSTS"`
22 Owner string `env:"OWNER, required"`
23 Secrets Secrets `env:",prefix=SECRETS_"`
24 LogDir string `env:"LOG_DIR, default=/var/log/spindle"`
25 QueueSize int `env:"QUEUE_SIZE, default=100"`
26 MaxJobCount int `env:"MAX_JOB_COUNT, default=2"` // max number of pipelines that run at a time
27 DockerSocket string `env:"DOCKER_SOCKET"` // path to a docker socket to expose to workflow containers
28}
29
30type Tap struct {
31 Embed bool `env:"EMBED, default=true"`
32 Url string `env:"URL, default=http://[::1]:2480"`
33 Bind string `env:"BIND, default=[::1]:2480"`
34 DBPath string `env:"DB_PATH, default=tap.db"`
35 RelayUrl string `env:"RELAY_URL, default=https://bsky.network"`
36 AdminPassword string `env:"ADMIN_PASSWORD"`
37}
38
39func (s Server) Did() syntax.DID {
40 return serviceauth.DidWeb(s.Hostname)
41}
42
43type Secrets struct {
44 Provider string `env:"PROVIDER, default=sqlite"`
45 OpenBao OpenBaoConfig `env:",prefix=OPENBAO_"`
46}
47
48type OpenBaoConfig struct {
49 ProxyAddr string `env:"PROXY_ADDR, default=http://127.0.0.1:8200"`
50 Mount string `env:"MOUNT, default=spindle"`
51}
52
53type NixeryPipelines struct {
54 Nixery string `env:"NIXERY, default=nixery.tangled.sh"`
55 WorkflowTimeout string `env:"WORKFLOW_TIMEOUT, default=5m"`
56 MaxJobMemoryMB int64 `env:"MAX_JOB_MEMORY_MB, default=6144"` // per-container memory limit in MiB (default 6 GiB)
57 MaxConcurrentWorkflows int `env:"MAX_CONCURRENT_WORKFLOWS, default=8"` // max number of workflow containers running at once (memory cap)
58}
59
60type ArtifactStoreDisk struct {
61 Dir string `env:"DIR"`
62}
63
64type ArtifactStoreS3 struct {
65 Bucket string `env:"BUCKET"`
66 Region string `env:"REGION, default=us-east-1"`
67}
68
69type ArtifactStores struct {
70 Disk ArtifactStoreDisk `env:",prefix=DISK_"`
71 S3 ArtifactStoreS3 `env:",prefix=S3_"`
72}
73
74type LegacyS3 struct {
75 LogBucket string `env:"LOG_BUCKET"`
76}
77
78type MicroVMPipelines struct {
79 ImageDir string `env:"IMAGE_DIR"`
80 OverlayDir string `env:"OVERLAY_DIR, default="` // where microVM temporary disks will live
81 DefaultImage string `env:"DEFAULT_IMAGE, default=nixos-x86_64"`
82 AgentPort uint32 `env:"AGENT_PORT, default=10240"`
83 EnableKVM bool `env:"ENABLE_KVM, default=true"`
84 WorkflowTimeout string `env:"WORKFLOW_TIMEOUT, default=5m"`
85
86 MaxTotalMemoryMiB int64 `env:"MAX_TOTAL_MEMORY_MIB, default=0"`
87 MaxTotalVCPUs int64 `env:"MAX_TOTAL_VCPUS, default=0"`
88 MaxTotalDiskMiB int64 `env:"MAX_TOTAL_DISK_MIB, default=0"`
89
90 MaxWorkflowMemoryMiB int64 `env:"MAX_WORKFLOW_MEMORY_MIB, default=0"`
91 MaxWorkflowVCPUs int64 `env:"MAX_WORKFLOW_VCPUS, default=0"`
92 MaxWorkflowDiskMiB int64 `env:"MAX_WORKFLOW_DISK_MIB, default=0"`
93
94 AgingThreshold time.Duration `env:"AGING_THRESHOLD, default=30s"`
95
96 EnableCgroups bool `env:"ENABLE_CGROUPS, default=false"`
97 CgroupParent string `env:"CGROUP_PARENT, default=self"`
98 CgroupPidsMax int64 `env:"CGROUP_PIDS_MAX, default=4096"`
99 CgroupSwapMaxMiB *int64 `env:"CGROUP_SWAP_MAX_MIB"`
100 // memory.min that will get assigned to the supervisor (spindle itself) cgroup
101 CgroupSupervisorMemoryMinMiB int64 `env:"CGROUP_SUPERVISOR_MEMORY_MIN_MIB, default=512"`
102}
103
104type NixCache struct {
105 ReadURLs []string `env:"READ_URLS"`
106 TrustedPublicKeys []string `env:"TRUSTED_PUBLIC_KEYS"`
107 UploadURL string `env:"UPLOAD_URL"`
108}
109
110type Config struct {
111 Server Server `env:",prefix=SPINDLE_SERVER_"`
112 NixeryPipelines NixeryPipelines `env:",prefix=SPINDLE_NIXERY_PIPELINES_"`
113 MicroVMPipelines MicroVMPipelines `env:",prefix=SPINDLE_MICROVM_PIPELINES_"`
114 NixCache NixCache `env:",prefix=SPINDLE_NIX_CACHE_"`
115 ArtifactStores ArtifactStores `env:",prefix=SPINDLE_ARTIFACT_STORES_"`
116 LegacyS3 LegacyS3 `env:",prefix=SPINDLE_S3_"`
117}
118
119func Load(ctx context.Context) (*Config, error) {
120 var cfg Config
121 err := envconfig.Process(ctx, &cfg)
122 if err != nil {
123 return nil, err
124 }
125
126 return &cfg, nil
127}