75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
package main
|
||
|
||
import (
|
||
"context"
|
||
"log"
|
||
"net/http"
|
||
"os"
|
||
"os/signal"
|
||
"syscall"
|
||
"time"
|
||
|
||
"wz-api/internal/config"
|
||
"wz-api/internal/database"
|
||
"wz-api/internal/router"
|
||
"wz-api/internal/wechat"
|
||
|
||
"wz-api/internal/redis"
|
||
)
|
||
|
||
func main() {
|
||
cfg, err := config.Load()
|
||
if err != nil {
|
||
log.Fatal("load config: ", err)
|
||
}
|
||
config.SetCurrent(cfg)
|
||
log.Printf("CORS 允许源(%d 个): %v", len(cfg.CORSOrigins), cfg.CORSOrigins)
|
||
if err := database.InitMongo(cfg.MongoURI); err != nil {
|
||
log.Fatal("mongodb: ", err)
|
||
}
|
||
defer database.CloseMongo()
|
||
_ = database.Init(cfg.DBDSN)
|
||
|
||
if err := wechat.Init(cfg); err != nil {
|
||
log.Fatal("wechat: ", err)
|
||
}
|
||
if err := wechat.InitTransfer(cfg); err != nil {
|
||
log.Fatal("wechat transfer: ", err)
|
||
}
|
||
if cfg.RedisURL != "" && cfg.RedisURL != "disable" {
|
||
if err := redis.Init(cfg.RedisURL); err != nil {
|
||
log.Printf("redis: 连接失败,跳过(%v)", err)
|
||
} else {
|
||
defer redis.Close()
|
||
}
|
||
}
|
||
|
||
r := router.Setup(cfg)
|
||
srv := &http.Server{
|
||
Addr: ":" + cfg.Port,
|
||
Handler: r,
|
||
}
|
||
|
||
go func() {
|
||
log.Printf("wz-api listen on :%s (mode=%s)", cfg.Port, cfg.Mode)
|
||
log.Printf(" -> 访问地址: http://localhost:%s (健康检查: http://localhost:%s/health)", cfg.Port, cfg.Port)
|
||
if cfg.UploadDir != "" {
|
||
log.Printf(" -> 上传目录: %s", cfg.UploadDir)
|
||
}
|
||
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||
log.Fatal("listen: ", err)
|
||
}
|
||
}()
|
||
|
||
quit := make(chan os.Signal, 1)
|
||
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
|
||
<-quit
|
||
log.Println("shutting down...")
|
||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||
defer cancel()
|
||
if err := srv.Shutdown(ctx); err != nil {
|
||
log.Fatal("server shutdown: ", err)
|
||
}
|
||
log.Println("bye")
|
||
}
|