feat: 添加环境变量管理工具和部署配置改版
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m33s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m33s
主要改动: - 新增交互式环境配置脚本 (scripts/setup-env.sh) - 新增本地启动快捷脚本 (scripts/run-local.sh) - 新增环境变量模板文件 (.env.example) - 部署模式改版:使用嵌入式配置 + 环境变量覆盖 - 添加对象存储功能支持 - 改进 IoT 卡片导入任务 - 优化 OpenAPI 文档生成 - 删除旧的配置文件,改用嵌入式默认配置
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strconv"
|
||||
@@ -22,38 +21,48 @@ import (
|
||||
"github.com/break/junhong_cmp_fiber/internal/routes"
|
||||
"github.com/break/junhong_cmp_fiber/internal/service/verification"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/auth"
|
||||
pkgbootstrap "github.com/break/junhong_cmp_fiber/pkg/bootstrap"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/config"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/database"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/logger"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/queue"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/storage"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// 1. 初始化配置
|
||||
cfg := initConfig()
|
||||
|
||||
// 2. 初始化日志
|
||||
// 2. 初始化目录
|
||||
if _, err := pkgbootstrap.EnsureDirectories(cfg, nil); err != nil {
|
||||
panic("初始化目录失败: " + err.Error())
|
||||
}
|
||||
|
||||
// 3. 初始化日志
|
||||
appLogger := initLogger(cfg)
|
||||
defer func() {
|
||||
_ = logger.Sync()
|
||||
}()
|
||||
|
||||
// 3. 初始化数据库
|
||||
// 4. 初始化数据库
|
||||
db := initDatabase(cfg, appLogger)
|
||||
defer closeDatabase(db, appLogger)
|
||||
|
||||
// 4. 初始化 Redis
|
||||
// 5. 初始化 Redis
|
||||
redisClient := initRedis(cfg, appLogger)
|
||||
defer closeRedis(redisClient, appLogger)
|
||||
|
||||
// 5. 初始化队列客户端
|
||||
// 6. 初始化队列客户端
|
||||
queueClient := initQueue(redisClient, appLogger)
|
||||
defer closeQueue(queueClient, appLogger)
|
||||
|
||||
// 6. 初始化认证管理器
|
||||
// 7. 初始化认证管理器
|
||||
jwtManager, tokenManager, verificationSvc := initAuthComponents(cfg, redisClient, appLogger)
|
||||
|
||||
// 7. 初始化所有业务组件(通过 Bootstrap)
|
||||
// 8. 初始化对象存储服务(可选)
|
||||
storageSvc := initStorage(cfg, appLogger)
|
||||
|
||||
// 9. 初始化所有业务组件(通过 Bootstrap)
|
||||
result, err := bootstrap.Bootstrap(&bootstrap.Dependencies{
|
||||
DB: db,
|
||||
Redis: redisClient,
|
||||
@@ -62,30 +71,26 @@ func main() {
|
||||
TokenManager: tokenManager,
|
||||
VerificationService: verificationSvc,
|
||||
QueueClient: queueClient,
|
||||
StorageService: storageSvc,
|
||||
})
|
||||
if err != nil {
|
||||
appLogger.Fatal("初始化业务组件失败", zap.Error(err))
|
||||
}
|
||||
|
||||
// 8. 启动配置监听器
|
||||
watchCtx, cancelWatch := context.WithCancel(context.Background())
|
||||
defer cancelWatch()
|
||||
go config.Watch(watchCtx, appLogger)
|
||||
|
||||
// 9. 创建 Fiber 应用
|
||||
// 10. 创建 Fiber 应用
|
||||
app := createFiberApp(cfg, appLogger)
|
||||
|
||||
// 10. 注册中间件
|
||||
// 11. 注册中间件
|
||||
initMiddleware(app, cfg, appLogger)
|
||||
|
||||
// 11. 注册路由
|
||||
// 12. 注册路由
|
||||
initRoutes(app, cfg, result, queueClient, db, redisClient, appLogger)
|
||||
|
||||
// 12. 生成 OpenAPI 文档
|
||||
// 13. 生成 OpenAPI 文档
|
||||
generateOpenAPIDocs("logs/openapi.yaml", appLogger)
|
||||
|
||||
// 13. 启动服务器
|
||||
startServer(app, cfg, appLogger, cancelWatch)
|
||||
// 14. 启动服务器
|
||||
startServer(app, cfg, appLogger)
|
||||
}
|
||||
|
||||
// initConfig 加载配置
|
||||
@@ -257,9 +262,7 @@ func initRateLimiter(router fiber.Router, cfg *config.Config, appLogger *zap.Log
|
||||
))
|
||||
}
|
||||
|
||||
// startServer 启动服务器
|
||||
func startServer(app *fiber.App, cfg *config.Config, appLogger *zap.Logger, cancelWatch context.CancelFunc) {
|
||||
// 优雅关闭
|
||||
func startServer(app *fiber.App, cfg *config.Config, appLogger *zap.Logger) {
|
||||
quit := make(chan os.Signal, 1)
|
||||
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
|
||||
|
||||
@@ -271,14 +274,9 @@ func startServer(app *fiber.App, cfg *config.Config, appLogger *zap.Logger, canc
|
||||
|
||||
appLogger.Info("服务器已启动", zap.String("address", cfg.Server.Address))
|
||||
|
||||
// 等待关闭信号
|
||||
<-quit
|
||||
appLogger.Info("正在关闭服务器...")
|
||||
|
||||
// 取消配置监听器
|
||||
cancelWatch()
|
||||
|
||||
// 关闭 HTTP 服务器
|
||||
if err := app.ShutdownWithTimeout(cfg.Server.ShutdownTimeout); err != nil {
|
||||
appLogger.Error("强制关闭服务器", zap.Error(err))
|
||||
}
|
||||
@@ -297,3 +295,23 @@ func initAuthComponents(cfg *config.Config, redisClient *redis.Client, appLogger
|
||||
|
||||
return jwtManager, tokenManager, verificationSvc
|
||||
}
|
||||
|
||||
func initStorage(cfg *config.Config, appLogger *zap.Logger) *storage.Service {
|
||||
if cfg.Storage.Provider == "" || cfg.Storage.S3.Endpoint == "" {
|
||||
appLogger.Info("对象存储未配置,跳过初始化")
|
||||
return nil
|
||||
}
|
||||
|
||||
provider, err := storage.NewS3Provider(&cfg.Storage)
|
||||
if err != nil {
|
||||
appLogger.Warn("初始化对象存储失败,功能将不可用", zap.Error(err))
|
||||
return nil
|
||||
}
|
||||
|
||||
appLogger.Info("对象存储已初始化",
|
||||
zap.String("provider", cfg.Storage.Provider),
|
||||
zap.String("bucket", cfg.Storage.S3.Bucket),
|
||||
)
|
||||
|
||||
return storage.NewService(provider, &cfg.Storage)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user