Files
metacrypt/internal/server/server.go
Kyle Isom d308db8598 Add /healthz endpoint via mcdsl/health
Database ping health check at /healthz, no auth required. Seal state
is still reported via the existing /v1/status endpoint.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 14:18:09 -07:00

71 lines
1.9 KiB
Go

// Package server implements the HTTP server for Metacrypt.
package server
import (
"context"
"database/sql"
"log/slog"
"sync"
"google.golang.org/grpc"
"git.wntrmute.dev/kyle/mcdsl/httpserver"
internacme "git.wntrmute.dev/kyle/metacrypt/internal/acme"
"git.wntrmute.dev/kyle/metacrypt/internal/audit"
"git.wntrmute.dev/kyle/metacrypt/internal/auth"
"git.wntrmute.dev/kyle/metacrypt/internal/config"
"git.wntrmute.dev/kyle/metacrypt/internal/engine"
"git.wntrmute.dev/kyle/metacrypt/internal/policy"
"git.wntrmute.dev/kyle/metacrypt/internal/seal"
)
// Server is the Metacrypt HTTP server.
type Server struct {
cfg *config.Config
database *sql.DB
seal *seal.Manager
auth *auth.Authenticator
policy *policy.Engine
engines *engine.Registry
audit *audit.Logger
httpSrv *httpserver.Server
grpcSrv *grpc.Server
logger *slog.Logger
acmeHandlers map[string]*internacme.Handler
version string
acmeMu sync.Mutex
}
// New creates a new server.
func New(cfg *config.Config, database *sql.DB, sealMgr *seal.Manager, authenticator *auth.Authenticator,
policyEngine *policy.Engine, engineRegistry *engine.Registry, auditLog *audit.Logger, logger *slog.Logger, version string) *Server {
s := &Server{
cfg: cfg,
database: database,
seal: sealMgr,
auth: authenticator,
policy: policyEngine,
engines: engineRegistry,
audit: auditLog,
logger: logger,
version: version,
}
return s
}
// Start starts the HTTPS server.
func (s *Server) Start() error {
s.httpSrv = httpserver.New(s.cfg.Server.ServerConfig, s.logger)
s.httpSrv.Router.Use(s.httpSrv.LoggingMiddleware)
s.registerRoutes(s.httpSrv.Router)
return s.httpSrv.ListenAndServeTLS()
}
// Shutdown gracefully shuts down the server.
func (s *Server) Shutdown(ctx context.Context) error {
if s.httpSrv != nil {
return s.httpSrv.Shutdown(ctx)
}
return nil
}