github.com/resonatecoop/id@v1.1.0-43/cmd/run_server.go (about)

     1  package cmd
     2  
     3  import (
     4  	"net/http"
     5  	"time"
     6  
     7  	"github.com/gorilla/csrf"
     8  	"github.com/gorilla/mux"
     9  	"github.com/phyber/negroni-gzip/gzip"
    10  	"github.com/resonatecoop/id/log"
    11  	"github.com/resonatecoop/id/services"
    12  	"github.com/unrolled/secure"
    13  	"github.com/urfave/negroni"
    14  	"gopkg.in/tylerb/graceful.v1"
    15  )
    16  
    17  // RunServer runs the app
    18  func RunServer(configBackend string) error {
    19  	cnf, db, err := initConfigDB(true, true, configBackend)
    20  	if err != nil {
    21  		return err
    22  	}
    23  	defer db.Close()
    24  
    25  	// start the services
    26  	if err := services.Init(cnf, db); err != nil {
    27  		return err
    28  	}
    29  	defer services.Close()
    30  
    31  	secureMiddleware := secure.New(secure.Options{
    32  		FrameDeny:          false, // already set in web/render.go
    33  		ContentTypeNosniff: true,
    34  		BrowserXssFilter:   true,
    35  		IsDevelopment:      cnf.IsDevelopment,
    36  	})
    37  	// Start a classic negroni app
    38  	app := negroni.New()
    39  	app.Use(negroni.NewRecovery())
    40  	app.Use(negroni.NewLogger())
    41  	app.Use(gzip.Gzip(gzip.DefaultCompression))
    42  	app.Use(negroni.HandlerFunc(secureMiddleware.HandlerFuncWithNext))
    43  	app.Use(negroni.NewStatic(http.Dir("public")))
    44  
    45  	// Create a router instance
    46  	router := mux.NewRouter()
    47  
    48  	// Add routes
    49  	services.HealthService.RegisterRoutes(router, "/v1")
    50  	services.OauthService.RegisterRoutes(router, "/v1/oauth")
    51  	services.WebHookService.RegisterRoutes(router, "/webhook")
    52  
    53  	webRoutes := mux.NewRouter()
    54  	services.WebService.RegisterRoutes(webRoutes, "/web")
    55  
    56  	CSRF := csrf.Protect(
    57  		[]byte(cnf.CSRF.Key),
    58  		csrf.Path("/"),
    59  		csrf.SameSite(csrf.SameSiteLaxMode),
    60  		csrf.TrustedOrigins([]string{cnf.CSRF.Origins}),
    61  	)
    62  
    63  	router.PathPrefix("").Handler(negroni.New(
    64  		negroni.Wrap(CSRF(webRoutes)),
    65  	))
    66  
    67  	// Set the router
    68  	app.UseHandler(router)
    69  
    70  	log.INFO.Printf("Starting server on localhost%v", cnf.Port)
    71  	// Run the server on port 8080 by default, gracefully stop on SIGTERM signal
    72  	graceful.Run(cnf.Port, 5*time.Second, app)
    73  
    74  	return nil
    75  }