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

web.go 3.4KB

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