Files
go-webhook/README.md
Andrey Epifancev fcc65ea850 cleanup: удаление ненужных файлов и переименование
- Удален старый main.go
- Удален старый Dockerfile
- Удален старый Makefile
- Удален старый README.md
- Удален docker-compose.yml
- Удален .air.toml
- Удалены пустые директории (deployments, docs, scripts, tests)
- Переименованы файлы без суффикса -refactored
- Очищена структура проекта
2025-08-11 19:55:23 +04:00

6.3 KiB
Raw Permalink Blame History

Go Webhook Server - Рефакторенная версия

Рефакторенная версия webhook сервера с разделением на пакеты и улучшенной архитектурой.

🏗️ Новая структура проекта

go-webhook-server/
├── cmd/
│   └── server/
│       └── main.go              # Точка входа приложения
├── internal/
│   ├── config/
│   │   └── config.go            # Конфигурация приложения
│   ├── handlers/
│   │   ├── webhook.go           # Обработчик webhook'ов
│   │   └── health.go            # Health check обработчик
│   ├── services/
│   │   ├── build.go             # Основной сервис сборки
│   │   ├── git.go               # Git операции
│   │   ├── quartz.go            # Сборка Quartz
│   │   ├── files.go             # Файловые операции
│   │   └── types.go             # Общие типы
│   └── middleware/
│       └── logging.go           # HTTP логирование
├── pkg/
│   └── logger/
│       └── logger.go            # Интерфейс логгера
├── api/
│   └── routes.go                # Определение роутов
├── configs/
│   └── config.yaml              # YAML конфигурация
├── tests/                       # Тесты
├── scripts/                     # Скрипты
└── docs/                        # Документация

🔧 Основные улучшения

1. Разделение ответственности

  • Config - управление конфигурацией
  • Services - бизнес-логика
  • Handlers - HTTP обработчики
  • Middleware - промежуточное ПО
  • API - определение роутов

2. Интерфейсы и абстракции

type GitService interface {
    UpdateRepository() error
    IsRepositoryExists() bool
}

type QuartzService interface {
    BuildSite() error
    InstallDependencies() error
}

type BuildService interface {
    BuildSite() BuildResult
}

3. Dependency Injection

// Инициализация сервисов
gitService := services.NewGitService(cfg, log)
quartzService := services.NewQuartzService(cfg, log)
fileService := services.NewFileService(cfg, log)
buildService := services.NewBuildService(cfg, log, gitService, quartzService, fileService)

4. Улучшенное логирование

  • Структурированное логирование
  • Request ID для отслеживания
  • Уровни логирования
  • Контекстная информация

5. Middleware

  • RequestIDMiddleware - уникальный ID для каждого запроса
  • ResponseTimeMiddleware - время ответа
  • LoggingMiddleware - детальное логирование HTTP

🚀 Запуск

Локально

cd cmd/server
go run main.go

Сборка

go build -o go-webhook-server cmd/server/main.go

Docker

docker build -t go-webhook-server .
docker run -p 3000:3000 go-webhook-server

📝 Конфигурация

Переменные окружения

PORT=3000
OBSIDIAN_PATH=/obsidian
QUARTZ_PATH=/quartz
PUBLIC_PATH=/public
GIT_BRANCH=main
GIT_REMOTE=origin
SERVER_TIMEOUT=30

YAML конфигурация

server:
  port: "3000"
  timeout: 30

paths:
  obsidian: "/obsidian"
  quartz: "/quartz"
  public: "/public"

git:
  branch: "main"
  remote: "origin"

🧪 Тестирование

Unit тесты

go test ./internal/...

Integration тесты

go test ./tests/integration/...

🔄 API эндпоинты

POST /webhook

Запускает процесс сборки сайта.

Ответ:

{
  "status": "accepted",
  "message": "Build process started",
  "request_id": "20250127103000-abc123",
  "timestamp": "2025-01-27T10:30:00Z"
}

GET /health

Проверка состояния сервиса.

Ответ:

{
  "status": "ok",
  "timestamp": "2025-01-27T10:30:00Z",
  "service": "go-webhook-server",
  "version": "1.0.0",
  "request_id": "20250127103000-abc123"
}

📊 Мониторинг

Заголовки ответа

  • X-Request-ID - уникальный ID запроса
  • X-Response-Time - время ответа

Логирование

  • Все HTTP запросы логируются с деталями
  • Request ID для отслеживания цепочки запросов
  • Структурированные логи в формате JSON

🚀 Преимущества новой архитектуры

  1. Тестируемость - легко писать unit тесты
  2. Переиспользование - компоненты можно использовать в других проектах
  3. Читаемость - код легче понимать и поддерживать
  4. Расширяемость - проще добавлять новую функциональность
  5. Соответствие стандартам - структура соответствует Go best practices
  6. Dependency Injection - легко заменять реализации
  7. Интерфейсы - четкое разделение контрактов

🔮 Планы развития

  • Добавление метрик Prometheus
  • Конфигурация через файлы
  • Graceful shutdown для сборки
  • Очередь сборок
  • Уведомления о результатах
  • API для мониторинга сборок
  • Аутентификация webhook'ов
  • Rate limiting
  • OpenAPI документация

📚 Зависимости

  • Go 1.20+
  • Gin - веб-фреймворк
  • go-git/v5 - Git клиент
  • logrus - логирование
  • YAML - конфигурация (планируется)