Monorepo for Tangled
tangled.org
1package config
2
3import (
4 "context"
5
6 "github.com/bluesky-social/indigo/atproto/syntax"
7 "github.com/sethvargo/go-envconfig"
8 "tangled.org/core/xrpc/serviceauth"
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 DBPath string `env:"DB_PATH, default=knotserver.db"`
21 Hostname string `env:"HOSTNAME, required"`
22 PlcUrl string `env:"PLC_URL, default=https://plc.directory"`
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 MaxResponseKB int `env:"MAX_RESPONSE_KB, default=5120"`
27 AdminSecret string `env:"ADMIN_SECRET"`
28
29 // This disables signature verification so use with caution.
30 Dev bool `env:"DEV, default=false"`
31
32 // SecureMode enables per-repository subprocess isolation.
33 SecureMode bool `env:"SECURE_MODE, default=false"`
34}
35
36type Git struct {
37 // user name & email used as committer
38 UserName string `env:"USER_NAME, default=Tangled"`
39 UserEmail string `env:"USER_EMAIL, default=noreply@tangled.sh"`
40}
41
42func (s Server) Did() syntax.DID {
43 return serviceauth.DidWeb(s.Hostname)
44}
45
46type Config struct {
47 Repo Repo `env:",prefix=KNOT_REPO_"`
48 Server Server `env:",prefix=KNOT_SERVER_"`
49 Git Git `env:",prefix=KNOT_GIT_"`
50 AppViewEndpoint string `env:"APPVIEW_ENDPOINT, default=https://tangled.org"`
51 LogsAddr string `env:"LOGS_ADDR, default=tangled.org:3333"`
52 KnotMirrors []string `env:"KNOT_MIRRORS, default=https://mirror.tangled.network"`
53}
54
55func Load(ctx context.Context) (*Config, error) {
56 var cfg Config
57 err := envconfig.Process(ctx, &cfg)
58 if err != nil {
59 return nil, err
60 }
61
62 if cfg.Repo.Readme == nil {
63 cfg.Repo.Readme = []string{
64 "README.md", "readme.md",
65 "README",
66 "readme",
67 "README.markdown",
68 "readme.markdown",
69 "README.txt",
70 "readme.txt",
71 "README.rst",
72 "readme.rst",
73 "README.org",
74 "readme.org",
75 "README.asciidoc",
76 "readme.asciidoc",
77 }
78 }
79
80 return &cfg, nil
81}