Ctrl K
ComunidadGuías…

pkg/cli/server.go

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package cli

import (
	"net/http"
	"strconv"
	"time"

	log "github.com/sirupsen/logrus"
	"github.com/urfave/cli"

	"github.com/gorilla/handlers"
	"github.com/usefathom/fathom/pkg/api"
	"golang.org/x/crypto/acme/autocert"
)

var serverCmd = cli.Command{
	Name:    "server",
	Aliases: []string{"s"},
	Usage:   "start the fathom web server",
	Action:  server,
	Flags: []cli.Flag{
		cli.StringFlag{
			EnvVar: "FATHOM_SERVER_ADDR,PORT",
			Name:   "addr,port",
			Usage:  "server address",
			Value:  ":8080",
		},

		cli.BoolFlag{
			EnvVar: "FATHOM_LETS_ENCRYPT",
			Name:   "lets-encrypt",
		},

		cli.BoolFlag{
			EnvVar: "FATHOM_GZIP",
			Name:   "gzip",
			Usage:  "enable gzip compression",
		},

		cli.StringFlag{
			EnvVar: "FATHOM_HOSTNAME",
			Name:   "hostname",
			Usage:  "domain when using --lets-encrypt",
		},

		cli.BoolFlag{
			EnvVar: "FATHOM_DEBUG",
			Name:   "debug, d",
		},
	},
}

func server(c *cli.Context) error {
	var h http.Handler
	a := api.New(app.database, app.config.Secret)
	h = a.Routes()

	// set debug log level if --debug was passed
	if c.Bool("debug") {
		log.SetLevel(log.DebugLevel)
	} else {
		log.SetLevel(log.WarnLevel)
	}

	// set gzip compression if --gzip was passed
	if c.Bool("gzip") {
		h = handlers.CompressHandler(h)
	}

	// if addr looks like a number, prefix with :
	addr := c.String("addr")
	if _, err := strconv.Atoi(addr); err == nil {
		addr = ":" + addr
	}

	// start server without letsencrypt / tls enabled
	if !c.Bool("lets-encrypt") {
		// start listening
		server := &http.Server{
			Addr:         addr,
			Handler:      h,
			ReadTimeout:  10 * time.Second,
			WriteTimeout: 10 * time.Second,
		}

		log.Infof("Server is now listening on %s", server.Addr)
		log.Fatal(server.ListenAndServe())
		return nil
	}

	// start server with autocert (letsencrypt)
	hostname := c.String("hostname")
	log.Infof("Server is now listening on %s:443", hostname)
	log.Fatal(http.Serve(autocert.NewListener(hostname), h))
	return nil
}