97 lines
2.1 KiB
Go
Executable File
97 lines
2.1 KiB
Go
Executable File
package bin
|
|
|
|
import (
|
|
"context"
|
|
"github.com/pkg/errors"
|
|
"log/slog"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"git.zhouxhere.com/zhouxhere/maptile/config"
|
|
_ "git.zhouxhere.com/zhouxhere/maptile/log"
|
|
"git.zhouxhere.com/zhouxhere/maptile/server"
|
|
"git.zhouxhere.com/zhouxhere/maptile/store"
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
var rootCmd = &cobra.Command{
|
|
Use: "maptile",
|
|
Short: "一个简单的地图vector tile 管理",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
config := &config.Config{
|
|
Mode: viper.GetString("mode"),
|
|
Addr: viper.GetString("addr"),
|
|
Port: viper.GetInt("port"),
|
|
DSN: viper.GetString("dsn"),
|
|
}
|
|
|
|
if err := config.Validate(); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
store, err := store.NewStore(config.DSN)
|
|
|
|
if err != nil {
|
|
cancel()
|
|
slog.Error("store init failed", "err", err)
|
|
return
|
|
}
|
|
|
|
if err := store.Migrate(ctx); err != nil {
|
|
cancel()
|
|
slog.Error("store migrate failed", "err", err)
|
|
return
|
|
}
|
|
|
|
s := server.NewServer(ctx, config, store)
|
|
|
|
c := make(chan os.Signal, 1)
|
|
|
|
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
|
|
|
if err := s.Start(ctx); err != nil {
|
|
if !errors.Is(err, http.ErrServerClosed) {
|
|
slog.Error("server start failed", "err", err)
|
|
cancel()
|
|
}
|
|
}
|
|
|
|
go func() {
|
|
<-c
|
|
s.Stop(ctx)
|
|
cancel()
|
|
}()
|
|
|
|
<-ctx.Done()
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
viper.SetDefault("mode", "dev")
|
|
viper.SetDefault("addr", "0.0.0.0")
|
|
viper.SetDefault("port", 8080)
|
|
|
|
rootCmd.PersistentFlags().String("mode", "dev", `mode of server, can be "prod" or "dev"`)
|
|
rootCmd.PersistentFlags().String("addr", "0.0.0.0", "address of server")
|
|
rootCmd.PersistentFlags().Int("port", 8080, "port of server")
|
|
rootCmd.PersistentFlags().String("dsn", "postgresql://maptile:maptile_passwd@localhost:5432/maptile?sslmode=disable", "database source name")
|
|
|
|
if err := viper.BindPFlags(rootCmd.PersistentFlags()); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
viper.SetEnvPrefix("maptile")
|
|
viper.AutomaticEnv()
|
|
}
|
|
|
|
func RunCMD() {
|
|
if err := rootCmd.Execute(); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|