setup_server.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package http_server
  2. import (
  3. "flag"
  4. "fmt"
  5. log "github.com/sirupsen/logrus"
  6. "github.com/spf13/cast"
  7. "io/fs"
  8. "net/http"
  9. "os"
  10. "pmail/config"
  11. "pmail/controllers"
  12. "pmail/utils/ip"
  13. "strings"
  14. "time"
  15. )
  16. // 项目初始化引导用的服务,初始化引导结束后即退出
  17. var setupServer *http.Server
  18. func SetupStart() {
  19. mux := http.NewServeMux()
  20. fe, err := fs.Sub(local, "dist")
  21. if err != nil {
  22. panic(err)
  23. }
  24. mux.Handle("/", http.FileServer(http.FS(fe)))
  25. mux.HandleFunc("/api/", contextIterceptor(controllers.Setup))
  26. // 挑战请求类似这样 /.well-known/acme-challenge/QPyMAyaWw9s5JvV1oruyqWHG7OqkHMJEHPoUz2046KM
  27. mux.HandleFunc("/.well-known/", controllers.AcmeChallenge)
  28. HttpPort := 80
  29. flag.IntVar(&HttpPort, "p", 80, "初始化阶段Http服务端口")
  30. flag.Parse()
  31. if HttpPort == 80 {
  32. envs := os.Environ()
  33. for _, env := range envs {
  34. if strings.HasPrefix(env, "setup_port=") {
  35. HttpPort = cast.ToInt(strings.TrimSpace(strings.ReplaceAll(env, "setup_port=", "")))
  36. }
  37. }
  38. }
  39. if HttpPort <= 0 || HttpPort > 65535 {
  40. HttpPort = 80
  41. }
  42. config.Instance.SetSetupPort(HttpPort)
  43. log.Infof("HttpServer Start On Port :%d", HttpPort)
  44. if HttpPort == 80 {
  45. log.Infof("Please click http://%s to continue.\n", ip.GetIp())
  46. } else {
  47. log.Infof("Please click http://%s:%d to continue.", ip.GetIp(), HttpPort)
  48. }
  49. setupServer = &http.Server{
  50. Addr: fmt.Sprintf(":%d", HttpPort),
  51. Handler: mux,
  52. ReadTimeout: time.Second * 60,
  53. WriteTimeout: time.Second * 60,
  54. }
  55. err = setupServer.ListenAndServe()
  56. if err != nil && err != http.ErrServerClosed {
  57. panic(err)
  58. }
  59. }
  60. func SetupStop() {
  61. err := setupServer.Close()
  62. log.Infof("Setup End!")
  63. if err != nil {
  64. panic(err)
  65. }
  66. }