cleanup: удаление ненужных файлов и переименование
- Удален старый main.go - Удален старый Dockerfile - Удален старый Makefile - Удален старый README.md - Удален docker-compose.yml - Удален .air.toml - Удалены пустые директории (deployments, docs, scripts, tests) - Переименованы файлы без суффикса -refactored - Очищена структура проекта
This commit is contained in:
300
README.md
300
README.md
@@ -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** - конфигурация (планируется)
|
||||
|
||||
Reference in New Issue
Block a user