Embed phoenix and serve it
So far Phoenix have been embedded into the binary and we can customize the required config based on flags, env variables and optionally via config file. For now I'm embedding the whole Phonix content, optherwise the all-in-one binary `ocis` will get pretty complicated until we add the generate commands to that repo as well and provide a mechanism to inject the embedding.
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
package command
|
||||
|
||||
import (
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
// init defined the default options for viper.
|
||||
func init() {
|
||||
viper.SetDefault("debug.addr", "0.0.0.0:8090")
|
||||
viper.SetDefault("debug.token", "")
|
||||
viper.SetDefault("debug.pprof", false)
|
||||
|
||||
viper.SetDefault("http.addr", "0.0.0.0:8080")
|
||||
viper.SetDefault("http.root", "/")
|
||||
|
||||
viper.SetDefault("asset.path", "")
|
||||
|
||||
viper.SetDefault("config.custom", "")
|
||||
viper.SetDefault("config.server", "")
|
||||
viper.SetDefault("config.theme", "owncloud")
|
||||
viper.SetDefault("config.version", "0.1.0")
|
||||
viper.SetDefault("config.client", "")
|
||||
viper.SetDefault("config.apps", []string{"files"})
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
package command
|
||||
|
||||
import (
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
func init() {
|
||||
viper.SetDefault("server.addr", "0.0.0.0:8080")
|
||||
viper.SetDefault("metrics.addr", "0.0.0.0:8090")
|
||||
}
|
||||
@@ -14,14 +14,14 @@ func Health() *cobra.Command {
|
||||
Long: "",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
log.Info().
|
||||
Str("addr", viper.GetString("metrics.addr")).
|
||||
Str("addr", viper.GetString("debug.addr")).
|
||||
Msg("Executed health command")
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().String("metrics-addr", "", "Address to metrics endpoint")
|
||||
viper.BindPFlag("metrics.addr", cmd.Flags().Lookup("metrics-addr"))
|
||||
viper.BindEnv("metrics.addr", "PHOENIX_METRICS_ADDR")
|
||||
cmd.Flags().String("debug-addr", "", "Address to debug endpoint")
|
||||
viper.BindPFlag("debug.addr", cmd.Flags().Lookup("debug-addr"))
|
||||
viper.BindEnv("debug.addr", "PHOENIX_DEBUG_ADDR")
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
@@ -45,6 +45,7 @@ func Root() *cobra.Command {
|
||||
return cmd
|
||||
}
|
||||
|
||||
// setupLogger prepares the logger.
|
||||
func setupLogger() {
|
||||
switch strings.ToLower(viper.GetString("log.level")) {
|
||||
case "panic":
|
||||
@@ -73,6 +74,7 @@ func setupLogger() {
|
||||
}
|
||||
}
|
||||
|
||||
// setupConfig prepares the config
|
||||
func setupConfig() {
|
||||
viper.SetConfigName("phoenix")
|
||||
|
||||
@@ -84,7 +86,7 @@ func setupConfig() {
|
||||
switch err.(type) {
|
||||
case viper.ConfigFileNotFoundError:
|
||||
log.Debug().
|
||||
Msg("Continue without config")
|
||||
Msg("Initializing without config file")
|
||||
case viper.UnsupportedConfigError:
|
||||
log.Fatal().
|
||||
Msg("Unsupported config type")
|
||||
+150
-7
@@ -1,6 +1,15 @@
|
||||
package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"time"
|
||||
|
||||
"github.com/oklog/run"
|
||||
"github.com/owncloud/ocis-phoenix/pkg/router/debug"
|
||||
"github.com/owncloud/ocis-phoenix/pkg/router/server"
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
@@ -12,16 +21,150 @@ func Server() *cobra.Command {
|
||||
Use: "server",
|
||||
Short: "Start integrated server",
|
||||
Long: "",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
log.Info().
|
||||
Str("addr", viper.GetString("server.addr")).
|
||||
Msg("Executed server command")
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
var gr run.Group
|
||||
|
||||
{
|
||||
server := &http.Server{
|
||||
Addr: viper.GetString("debug.addr"),
|
||||
Handler: debug.Router(
|
||||
debug.WithToken(viper.GetString("debug.token")),
|
||||
debug.WithPprof(viper.GetBool("debug.pprof")),
|
||||
),
|
||||
ReadTimeout: 5 * time.Second,
|
||||
WriteTimeout: 10 * time.Second,
|
||||
}
|
||||
|
||||
gr.Add(func() error {
|
||||
log.Info().
|
||||
Str("addr", viper.GetString("debug.addr")).
|
||||
Msg("Starting debug server")
|
||||
|
||||
return server.ListenAndServe()
|
||||
}, func(reason error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
|
||||
if err := server.Shutdown(ctx); err != nil {
|
||||
log.Error().
|
||||
Err(err).
|
||||
Msg("Failed to shutdown debug server gracefully")
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
log.Info().
|
||||
Err(reason).
|
||||
Msg("Shutdown debug server gracefully")
|
||||
})
|
||||
}
|
||||
|
||||
{
|
||||
server := &http.Server{
|
||||
Addr: viper.GetString("http.addr"),
|
||||
Handler: server.Router(
|
||||
server.WithRoot(viper.GetString("http.root")),
|
||||
server.WithPath(viper.GetString("asset.path")),
|
||||
server.WithCustom(viper.GetString("config.custom")),
|
||||
server.WithServer(viper.GetString("config.server")),
|
||||
server.WithTheme(viper.GetString("config.theme")),
|
||||
server.WithVersion(viper.GetString("config.version")),
|
||||
server.WithClient(viper.GetString("config.client")),
|
||||
server.WithApps(viper.GetStringSlice("config.apps")),
|
||||
),
|
||||
ReadTimeout: 5 * time.Second,
|
||||
WriteTimeout: 10 * time.Second,
|
||||
}
|
||||
|
||||
gr.Add(func() error {
|
||||
log.Info().
|
||||
Str("addr", viper.GetString("http.addr")).
|
||||
Msg("Starting http server")
|
||||
|
||||
return server.ListenAndServe()
|
||||
}, func(reason error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
|
||||
if err := server.Shutdown(ctx); err != nil {
|
||||
log.Error().
|
||||
Err(err).
|
||||
Msg("Failed to shutdown http server gracefully")
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
log.Info().
|
||||
Err(reason).
|
||||
Msg("Shutdown http server gracefully")
|
||||
})
|
||||
}
|
||||
|
||||
{
|
||||
stop := make(chan os.Signal, 1)
|
||||
|
||||
gr.Add(func() error {
|
||||
signal.Notify(stop, os.Interrupt)
|
||||
|
||||
<-stop
|
||||
|
||||
return nil
|
||||
}, func(err error) {
|
||||
close(stop)
|
||||
})
|
||||
}
|
||||
|
||||
return gr.Run()
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().String("server-addr", "", "Address to bind the server")
|
||||
viper.BindPFlag("server.addr", cmd.Flags().Lookup("server-addr"))
|
||||
viper.BindEnv("server.addr", "PHOENIX_SERVER_ADDR")
|
||||
cmd.Flags().String("debug-addr", "", "Address to bind debug server")
|
||||
viper.BindPFlag("debug.addr", cmd.Flags().Lookup("debug-addr"))
|
||||
viper.BindEnv("debug.addr", "PHOENIX_DEBUG_ADDR")
|
||||
|
||||
cmd.Flags().String("debug-token", "", "Token to grant metrics access")
|
||||
viper.BindPFlag("debug.token", cmd.Flags().Lookup("debug-token"))
|
||||
viper.BindEnv("debug.token", "PHOENIX_DEBUG_TOKEN")
|
||||
|
||||
cmd.Flags().Bool("debug-pprof", false, "Enable pprof debugging")
|
||||
viper.BindPFlag("debug.pprof", cmd.Flags().Lookup("debug-pprof"))
|
||||
viper.BindEnv("debug.pprof", "PHOENIX_DEBUG_PPROF")
|
||||
|
||||
cmd.Flags().String("http-addr", "", "Address to bind http server")
|
||||
viper.BindPFlag("http.addr", cmd.Flags().Lookup("http-addr"))
|
||||
viper.BindEnv("http.addr", "PHOENIX_HTTP_ADDR")
|
||||
|
||||
cmd.Flags().String("http-root", "", "Root path for http endpoint")
|
||||
viper.BindPFlag("http.root", cmd.Flags().Lookup("http-root"))
|
||||
viper.BindEnv("http.root", "PHOENIX_HTTP_ROOT")
|
||||
|
||||
cmd.Flags().String("asset-path", "", "Path to custom assets")
|
||||
viper.BindPFlag("asset.path", cmd.Flags().Lookup("asset-path"))
|
||||
viper.BindEnv("asset.path", "PHOENIX_ASSET_PATH")
|
||||
|
||||
cmd.Flags().String("config-custom", "", "Path to custom config")
|
||||
viper.BindPFlag("config.custom", cmd.Flags().Lookup("config-custom"))
|
||||
viper.BindEnv("config.custom", "PHOENIX_CONFIG_CUSTOM")
|
||||
|
||||
cmd.Flags().String("config-server", "", "URL to ownCloud server")
|
||||
viper.BindPFlag("config.server", cmd.Flags().Lookup("config-server"))
|
||||
viper.BindEnv("config.server", "PHOENIX_CONFIG_SERVER")
|
||||
|
||||
cmd.Flags().String("config-theme", "", "The to use with Phoenix")
|
||||
viper.BindPFlag("config.theme", cmd.Flags().Lookup("config-theme"))
|
||||
viper.BindEnv("config.theme", "PHOENIX_CONFIG_THEME")
|
||||
|
||||
cmd.Flags().String("config-version", "", "Config version for Phoenix")
|
||||
viper.BindPFlag("config.version", cmd.Flags().Lookup("config-version"))
|
||||
viper.BindEnv("config.version", "PHOENIX_CONFIG_VERSION")
|
||||
|
||||
cmd.Flags().String("config-client", "", "Client ID used for OAuth2")
|
||||
viper.BindPFlag("config.client", cmd.Flags().Lookup("config-client"))
|
||||
viper.BindEnv("config.client", "PHOENIX_CONFIG_CLIENT")
|
||||
|
||||
cmd.Flags().StringSlice("config-apps", []string{}, "List of enabled apps")
|
||||
viper.BindPFlag("config.apps", cmd.Flags().Lookup("config-apps"))
|
||||
viper.BindEnv("config.apps", "PHOENIX_CONFIG_APPS")
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user