all repos — weimar @ 28e896519b8b6466fbb9a904b18002993c823f76

Unnamed repository; edit this file 'description' to name the repository.

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}