setup_server.go 1.4 KB

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