- Создана новая структура проекта с разделением на пакеты - Добавлены интерфейсы для всех сервисов (Git, Quartz, Files, Build) - Реализован Dependency Injection для сервисов - Добавлены middleware для логирования, Request ID и Response Time - Создан пакет конфигурации с валидацией - Улучшено логирование через интерфейс - Добавлены обработчики HTTP в отдельных пакетах - Создана структура для тестирования - Добавлены конфигурационные файлы и документация
77 lines
2.2 KiB
Go
77 lines
2.2 KiB
Go
package main
|
||
|
||
import (
|
||
"context"
|
||
"net/http"
|
||
"os"
|
||
"os/signal"
|
||
"syscall"
|
||
"time"
|
||
|
||
"go-webhook-server/api"
|
||
"go-webhook-server/internal/config"
|
||
"go-webhook-server/internal/handlers"
|
||
"go-webhook-server/internal/services"
|
||
"go-webhook-server/pkg/logger"
|
||
)
|
||
|
||
func main() {
|
||
// Инициализация логгера
|
||
log := logger.New()
|
||
log.Info("Starting go-webhook-server...")
|
||
|
||
// Загрузка конфигурации
|
||
cfg := config.Load()
|
||
if err := cfg.Validate(); err != nil {
|
||
log.Fatalf("Configuration validation failed: %v", err)
|
||
}
|
||
|
||
log.Infof("Configuration loaded: Port=%s, ObsidianPath=%s, QuartzPath=%s, PublicPath=%s, GitBranch=%s, GitRemote=%s",
|
||
cfg.Server.Port, cfg.Paths.Obsidian, cfg.Paths.Quartz, cfg.Paths.Public, cfg.Git.Branch, cfg.Git.Remote)
|
||
|
||
// Инициализация сервисов
|
||
gitService := services.NewGitService(cfg, log)
|
||
quartzService := services.NewQuartzService(cfg, log)
|
||
fileService := services.NewFileService(cfg, log)
|
||
buildService := services.NewBuildService(cfg, log, gitService, quartzService, fileService)
|
||
|
||
// Инициализация обработчиков
|
||
webhookHandler := handlers.NewWebhookHandler(buildService, log)
|
||
healthHandler := handlers.NewHealthHandler(log)
|
||
|
||
// Настройка роутов
|
||
router := api.SetupRoutes(webhookHandler, healthHandler, log)
|
||
|
||
// Создание HTTP сервера
|
||
addr := ":" + cfg.Server.Port
|
||
server := &http.Server{
|
||
Addr: addr,
|
||
Handler: router,
|
||
}
|
||
|
||
// Запуск сервера в горутине
|
||
go func() {
|
||
log.Infof("Starting webhook server on port %s", cfg.Server.Port)
|
||
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||
log.Fatalf("Failed to start server: %v", err)
|
||
}
|
||
}()
|
||
|
||
// Ожидаем сигнал для graceful shutdown
|
||
quit := make(chan os.Signal, 1)
|
||
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
|
||
<-quit
|
||
|
||
log.Info("Shutting down server...")
|
||
|
||
// Graceful shutdown с таймаутом
|
||
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(cfg.Server.Timeout)*time.Second)
|
||
defer cancel()
|
||
|
||
if err := server.Shutdown(ctx); err != nil {
|
||
log.Errorf("Server forced to shutdown: %v", err)
|
||
}
|
||
|
||
log.Info("Server exited")
|
||
}
|