Monorepo for Tangled
tangled.org
1package main
2
3import (
4 "context"
5 "net/http"
6 "os"
7
8 "github.com/prometheus/client_golang/prometheus/promhttp"
9 "tangled.org/core/appview/config"
10 "tangled.org/core/appview/state"
11 tlog "tangled.org/core/log"
12)
13
14func main() {
15 ctx := context.Background()
16 logger := tlog.New("appview")
17 ctx = tlog.IntoContext(ctx, logger)
18
19 c, err := config.LoadConfig(ctx)
20 if err != nil {
21 logger.Error("failed to load config", "error", err)
22 return
23 }
24
25 state, err := state.Make(ctx, c)
26 defer func() {
27 if err := state.Close(); err != nil {
28 logger.Error("failed to close state", "err", err)
29 }
30 }()
31
32 if err != nil {
33 logger.Error("failed to start appview", "err", err)
34 os.Exit(-1)
35 }
36
37 logger.Info("starting server", "address", c.Core.ListenAddr)
38
39 go func() {
40 logger.Info("starting metrics server", "address", c.Core.MetricsListenAddr)
41 http.Handle("/metrics", promhttp.Handler())
42 if err := http.ListenAndServe(c.Core.MetricsListenAddr, nil); err != nil {
43 logger.Error("failed to start metrics server", "err", err)
44 }
45 }()
46
47 if c.SSH.Enabled {
48 sshServer := state.NewSSHServer()
49 go func() {
50 if err := sshServer.ListenAndServe(ctx); err != nil {
51 logger.Error("SSH server stopped", "err", err)
52 }
53 }()
54 }
55
56 if err := http.ListenAndServe(c.Core.ListenAddr, state.Router()); err != nil {
57 logger.Error("failed to start appview", "err", err)
58 }
59}