@@ -24,6 +24,7 @@ import (
2424 lego "github.com/go-acme/lego/v4/lego"
2525 "github.com/go-acme/lego/v4/providers/dns/cloudflare"
2626 "github.com/go-acme/lego/v4/registration"
27+ "github.com/rs/zerolog/log"
2728)
2829
2930const (
@@ -32,6 +33,9 @@ const (
3233 accountKeyFileName = "acme-account.key"
3334 registrationFileName = "acme-registration.json"
3435 defaultACMEEmailPrefix = "acme@"
36+ defaultRenewInterval = 24 * time .Hour
37+ defaultDNSSyncInterval = 10 * time .Minute
38+ defaultSyncTimeout = 2 * time .Minute
3539)
3640
3741type Config struct {
@@ -99,7 +103,7 @@ func (m *Manager) EnsureCertificate(ctx context.Context) (string, string, error)
99103 return "" , "" , errors .New ("cloudflare token is required for non-local relay certificates" )
100104 }
101105
102- if err := EnsureDNSRecords ( ctx , m . cfg . BaseDomain , m . cfg . CloudflareToken ); err != nil {
106+ if err := m . syncDNS ( ctx ); err != nil {
103107 return "" , "" , fmt .Errorf ("ensure dns records: %w" , err )
104108 }
105109
@@ -124,7 +128,7 @@ func (m *Manager) Start(ctx context.Context) {
124128
125129 m .startOnce .Do (func () {
126130 m .wg .Add (1 )
127- go m .renewalLoop (ctx )
131+ go m .maintenanceLoop (ctx )
128132 })
129133}
130134
@@ -195,29 +199,48 @@ func (m *Manager) provision(ctx context.Context) error {
195199 return nil
196200}
197201
198- func (m * Manager ) renewalLoop (ctx context.Context ) {
202+ func (m * Manager ) maintenanceLoop (ctx context.Context ) {
199203 defer m .wg .Done ()
200204
201- ticker := time .NewTicker (24 * time .Hour )
202- defer ticker .Stop ()
205+ renewTicker := time .NewTicker (defaultRenewInterval )
206+ dnsTicker := time .NewTicker (defaultDNSSyncInterval )
207+ defer renewTicker .Stop ()
208+ defer dnsTicker .Stop ()
203209
204210 for {
205211 select {
206212 case <- ctx .Done ():
207213 return
208214 case <- m .stopCh :
209215 return
210- case <- ticker .C :
216+ case <- dnsTicker .C :
217+ syncCtx , cancel := context .WithTimeout (ctx , defaultSyncTimeout )
218+ err := m .syncDNS (syncCtx )
219+ cancel ()
220+ if err != nil {
221+ log .Warn ().Err (err ).Str ("base_domain" , m .cfg .BaseDomain ).Msg ("sync dns records" )
222+ }
223+ case <- renewTicker .C :
211224 if ! m .shouldRenew () {
212225 continue
213226 }
214- renewCtx , cancel := context .WithTimeout (ctx , 2 * time . Minute )
215- _ = m .provision (renewCtx )
227+ renewCtx , cancel := context .WithTimeout (ctx , defaultSyncTimeout )
228+ err : = m .provision (renewCtx )
216229 cancel ()
230+ if err != nil {
231+ log .Warn ().Err (err ).Str ("base_domain" , m .cfg .BaseDomain ).Msg ("renew acme certificate" )
232+ }
217233 }
218234 }
219235}
220236
237+ func (m * Manager ) syncDNS (ctx context.Context ) error {
238+ if m == nil || isLocalhost (m .cfg .BaseDomain ) || m .cfg .CloudflareToken == "" {
239+ return nil
240+ }
241+ return EnsureDNSRecords (ctx , m .cfg .BaseDomain , m .cfg .CloudflareToken )
242+ }
243+
221244func (m * Manager ) shouldRenew () bool {
222245 m .mu .RLock ()
223246 defer m .mu .RUnlock ()
0 commit comments