Fork to maintain patches against the official gitea for https://code.ceondo.com https://github.com/go-gitea/gitea

web.go 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package cmd
  5. import (
  6. "fmt"
  7. "net"
  8. "net/http"
  9. "net/http/fcgi"
  10. _ "net/http/pprof" // Used for debugging if enabled and a web server is running
  11. "os"
  12. "strings"
  13. "code.gitea.io/gitea/modules/log"
  14. "code.gitea.io/gitea/modules/setting"
  15. "code.gitea.io/gitea/routers"
  16. "code.gitea.io/gitea/routers/routes"
  17. context2 "github.com/gorilla/context"
  18. "github.com/urfave/cli"
  19. )
  20. // CmdWeb represents the available web sub-command.
  21. var CmdWeb = cli.Command{
  22. Name: "web",
  23. Usage: "Start Gitea web server",
  24. Description: `Gitea web server is the only thing you need to run,
  25. and it takes care of all the other things for you`,
  26. Action: runWeb,
  27. Flags: []cli.Flag{
  28. cli.StringFlag{
  29. Name: "port, p",
  30. Value: "3000",
  31. Usage: "Temporary port number to prevent conflict",
  32. },
  33. cli.StringFlag{
  34. Name: "config, c",
  35. Value: "custom/conf/app.ini",
  36. Usage: "Custom configuration file path",
  37. },
  38. cli.StringFlag{
  39. Name: "pid, P",
  40. Value: "/var/run/gitea.pid",
  41. Usage: "Custom pid file path",
  42. },
  43. },
  44. }
  45. func runWeb(ctx *cli.Context) error {
  46. if ctx.IsSet("config") {
  47. setting.CustomConf = ctx.String("config")
  48. }
  49. if ctx.IsSet("pid") {
  50. setting.CustomPID = ctx.String("pid")
  51. }
  52. routers.GlobalInit()
  53. m := routes.NewMacaron()
  54. routes.RegisterRoutes(m)
  55. // Flag for port number in case first time run conflict.
  56. if ctx.IsSet("port") {
  57. setting.AppURL = strings.Replace(setting.AppURL, setting.HTTPPort, ctx.String("port"), 1)
  58. setting.HTTPPort = ctx.String("port")
  59. }
  60. var listenAddr string
  61. if setting.Protocol == setting.UnixSocket {
  62. listenAddr = fmt.Sprintf("%s", setting.HTTPAddr)
  63. } else {
  64. listenAddr = fmt.Sprintf("%s:%s", setting.HTTPAddr, setting.HTTPPort)
  65. }
  66. log.Info("Listen: %v://%s%s", setting.Protocol, listenAddr, setting.AppSubURL)
  67. if setting.LFS.StartServer {
  68. log.Info("LFS server enabled")
  69. }
  70. if setting.EnablePprof {
  71. go func() {
  72. log.Info("%v", http.ListenAndServe("localhost:6060", nil))
  73. }()
  74. }
  75. var err error
  76. switch setting.Protocol {
  77. case setting.HTTP:
  78. err = runHTTP(listenAddr, context2.ClearHandler(m))
  79. case setting.HTTPS:
  80. err = runHTTPS(listenAddr, setting.CertFile, setting.KeyFile, context2.ClearHandler(m))
  81. case setting.FCGI:
  82. listener, err := net.Listen("tcp", listenAddr)
  83. if err != nil {
  84. log.Fatal(4, "Failed to bind %s", listenAddr, err)
  85. }
  86. defer listener.Close()
  87. err = fcgi.Serve(listener, context2.ClearHandler(m))
  88. case setting.UnixSocket:
  89. if err := os.Remove(listenAddr); err != nil && !os.IsNotExist(err) {
  90. log.Fatal(4, "Failed to remove unix socket directory %s: %v", listenAddr, err)
  91. }
  92. var listener *net.UnixListener
  93. listener, err = net.ListenUnix("unix", &net.UnixAddr{Name: listenAddr, Net: "unix"})
  94. if err != nil {
  95. break // Handle error after switch
  96. }
  97. // FIXME: add proper implementation of signal capture on all protocols
  98. // execute this on SIGTERM or SIGINT: listener.Close()
  99. if err = os.Chmod(listenAddr, os.FileMode(setting.UnixSocketPermission)); err != nil {
  100. log.Fatal(4, "Failed to set permission of unix socket: %v", err)
  101. }
  102. err = http.Serve(listener, context2.ClearHandler(m))
  103. default:
  104. log.Fatal(4, "Invalid protocol: %s", setting.Protocol)
  105. }
  106. if err != nil {
  107. log.Fatal(4, "Failed to start server: %v", err)
  108. }
  109. return nil
  110. }