package main import ( "embed" "fmt" "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" _ "github.com/joho/godotenv/autoload" "github.com/songquanpeng/one-api/common" "github.com/songquanpeng/one-api/common/client" "github.com/songquanpeng/one-api/common/config" "github.com/songquanpeng/one-api/common/logger" "github.com/songquanpeng/one-api/controller" "github.com/songquanpeng/one-api/middleware" "github.com/songquanpeng/one-api/model" "github.com/songquanpeng/one-api/relay/adaptor/openai" "github.com/songquanpeng/one-api/router" "os" "strconv" ) //go:embed web/build/* var buildFS embed.FS func main() { common.Init() logger.SetupLogger() logger.SysLogf("One API %s started", common.Version) if os.Getenv("GIN_MODE") != gin.DebugMode { gin.SetMode(gin.ReleaseMode) } if config.DebugEnabled { logger.SysLog("running in debug mode") } // Initialize SQL Database model.InitDB() model.InitLogDB() var err error err = model.CreateRootAccountIfNeed() if err != nil { logger.FatalLog("database init error: " + err.Error()) } defer func() { err := model.CloseDB() if err != nil { logger.FatalLog("failed to close database: " + err.Error()) } }() // Initialize Redis err = common.InitRedisClient() if err != nil { logger.FatalLog("failed to initialize Redis: " + err.Error()) } // Initialize options model.InitOptionMap() logger.SysLog(fmt.Sprintf("using theme %s", config.Theme)) if common.RedisEnabled { // for compatibility with old versions config.MemoryCacheEnabled = true } if config.MemoryCacheEnabled { logger.SysLog("memory cache enabled") logger.SysLog(fmt.Sprintf("sync frequency: %d seconds", config.SyncFrequency)) model.InitChannelCache() } if config.MemoryCacheEnabled { go model.SyncOptions(config.SyncFrequency) go model.SyncChannelCache(config.SyncFrequency) } if os.Getenv("CHANNEL_TEST_FREQUENCY") != "" { frequency, err := strconv.Atoi(os.Getenv("CHANNEL_TEST_FREQUENCY")) if err != nil { logger.FatalLog("failed to parse CHANNEL_TEST_FREQUENCY: " + err.Error()) } go controller.AutomaticallyTestChannels(frequency) } if os.Getenv("BATCH_UPDATE_ENABLED") == "true" { config.BatchUpdateEnabled = true logger.SysLog("batch update enabled with interval " + strconv.Itoa(config.BatchUpdateInterval) + "s") model.InitBatchUpdater() } if config.EnableMetric { logger.SysLog("metric enabled, will disable channel if too much request failed") } openai.InitTokenEncoders() client.Init() // Initialize HTTP server server := gin.New() server.Use(gin.Recovery()) // This will cause SSE not to work!!! //server.Use(gzip.Gzip(gzip.DefaultCompression)) server.Use(middleware.RequestId()) middleware.SetUpLogger(server) // Initialize session store store := cookie.NewStore([]byte(config.SessionSecret)) server.Use(sessions.Sessions("session", store)) router.SetRouter(server, buildFS) var port = os.Getenv("PORT") if port == "" { port = strconv.Itoa(*common.Port) } logger.SysLogf("server started on http://localhost:%s", port) err = server.Run(":" + port) if err != nil { logger.FatalLog("failed to start HTTP server: " + err.Error()) } }