@@ -231,39 +231,14 @@ func (s *Server) Start(ctx context.Context, apiMux *http.ServeMux) error {
231231 s .group = group
232232
233233 if s .wgConfig .PrivateKey != "" {
234- var snapshot map [string ]types.RelayState
235- if s .relaySet != nil {
236- snapshot = s .relaySet .Snapshot ()
237- }
238- peerMux := http .NewServeMux ()
239- peerMux .HandleFunc (types .PathRoot , s .handleRoot )
240- peerMux .HandleFunc (types .PathHealthz , s .handleHealthz )
241- peerMux .HandleFunc (types .PathDiscovery , func (w http.ResponseWriter , r * http.Request ) {
242- if ! s .DiscoveryEnabled () {
243- http .NotFound (w , r )
244- return
245- }
246- s .handleRelayDiscovery (w , r )
247- })
248- overlay , err := wireguard .NewOverlay (s .wgConfig , peerMux )
249- if err != nil {
234+ if err := s .startOverlay (); err != nil {
250235 acmeManager .Stop ()
251236 _ = apiServer .Close ()
252237 _ = apiCloser .Close ()
253238 _ = sniListener .Close ()
254239 cancel ()
255- return fmt .Errorf ("start wireguard overlay: %w" , err )
256- }
257- if err := overlay .Sync (s .cfg .PortalURL , snapshot ); err != nil {
258- acmeManager .Stop ()
259- _ = apiServer .Close ()
260- _ = apiCloser .Close ()
261- _ = sniListener .Close ()
262- _ = overlay .Shutdown (context .Background ())
263- cancel ()
264- return fmt .Errorf ("sync wireguard peers: %w" , err )
240+ return err
265241 }
266- s .overlay = overlay
267242 }
268243
269244 group .Go (s .runAPIServer )
@@ -516,6 +491,32 @@ func (s *Server) runSNIListener(ctx context.Context) error {
516491 }
517492}
518493
494+ func (s * Server ) startOverlay () error {
495+ peerMux := http .NewServeMux ()
496+ peerMux .HandleFunc (types .PathRoot , s .handleRoot )
497+ peerMux .HandleFunc (types .PathHealthz , s .handleHealthz )
498+ peerMux .HandleFunc (types .PathDiscovery , func (w http.ResponseWriter , r * http.Request ) {
499+ if ! s .DiscoveryEnabled () {
500+ http .NotFound (w , r )
501+ return
502+ }
503+ s .handleRelayDiscovery (w , r )
504+ })
505+
506+ overlay , err := wireguard .NewOverlay (s .wgConfig , peerMux )
507+ if err != nil {
508+ return fmt .Errorf ("start wireguard overlay: %w" , err )
509+ }
510+
511+ if err := overlay .Sync (s .cfg .PortalURL , s .relaySet .Snapshot ()); err != nil {
512+ _ = overlay .Shutdown (context .Background ())
513+ return fmt .Errorf ("sync wireguard peers: %w" , err )
514+ }
515+
516+ s .overlay = overlay
517+ return nil
518+ }
519+
519520func (s * Server ) startQUICTunnelListener (apiTLS keyless.TLSMaterialConfig ) error {
520521 if len (apiTLS .KeyPEM ) == 0 {
521522 return fmt .Errorf ("quic tunnel requires api tls key" )
0 commit comments