boulder/cmd/boulder-sa/main.go

94 lines
2.4 KiB
Go

package main
import (
"flag"
"os"
"github.com/letsencrypt/boulder/cmd"
"github.com/letsencrypt/boulder/features"
bgrpc "github.com/letsencrypt/boulder/grpc"
"github.com/letsencrypt/boulder/sa"
sapb "github.com/letsencrypt/boulder/sa/proto"
"github.com/prometheus/client_golang/prometheus"
)
type config struct {
SA struct {
cmd.ServiceConfig
cmd.DBConfig
Features map[string]bool
// Max simultaneous SQL queries caused by a single RPC.
ParallelismPerRPC int
}
Syslog cmd.SyslogConfig
}
func main() {
grpcAddr := flag.String("grpc-addr", "", "gRPC listen address override")
configFile := flag.String("config", "", "File path to the configuration file for this service")
flag.Parse()
if *configFile == "" {
flag.Usage()
os.Exit(1)
}
var c config
err := cmd.ReadConfigFile(*configFile, &c)
cmd.FailOnError(err, "Reading JSON config file into config structure")
err = features.Set(c.SA.Features)
cmd.FailOnError(err, "Failed to set feature flags")
if *grpcAddr != "" {
c.SA.GRPC.Address = *grpcAddr
}
scope, logger := cmd.StatsAndLogging(c.Syslog, c.SA.DebugAddr)
defer logger.AuditPanic()
logger.Info(cmd.VersionString())
saConf := c.SA
dbURL, err := saConf.DBConfig.URL()
cmd.FailOnError(err, "Couldn't load DB URL")
dbMap, err := sa.NewDbMap(dbURL, saConf.DBConfig.MaxDBConns)
cmd.FailOnError(err, "Couldn't connect to SA database")
// Export the MaxDBConns
dbConnStat := prometheus.NewGauge(prometheus.GaugeOpts{
Name: "max_db_connections",
Help: "Maximum number of DB connections allowed.",
})
scope.MustRegister(dbConnStat)
dbConnStat.Set(float64(saConf.DBConfig.MaxDBConns))
if saConf.DBConfig.MaxIdleDBConns != 0 {
dbMap.Db.SetMaxIdleConns(saConf.DBConfig.MaxIdleDBConns)
}
go sa.ReportDbConnCount(dbMap, scope)
parallel := saConf.ParallelismPerRPC
if parallel < 1 {
parallel = 1
}
sai, err := sa.NewSQLStorageAuthority(dbMap, cmd.Clock(), logger, scope, parallel)
cmd.FailOnError(err, "Failed to create SA impl")
tls, err := c.SA.TLS.Load()
cmd.FailOnError(err, "TLS config")
serverMetrics := bgrpc.NewServerMetrics(scope)
grpcSrv, listener, err := bgrpc.NewServer(c.SA.GRPC, tls, serverMetrics)
cmd.FailOnError(err, "Unable to setup SA gRPC server")
gw := bgrpc.NewStorageAuthorityServer(sai)
sapb.RegisterStorageAuthorityServer(grpcSrv, gw)
go cmd.CatchSignals(logger, grpcSrv.GracefulStop)
err = cmd.FilterShutdownErrors(grpcSrv.Serve(listener))
cmd.FailOnError(err, "SA gRPC service failed")
}