803f195af1
shadowing - refactor: rename `internal/log` → `internal/logging`, package `log` → `logging` - refactor: update imports in `cmd/serve.go` and `internal/middleware/requestid.go`
65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
package cmd
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log/slog"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/dhao2001/mygo/internal/app"
|
|
"github.com/dhao2001/mygo/internal/config"
|
|
"github.com/dhao2001/mygo/internal/logging"
|
|
"github.com/dhao2001/mygo/internal/server"
|
|
)
|
|
|
|
var serveConfigFile string
|
|
|
|
var serveCmd = &cobra.Command{
|
|
Use: "serve",
|
|
Short: "Start the MyGO HTTP server",
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
v := config.New()
|
|
cfg, loadInfo, err := config.Load(v, serveConfigFile)
|
|
if err != nil {
|
|
return fmt.Errorf("load config: %w", err)
|
|
}
|
|
|
|
// Set up structured logging before anything else.
|
|
appLogger := logging.NewLogger(cfg.Log)
|
|
slog.SetDefault(appLogger)
|
|
slog.Info("mygo server starting")
|
|
if loadInfo.EphemeralJWTSecret {
|
|
slog.Warn("jwt.secret is a development placeholder; using an ephemeral runtime secret. " +
|
|
"Set a stable jwt.secret or MYGO_JWT_SECRET for production, multi-instance deployments, " +
|
|
"and token persistence across restarts")
|
|
}
|
|
|
|
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
|
|
defer stop()
|
|
|
|
webApp, err := app.Bootstrap(cfg)
|
|
if err != nil {
|
|
return fmt.Errorf("bootstrap: %w", err)
|
|
}
|
|
defer func() {
|
|
if err := webApp.Close(); err != nil {
|
|
fmt.Fprintf(os.Stderr, "close webapp: %v\n", err)
|
|
}
|
|
}()
|
|
|
|
router := server.NewRouter(webApp)
|
|
addr := server.Address(webApp.Config.Server)
|
|
|
|
return server.RunWithGracefulShutdown(ctx, addr, router)
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
serveCmd.Flags().StringVar(&serveConfigFile, "config", "", "config file path")
|
|
rootCmd.AddCommand(serveCmd)
|
|
}
|