cleanup: удаление ненужных файлов и переименование

- Удален старый main.go
- Удален старый Dockerfile
- Удален старый Makefile
- Удален старый README.md
- Удален docker-compose.yml
- Удален .air.toml
- Удалены пустые директории (deployments, docs, scripts, tests)
- Переименованы файлы без суффикса -refactored
- Очищена структура проекта
This commit is contained in:
Andrey Epifancev
2025-08-11 19:55:23 +04:00
parent 04cea69d6e
commit fcc65ea850
8 changed files with 240 additions and 873 deletions

300
README.md
View File

@@ -1,152 +1,212 @@
# Go Webhook Server
# Go Webhook Server - Рефакторенная версия
Go-версия webhook сервиса для автоматической пересборки Quartz сайта при получении webhook'а.
Рефакторенная версия webhook сервера с разделением на пакеты и улучшенной архитектурой.
## Особенности
## 🏗️ **Новая структура проекта**
- **Написан на Go** - быстрый и эффективный
- **Использует Gin** - легковесный веб-фреймворк
- **Интеграция с Git** - автоматическое обновление репозитория
- **Асинхронная обработка** - webhook'и обрабатываются в фоне
- **Graceful shutdown** - корректное завершение работы
- **Структурированное логирование** - с использованием logrus
- **Конфигурируемость** - через переменные окружения
## Архитектура
Сервис состоит из следующих компонентов:
1. **HTTP сервер** на Gin с эндпоинтами:
- `POST /webhook` - основной webhook для пересборки
- `GET /health` - проверка состояния сервиса
2. **Git интеграция** - автоматическое обновление репозитория Obsidian
3. **Quartz сборка** - запуск процесса сборки статического сайта
4. **Файловые операции** - копирование собранных файлов в публичную директорию
## Конфигурация
Сервис настраивается через переменные окружения:
| Переменная | Описание | По умолчанию |
|------------|----------|--------------|
| `PORT` | Порт для HTTP сервера | `3000` |
| `OBSIDIAN_PATH` | Путь к репозиторию Obsidian | `/obsidian` |
| `QUARTZ_PATH` | Путь к директории Quartz | `/quartz` |
| `PUBLIC_PATH` | Путь к публичной директории | `/public` |
| `GIT_BRANCH` | Ветка Git для обновления | `main` |
| `GIT_REMOTE` | Имя удаленного репозитория | `origin` |
## Запуск
### Локально
1. Установите Go 1.21+
2. Скачайте зависимости:
```bash
go mod download
```
3. Запустите сервис:
```bash
go run main.go
```
### В Docker
1. Соберите образ:
```bash
docker build -t go-webhook-server .
```
2. Запустите контейнер:
```bash
docker run -d \
--name go-webhook-server \
-p 3000:3000 \
-v obsidian_repo:/obsidian:ro \
-v quartz_repo:/quartz:ro \
-v public_site:/public \
go-webhook-server
```
### С Docker Compose
1. Запустите сервис:
```bash
docker-compose up -d
```
## Использование
### Отправка webhook'а
```bash
curl -X POST http://localhost:3000/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/ # Документация
```
### Проверка состояния
## 🔧 **Основные улучшения**
```bash
curl http://localhost:3000/health
### **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)
```
При получении webhook'а сервис выполняет:
### **4. Улучшенное логирование**
- Структурированное логирование
- Request ID для отслеживания
- Уровни логирования
- Контекстная информация
1. **Проверка репозитория** - убеждается что Git репозиторий существует
2. **Обновление кода** - выполняет `git pull` для получения последних изменений
3. **Установка зависимостей** - запускает `npm install` если необходимо
4. **Сборка сайта** - запускает `npm run quartz build` с указанием директории Obsidian
5. **Копирование файлов** - копирует собранные файлы в публичную директорию
### **5. Middleware**
- **RequestIDMiddleware** - уникальный ID для каждого запроса
- **ResponseTimeMiddleware** - время ответа
- **LoggingMiddleware** - детальное логирование HTTP
## Логирование
## 🚀 **Запуск**
Сервис использует структурированное логирование с помощью logrus:
### **Локально**
```bash
cd cmd/server
go run main.go
```
- **Info** - информационные сообщения о процессе сборки
- **Error** - ошибки, возникающие в процессе
- **HTTP логи** - все HTTP запросы с деталями
### **Сборка**
```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
```
- Контейнер запускается от непривилегированного пользователя
- Используется Alpine Linux для минимального attack surface
- Graceful shutdown для корректного завершения работы
## 📝 **Конфигурация**
## Мониторинг
### **Переменные окружения**
```bash
PORT=3000
OBSIDIAN_PATH=/obsidian
QUARTZ_PATH=/quartz
PUBLIC_PATH=/public
GIT_BRANCH=main
GIT_REMOTE=origin
SERVER_TIMEOUT=30
```
Сервис предоставляет health check эндпоинт для мониторинга:
### **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"
"version": "1.0.0",
"request_id": "20250127103000-abc123"
}
```
## Разработка
## 📊 **Мониторинг**
### Структура проекта
### **Заголовки ответа**
- `X-Request-ID` - уникальный ID запроса
- `X-Response-Time` - время ответа
```
go-webhook-server/
├── main.go # Основной файл приложения
├── go.mod # Go модуль
├── go.sum # Хеши зависимостей
├── Dockerfile # Docker образ
├── docker-compose.yml # Docker Compose конфигурация
└── README.md # Документация
```
### **Логирование**
- Все HTTP запросы логируются с деталями
- Request ID для отслеживания цепочки запросов
- Структурированные логи в формате JSON
### Зависимости
## 🚀 **Преимущества новой архитектуры**
- `github.com/gin-gonic/gin` - веб-фреймворк
- `github.com/go-git/go-git/v5` - Git клиент
- `github.com/sirupsen/logrus` - логирование
1. **Тестируемость** - легко писать unit тесты
2. **Переиспользование** - компоненты можно использовать в других проектах
3. **Читаемость** - код легче понимать и поддерживать
4. **Расширяемость** - проще добавлять новую функциональность
5. **Соответствие стандартам** - структура соответствует Go best practices
6. **Dependency Injection** - легко заменять реализации
7. **Интерфейсы** - четкое разделение контрактов
## Лицензия
## 🔮 **Планы развития**
MIT
- [ ] Добавление метрик Prometheus
- [ ] Конфигурация через файлы
- [ ] Graceful shutdown для сборки
- [ ] Очередь сборок
- [ ] Уведомления о результатах
- [ ] API для мониторинга сборок
- [ ] Аутентификация webhook'ов
- [ ] Rate limiting
- [ ] OpenAPI документация
## 📚 **Зависимости**
- **Go 1.20+**
- **Gin** - веб-фреймворк
- **go-git/v5** - Git клиент
- **logrus** - логирование
- **YAML** - конфигурация (планируется)