koh 86a60a7861
Cập nhật cấu hình môi trường production và development
- Thêm file .env.prod với cấu hình chi tiết cho môi trường production
- Cập nhật docker-compose.dev.yml và docker-compose.prod.yml
- Tạo Dockerfile.prod với cấu hình chi tiết cho production
- Bổ sung cấu hình nginx, prometheus, grafana
- Thêm cấu hình backup và monitoring
- Cập nhật README với hướng dẫn chi tiết
2025-03-03 16:31:52 +07:00

94 lines
2.1 KiB
Go
Executable File

package initialize
import (
"context"
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/dungnt11/senflow_app/global"
"github.com/dungnt11/senflow_app/internal/routers"
"github.com/dungnt11/senflow_app/internal/wire"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
// Run khởi động ứng dụng
func Run() {
// Tải cấu hình từ file .env
if err := LoadConfig(); err != nil {
fmt.Printf("Không thể tải cấu hình: %s\n", err.Error())
return
}
// Khởi tạo logger
global.Logger = InitLogger()
if global.Logger == nil {
fmt.Println("Khởi tạo logger thất bại")
return
}
// Khởi tạo database
global.Mdb = InitMysql()
if global.Mdb == nil {
global.Logger.Error("Khởi tạo MySQL thất bại")
return
}
// Khởi tạo router
r := provideRouter()
// Khởi tạo controllers thông qua wire
controllers, err := wire.InitializeControllers()
if err != nil {
global.Logger.Error("Khởi tạo controllers thất bại", zap.Error(err))
return
}
// Khởi tạo routers
routers.InitRouters(r, controllers)
// Khởi động server
port := global.Config.Server.Port
server := &http.Server{
Addr: fmt.Sprintf(":%s", port),
Handler: r,
}
// Khởi động server trong goroutine riêng
go func() {
global.Logger.Info(fmt.Sprintf("Server đang chạy trên cổng %s", port))
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
global.Logger.Error("Server gặp lỗi", zap.Error(err))
}
}()
// Graceful shutdown
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
global.Logger.Info("Đang tắt server...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
global.Logger.Error("Server shutdown gặp lỗi", zap.Error(err))
}
global.Logger.Info("Server đã tắt thành công.")
}
func provideRouter() *gin.Engine {
if global.Config.Server.AppEnv == "local" {
gin.SetMode(gin.DebugMode)
gin.ForceConsoleColor()
return gin.Default()
} else {
gin.SetMode(gin.ReleaseMode)
return gin.New()
}
}