setup_server.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package http_server
  2. import (
  3. "fmt"
  4. "io/fs"
  5. "net"
  6. "net/http"
  7. "pmail/controllers"
  8. "time"
  9. )
  10. var ip string
  11. // 项目初始化引导用的服务,初始化引导结束后即退出
  12. var setupServer *http.Server
  13. func SetupStart() {
  14. mux := http.NewServeMux()
  15. fe, err := fs.Sub(local, "dist")
  16. if err != nil {
  17. panic(err)
  18. }
  19. mux.Handle("/", http.FileServer(http.FS(fe)))
  20. mux.HandleFunc("/api/", contextIterceptor(controllers.Setup))
  21. // 挑战请求类似这样 /.well-known/acme-challenge/QPyMAyaWw9s5JvV1oruyqWHG7OqkHMJEHPoUz2046KM
  22. mux.HandleFunc("/.well-known/", controllers.AcmeChallenge)
  23. setupServer = &http.Server{
  24. Addr: fmt.Sprintf(":%d", HttpPort),
  25. Handler: mux,
  26. ReadTimeout: time.Second * 60,
  27. WriteTimeout: time.Second * 60,
  28. }
  29. err = setupServer.ListenAndServe()
  30. if err != nil && err != http.ErrServerClosed {
  31. panic(err)
  32. }
  33. }
  34. func SetupStop() {
  35. err := setupServer.Close()
  36. if err != nil {
  37. panic(err)
  38. }
  39. }
  40. func getLocalIP() string {
  41. ip := "127.0.0.1"
  42. addrs, err := net.InterfaceAddrs()
  43. if err != nil {
  44. return ip
  45. }
  46. for _, a := range addrs {
  47. if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
  48. if ipnet.IP.To4() != nil {
  49. ip = ipnet.IP.String()
  50. break
  51. }
  52. }
  53. }
  54. return ip
  55. }