forked from tangled.org/core
this repo has no description
at master 3.1 kB view raw
1package knotserver 2 3import ( 4 "context" 5 "fmt" 6 "net/http" 7 8 "github.com/urfave/cli/v3" 9 "tangled.sh/tangled.sh/core/api/tangled" 10 "tangled.sh/tangled.sh/core/hook" 11 "tangled.sh/tangled.sh/core/jetstream" 12 "tangled.sh/tangled.sh/core/knotserver/config" 13 "tangled.sh/tangled.sh/core/knotserver/db" 14 "tangled.sh/tangled.sh/core/log" 15 "tangled.sh/tangled.sh/core/notifier" 16 "tangled.sh/tangled.sh/core/rbac" 17) 18 19func Command() *cli.Command { 20 return &cli.Command{ 21 Name: "server", 22 Usage: "run a knot server", 23 Action: Run, 24 Description: ` 25 Environment variables: 26 KNOT_SERVER_LISTEN_ADDR (default: 0.0.0.0:5555) 27 KNOT_SERVER_INTERNAL_LISTEN_ADDR (default: 127.0.0.1:5444) 28 KNOT_SERVER_DB_PATH (default: knotserver.db) 29 KNOT_SERVER_HOSTNAME (required) 30 KNOT_SERVER_JETSTREAM_ENDPOINT (default: wss://jetstream1.us-west.bsky.network/subscribe) 31 KNOT_SERVER_OWNER (required) 32 KNOT_SERVER_LOG_DIDS (default: true) 33 KNOT_SERVER_DEV (default: false) 34 KNOT_REPO_SCAN_PATH (default: /home/git) 35 KNOT_REPO_README (comma-separated list) 36 KNOT_REPO_MAIN_BRANCH (default: main) 37 KNOT_GIT_USER_NAME (default: Tangled) 38 KNOT_GIT_USER_EMAIL (default: noreply@tangled.sh) 39 APPVIEW_ENDPOINT (default: https://tangled.sh) 40 `, 41 } 42} 43 44func Run(ctx context.Context, cmd *cli.Command) error { 45 logger := log.FromContext(ctx) 46 iLogger := log.New("knotserver/internal") 47 48 c, err := config.Load(ctx) 49 if err != nil { 50 return fmt.Errorf("failed to load config: %w", err) 51 } 52 53 err = hook.Setup(hook.Config( 54 hook.WithScanPath(c.Repo.ScanPath), 55 hook.WithInternalApi(c.Server.InternalListenAddr), 56 )) 57 if err != nil { 58 return fmt.Errorf("failed to setup hooks: %w", err) 59 } 60 logger.Info("successfully finished setting up hooks") 61 62 if c.Server.Dev { 63 logger.Info("running in dev mode, signature verification is disabled") 64 } 65 66 db, err := db.Setup(c.Server.DBPath) 67 if err != nil { 68 return fmt.Errorf("failed to load db: %w", err) 69 } 70 71 e, err := rbac.NewEnforcer(c.Server.DBPath) 72 if err != nil { 73 return fmt.Errorf("failed to setup rbac enforcer: %w", err) 74 } 75 76 e.E.EnableAutoSave(true) 77 78 jc, err := jetstream.NewJetstreamClient(c.Server.JetstreamEndpoint, "knotserver", []string{ 79 tangled.PublicKeyNSID, 80 tangled.KnotMemberNSID, 81 tangled.RepoPullNSID, 82 tangled.RepoCollaboratorNSID, 83 }, nil, logger, db, true, c.Server.LogDids) 84 if err != nil { 85 logger.Error("failed to setup jetstream", "error", err) 86 } 87 88 notifier := notifier.New() 89 90 mux, err := Setup(ctx, c, db, e, jc, logger, &notifier) 91 if err != nil { 92 return fmt.Errorf("failed to setup server: %w", err) 93 } 94 95 imux := Internal(ctx, c, db, e, iLogger, &notifier) 96 97 logger.Info("starting internal server", "address", c.Server.InternalListenAddr) 98 go http.ListenAndServe(c.Server.InternalListenAddr, imux) 99 100 logger.Info("starting main server", "address", c.Server.ListenAddr) 101 logger.Error("server error", "error", http.ListenAndServe(c.Server.ListenAddr, mux)) 102 103 return nil 104}