diff --git a/http/web.go b/http/web.go index 686576f..4480dd1 100644 --- a/http/web.go +++ b/http/web.go @@ -18,6 +18,8 @@ import ( _ "net/http/pprof" + "golang.org/x/exp/maps" + "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" @@ -362,7 +364,13 @@ func Listen() { } } - for name, l := range mox.Conf.Static.Listeners { + // Initialize listeners in deterministic order for the same potential error + // messages. + names := maps.Keys(mox.Conf.Static.Listeners) + sort.Strings(names) + for _, name := range names { + l := mox.Conf.Static.Listeners[name] + portServe := map[int]*serve{} var ensureServe func(https bool, port int, kind string) *serve @@ -546,7 +554,10 @@ func Listen() { ensureManagerHosts[m] = hosts } - for port, srv := range portServe { + ports := maps.Keys(portServe) + sort.Ints(ports) + for _, port := range ports { + srv := portServe[port] sort.Slice(srv.PathHandlers, func(i, j int) bool { a := srv.PathHandlers[i].Path b := srv.PathHandlers[j].Path diff --git a/imapserver/server.go b/imapserver/server.go index ea79ee2..75dd404 100644 --- a/imapserver/server.go +++ b/imapserver/server.go @@ -57,11 +57,12 @@ import ( "strings" "time" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" "golang.org/x/exp/maps" "golang.org/x/exp/slices" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" + "github.com/mjl-/bstore" "github.com/mjl-/mox/config" @@ -307,7 +308,11 @@ type msgseq uint32 // Listen initializes all imap listeners for the configuration, and stores them for Serve to start them. func Listen() { - for name, listener := range mox.Conf.Static.Listeners { + names := maps.Keys(mox.Conf.Static.Listeners) + sort.Strings(names) + for _, name := range names { + listener := mox.Conf.Static.Listeners[name] + var tlsConfig *tls.Config if listener.TLS != nil { tlsConfig = listener.TLS.Config diff --git a/quickstart.go b/quickstart.go index 4e09967..faf0bb9 100644 --- a/quickstart.go +++ b/quickstart.go @@ -457,6 +457,17 @@ listed in more DNS block lists, visit: fmt.Printf(" OK\n") } } + + if len(publicIPs) == 0 { + log.Printf(`WARNING: Could not find your public IP address(es). The "public" listener is +configured to listen on 0.0.0.0 (IPv4) and :: (IPv6). If you don't change these +to your actual public IP addresses, you will likely get "address in use" errors +when starting mox because the "internal" listener binds to a specific IP +address on the same port(s). + +`) + } + fmt.Printf("\n") user := "mox" diff --git a/smtpserver/server.go b/smtpserver/server.go index 3ed688c..324765c 100644 --- a/smtpserver/server.go +++ b/smtpserver/server.go @@ -19,11 +19,14 @@ import ( "net" "os" "runtime/debug" + "sort" "strconv" "strings" "sync" "time" + "golang.org/x/exp/maps" + "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" @@ -175,7 +178,11 @@ func durationDefault(delay *time.Duration, def time.Duration) time.Duration { // Listen initializes network listeners for incoming SMTP connection. // The listeners are stored for a later call to Serve. func Listen() { - for name, listener := range mox.Conf.Static.Listeners { + names := maps.Keys(mox.Conf.Static.Listeners) + sort.Strings(names) + for _, name := range names { + listener := mox.Conf.Static.Listeners[name] + var tlsConfig *tls.Config if listener.TLS != nil { tlsConfig = listener.TLS.Config