fathom/pkg/cli/server.go

97 lines
1.9 KiB
Go

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
}