Fix start lifecycle

This commit is contained in:
世界
2026-08-30 17:41:43 +08:00
parent 0a4e4c8061
commit b9572e5812
17 changed files with 254 additions and 140 deletions
+40 -27
View File
@@ -48,11 +48,13 @@ var (
type Service struct {
certificate.Adapter
ctx context.Context
config *certmagic.Config
cache *certmagic.Cache
domain []string
nextProtos []string
ctx context.Context
config *certmagic.Config
cache *certmagic.Cache
zapLogger *zap.Logger
dataDirectory string
domain []string
nextProtos []string
}
func NewCertificateProvider(ctx context.Context, logger log.ContextLogger, tag string, options option.ACMECertificateProviderOptions) (adapter.CertificateProviderService, error) {
@@ -78,13 +80,12 @@ func NewCertificateProvider(ctx context.Context, logger log.ContextLogger, tag s
return nil, E.New("email is required to use the ZeroSSL ACME endpoint without external_account or account_key")
}
var storage certmagic.Storage
var (
storage certmagic.Storage
dataDirectory string
)
if options.DataDirectory != "" {
dataDirectory := filemanager.BasePath(ctx, os.ExpandEnv(options.DataDirectory))
err := filemanager.MkdirAll(ctx, dataDirectory, 0o700)
if err != nil {
return nil, E.Cause(err, "create ACME data directory")
}
dataDirectory = filemanager.BasePath(ctx, os.ExpandEnv(options.DataDirectory))
storage = &certmagic.FileStorage{Path: dataDirectory}
} else {
storage = certmagic.Default.Storage
@@ -169,33 +170,45 @@ func NewCertificateProvider(ctx context.Context, logger log.ContextLogger, tag s
}
reflect.NewAt(httpClientField.Type(), unsafe.Pointer(httpClientField.UnsafeAddr())).Elem().Set(reflect.ValueOf(acmeHTTPClient))
config.Issuers = []certmagic.Issuer{certmagicIssuer}
cache := certmagic.NewCache(certmagic.CacheOptions{
GetConfigForCert: func(certificate certmagic.Certificate) (*certmagic.Config, error) {
return config, nil
},
Logger: zapLogger,
})
config = certmagic.New(cache, *config)
var nextProtos []string
if !acmeIssuer.DisableTLSALPNChallenge && acmeIssuer.DNS01Solver == nil {
nextProtos = []string{C.ACMETLS1Protocol}
}
return &Service{
Adapter: certificate.NewAdapter(C.TypeACME, tag),
ctx: ctx,
config: config,
cache: cache,
domain: options.Domain,
nextProtos: nextProtos,
Adapter: certificate.NewAdapter(C.TypeACME, tag),
ctx: ctx,
config: config,
zapLogger: zapLogger,
dataDirectory: dataDirectory,
domain: options.Domain,
nextProtos: nextProtos,
}, nil
}
func (s *Service) Start(stage adapter.StartStage) error {
if stage != adapter.StartStateStart {
return nil
switch stage {
case adapter.StartStateInitialize:
if s.dataDirectory != "" {
err := filemanager.MkdirAll(s.ctx, s.dataDirectory, 0o700)
if err != nil {
return E.Cause(err, "create ACME data directory")
}
}
config := s.config
cache := certmagic.NewCache(certmagic.CacheOptions{
GetConfigForCert: func(certificate certmagic.Certificate) (*certmagic.Config, error) {
return config, nil
},
Logger: s.zapLogger,
})
config = certmagic.New(cache, *config)
s.config = config
s.cache = cache
case adapter.StartStateStart:
return s.config.ManageAsync(s.ctx, s.domain)
}
return s.config.ManageAsync(s.ctx, s.domain)
return nil
}
func (s *Service) Close() error {
+17 -8
View File
@@ -65,6 +65,7 @@ type Service struct {
timeFunc func() time.Time
httpClient *http.Client
storage certmagic.Storage
dataDirectory string
storageIssuerKey string
storageNamesKey string
storageLockKey string
@@ -109,14 +110,12 @@ func NewCertificateProvider(ctx context.Context, logger log.ContextLogger, tag s
cancel()
return nil, err
}
var storage certmagic.Storage
var (
storage certmagic.Storage
dataDirectory string
)
if options.DataDirectory != "" {
dataDirectory := filemanager.BasePath(ctx, os.ExpandEnv(options.DataDirectory))
mkdirErr := filemanager.MkdirAll(ctx, dataDirectory, 0o700)
if mkdirErr != nil {
cancel()
return nil, E.Cause(mkdirErr, "create data directory")
}
dataDirectory = filemanager.BasePath(ctx, os.ExpandEnv(options.DataDirectory))
storage = &certmagic.FileStorage{Path: dataDirectory}
} else {
storage = certmagic.Default.Storage
@@ -140,6 +139,7 @@ func NewCertificateProvider(ctx context.Context, logger log.ContextLogger, tag s
timeFunc: timeFunc,
httpClient: httpClient,
storage: storage,
dataDirectory: dataDirectory,
storageIssuerKey: storageIssuerKey,
storageNamesKey: storageNamesKey,
storageLockKey: storageLockKey,
@@ -162,7 +162,16 @@ func originCAHTTPClient(ctx context.Context, logger log.ContextLogger, options o
}
func (s *Service) Start(stage adapter.StartStage) error {
if stage != adapter.StartStateStart {
if stage == adapter.StartStateInitialize {
if s.dataDirectory == "" {
return nil
}
err := filemanager.MkdirAll(s.ctx, s.dataDirectory, 0o700)
if err != nil {
return E.Cause(err, "create data directory")
}
return nil
} else if stage != adapter.StartStateStart {
return nil
}
cachedCertificate, cachedLeaf, err := s.loadCachedCertificate()