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 Repo struct {
12 ScanPath string `env:"SCAN_PATH, default=/home/git"`
13 Readme []string `env:"README"`
14 MainBranch string `env:"MAIN_BRANCH, default=main"`
15}
16
17type Server struct {
18 ListenAddr string `env:"LISTEN_ADDR, default=0.0.0.0:5555"`
19 InternalListenAddr string `env:"INTERNAL_LISTEN_ADDR, default=127.0.0.1:5444"`
20 Secret string `env:"SECRET, required"`
21 DBPath string `env:"DB_PATH, default=knotserver.db"`
22 Hostname string `env:"HOSTNAME, required"`
23 JetstreamEndpoint string `env:"JETSTREAM_ENDPOINT, default=wss://jetstream1.us-west.bsky.network/subscribe"`
24 Owner string `env:"OWNER, required"`
25 LogDids bool `env:"LOG_DIDS, default=true"`
26
27 // This disables signature verification so use with caution.
28 Dev bool `env:"DEV, default=false"`
29}
30
31func (s Server) Did() syntax.DID {
32 return syntax.DID(fmt.Sprintf("did:web:%s", s.Hostname))
33}
34
35type Config struct {
36 Repo Repo `env:",prefix=KNOT_REPO_"`
37 Server Server `env:",prefix=KNOT_SERVER_"`
38 AppViewEndpoint string `env:"APPVIEW_ENDPOINT, default=https://tangled.sh"`
39}
40
41func Load(ctx context.Context) (*Config, error) {
42 var cfg Config
43 err := envconfig.Process(ctx, &cfg)
44 if err != nil {
45 return nil, err
46 }
47
48 if cfg.Repo.Readme == nil {
49 cfg.Repo.Readme = []string{
50 "README.md", "readme.md",
51 "README",
52 "readme",
53 "README.markdown",
54 "readme.markdown",
55 "README.txt",
56 "readme.txt",
57 "README.rst",
58 "readme.rst",
59 "README.org",
60 "readme.org",
61 "README.asciidoc",
62 "readme.asciidoc",
63 }
64 }
65
66 return &cfg, nil
67}