fix init overlay

rabbitprincess committed Mar 30, 2026 at 00:05 UTC 1a892ab716d3726b39dbe780ddfe502b74b65190
1 file changed +28 -27
portal/server.go
+28 -27
@@ -231,39 +231,14 @@ func (s *Server) Start(ctx context.Context, apiMux *http.ServeMux) error {
231 s.group = group
232
233 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 {
235 acmeManager.Stop()
236 _ = apiServer.Close()
237 _ = apiCloser.Close()
238 _ = sniListener.Close()
239 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
241 }
266 - s.overlay = overlay
242 }
243
244 group.Go(s.runAPIServer)
@@ -516,6 +491,32 @@ func (s *Server) runSNIListener(ctx context.Context) error {
491 }
492 }
493
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 +
520 func (s *Server) startQUICTunnelListener(apiTLS keyless.TLSMaterialConfig) error {
521 if len(apiTLS.KeyPEM) == 0 {
522 return fmt.Errorf("quic tunnel requires api tls key")