- Создана новая структура проекта с разделением на пакеты - Добавлены интерфейсы для всех сервисов (Git, Quartz, Files, Build) - Реализован Dependency Injection для сервисов - Добавлены middleware для логирования, Request ID и Response Time - Создан пакет конфигурации с валидацией - Улучшено логирование через интерфейс - Добавлены обработчики HTTP в отдельных пакетах - Создана структура для тестирования - Добавлены конфигурационные файлы и документация
213 lines
6.3 KiB
Markdown
213 lines
6.3 KiB
Markdown
# 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. Интерфейсы и абстракции**
|
||
```go
|
||
type GitService interface {
|
||
UpdateRepository() error
|
||
IsRepositoryExists() bool
|
||
}
|
||
|
||
type QuartzService interface {
|
||
BuildSite() error
|
||
InstallDependencies() error
|
||
}
|
||
|
||
type BuildService interface {
|
||
BuildSite() BuildResult
|
||
}
|
||
```
|
||
|
||
### **3. Dependency Injection**
|
||
```go
|
||
// Инициализация сервисов
|
||
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
|
||
|
||
## 🚀 **Запуск**
|
||
|
||
### **Локально**
|
||
```bash
|
||
cd cmd/server
|
||
go run main.go
|
||
```
|
||
|
||
### **Сборка**
|
||
```bash
|
||
go build -o go-webhook-server cmd/server/main.go
|
||
```
|
||
|
||
### **Docker**
|
||
```bash
|
||
docker build -t go-webhook-server .
|
||
docker run -p 3000:3000 go-webhook-server
|
||
```
|
||
|
||
## 📝 **Конфигурация**
|
||
|
||
### **Переменные окружения**
|
||
```bash
|
||
PORT=3000
|
||
OBSIDIAN_PATH=/obsidian
|
||
QUARTZ_PATH=/quartz
|
||
PUBLIC_PATH=/public
|
||
GIT_BRANCH=main
|
||
GIT_REMOTE=origin
|
||
SERVER_TIMEOUT=30
|
||
```
|
||
|
||
### **YAML конфигурация**
|
||
```yaml
|
||
server:
|
||
port: "3000"
|
||
timeout: 30
|
||
|
||
paths:
|
||
obsidian: "/obsidian"
|
||
quartz: "/quartz"
|
||
public: "/public"
|
||
|
||
git:
|
||
branch: "main"
|
||
remote: "origin"
|
||
```
|
||
|
||
## 🧪 **Тестирование**
|
||
|
||
### **Unit тесты**
|
||
```bash
|
||
go test ./internal/...
|
||
```
|
||
|
||
### **Integration тесты**
|
||
```bash
|
||
go test ./tests/integration/...
|
||
```
|
||
|
||
## 🔄 **API эндпоинты**
|
||
|
||
### **POST /webhook**
|
||
Запускает процесс сборки сайта.
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"status": "accepted",
|
||
"message": "Build process started",
|
||
"request_id": "20250127103000-abc123",
|
||
"timestamp": "2025-01-27T10:30:00Z"
|
||
}
|
||
```
|
||
|
||
### **GET /health**
|
||
Проверка состояния сервиса.
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"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** - конфигурация (планируется)
|