Files
mygo/cmd/serve.go
T
ld 803f195af1 refactor: rename internal/log to internal/logging to avoid stdlib
shadowing

- refactor: rename `internal/log` → `internal/logging`, package `log` →
  `logging`
- refactor: update imports in `cmd/serve.go` and
  `internal/middleware/requestid.go`
2026-07-06 00:11:06 +08:00

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)
}