cmd/weimar/serve.go (view raw)
1package main
2
3import (
4 "embed"
5 "fmt"
6 "io/fs"
7 "log/slog"
8 "os/signal"
9 "syscall"
10
11 "github.com/mjensen/weimar/internal/config"
12 "github.com/mjensen/weimar/internal/server"
13 "github.com/spf13/cobra"
14 "github.com/spf13/viper"
15)
16
17//go:embed web/build/*
18var webFS embed.FS
19
20var adminEmail string
21var adminPassword string
22
23var serveCmd = &cobra.Command{
24 Use: "serve",
25 Short: "Start the HTTP server",
26 RunE: func(cmd *cobra.Command, args []string) error {
27 cfg := config.FromViper()
28
29 if adminEmail != "" && adminPassword != "" {
30 slog.Info("first-run admin credentials provided", "email", adminEmail)
31 }
32
33 webSub, err := fs.Sub(webFS, "web/build")
34 if err != nil {
35 return fmt.Errorf("reading embedded web build: %w", err)
36 }
37
38 srv, err := server.New(cfg, webSub)
39 if err != nil {
40 return fmt.Errorf("creating server: %w", err)
41 }
42
43 ctx, stop := signal.NotifyContext(cmd.Context(), syscall.SIGINT, syscall.SIGTERM)
44 defer stop()
45
46 slog.Info("starting weimar", "host", cfg.Server.Host, "port", cfg.Server.Port)
47 if err := srv.Start(ctx); err != nil {
48 return fmt.Errorf("server error: %w", err)
49 }
50
51 return nil
52 },
53}
54
55func init() {
56 rootCmd.AddCommand(serveCmd)
57 serveCmd.Flags().StringVar(&adminEmail, "admin-email", "", "admin email for first-run setup")
58 serveCmd.Flags().StringVar(&adminPassword, "admin-password", "", "admin password for first-run setup")
59 viper.BindPFlag("server.host", serveCmd.Flags().Lookup("host"))
60 viper.BindPFlag("server.port", serveCmd.Flags().Lookup("port"))
61}