1package main
2
3import (
4 "context"
5 "net/http"
6
7 "tangled.sh/tangled.sh/core/api/tangled"
8 "tangled.sh/tangled.sh/core/jetstream"
9 "tangled.sh/tangled.sh/core/knotserver"
10 "tangled.sh/tangled.sh/core/knotserver/config"
11 "tangled.sh/tangled.sh/core/knotserver/db"
12 "tangled.sh/tangled.sh/core/log"
13 "tangled.sh/tangled.sh/core/rbac"
14
15 _ "net/http/pprof"
16)
17
18func main() {
19 ctx := context.Background()
20 // ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
21 // defer stop()
22
23 l := log.New("knotserver")
24
25 c, err := config.Load(ctx)
26 if err != nil {
27 l.Error("failed to load config", "error", err)
28 return
29 }
30
31 if c.Server.Dev {
32 l.Info("running in dev mode, signature verification is disabled")
33 }
34
35 db, err := db.Setup(c.Server.DBPath)
36 if err != nil {
37 l.Error("failed to setup db", "error", err)
38 return
39 }
40
41 e, err := rbac.NewEnforcer(c.Server.DBPath)
42 if err != nil {
43 l.Error("failed to setup rbac enforcer", "error", err)
44 return
45 }
46
47 e.E.EnableAutoSave(true)
48
49 jc, err := jetstream.NewJetstreamClient(c.Server.JetstreamEndpoint, "knotserver", []string{
50 tangled.PublicKeyNSID,
51 tangled.KnotMemberNSID,
52 }, nil, l, db, true)
53 if err != nil {
54 l.Error("failed to setup jetstream", "error", err)
55 }
56
57 mux, err := knotserver.Setup(ctx, c, db, e, jc, l)
58 if err != nil {
59 l.Error("failed to setup server", "error", err)
60 return
61 }
62 imux := knotserver.Internal(ctx, db, e)
63
64 l.Info("starting internal server", "address", c.Server.InternalListenAddr)
65 go http.ListenAndServe(c.Server.InternalListenAddr, imux)
66
67 l.Info("starting main server", "address", c.Server.ListenAddr)
68 l.Error("server error", "error", http.ListenAndServe(c.Server.ListenAddr, mux))
69
70 return
71}