04cea69d6eb356d965bec778523e57ebae10d309
- Создана новая структура проекта с разделением на пакеты - Добавлены интерфейсы для всех сервисов (Git, Quartz, Files, Build) - Реализован Dependency Injection для сервисов - Добавлены middleware для логирования, Request ID и Response Time - Создан пакет конфигурации с валидацией - Улучшено логирование через интерфейс - Добавлены обработчики HTTP в отдельных пакетах - Создана структура для тестирования - Добавлены конфигурационные файлы и документация
Go Webhook Server
Go-версия webhook сервиса для автоматической пересборки Quartz сайта при получении webhook'а.
Особенности
- Написан на Go - быстрый и эффективный
- Использует Gin - легковесный веб-фреймворк
- Интеграция с Git - автоматическое обновление репозитория
- Асинхронная обработка - webhook'и обрабатываются в фоне
- Graceful shutdown - корректное завершение работы
- Структурированное логирование - с использованием logrus
- Конфигурируемость - через переменные окружения
Архитектура
Сервис состоит из следующих компонентов:
-
HTTP сервер на Gin с эндпоинтами:
POST /webhook- основной webhook для пересборкиGET /health- проверка состояния сервиса
-
Git интеграция - автоматическое обновление репозитория Obsidian
-
Quartz сборка - запуск процесса сборки статического сайта
-
Файловые операции - копирование собранных файлов в публичную директорию
Конфигурация
Сервис настраивается через переменные окружения:
| Переменная | Описание | По умолчанию |
|---|---|---|
PORT |
Порт для HTTP сервера | 3000 |
OBSIDIAN_PATH |
Путь к репозиторию Obsidian | /obsidian |
QUARTZ_PATH |
Путь к директории Quartz | /quartz |
PUBLIC_PATH |
Путь к публичной директории | /public |
GIT_BRANCH |
Ветка Git для обновления | main |
GIT_REMOTE |
Имя удаленного репозитория | origin |
Запуск
Локально
- Установите Go 1.21+
- Скачайте зависимости:
go mod download - Запустите сервис:
go run main.go
В Docker
-
Соберите образ:
docker build -t go-webhook-server . -
Запустите контейнер:
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
- Запустите сервис:
docker-compose up -d
Использование
Отправка webhook'а
curl -X POST http://localhost:3000/webhook
Проверка состояния
curl http://localhost:3000/health
Процесс сборки
При получении webhook'а сервис выполняет:
- Проверка репозитория - убеждается что Git репозиторий существует
- Обновление кода - выполняет
git pullдля получения последних изменений - Установка зависимостей - запускает
npm installесли необходимо - Сборка сайта - запускает
npm run quartz buildс указанием директории Obsidian - Копирование файлов - копирует собранные файлы в публичную директорию
Логирование
Сервис использует структурированное логирование с помощью logrus:
- Info - информационные сообщения о процессе сборки
- Error - ошибки, возникающие в процессе
- HTTP логи - все HTTP запросы с деталями
Безопасность
- Контейнер запускается от непривилегированного пользователя
- Используется Alpine Linux для минимального attack surface
- Graceful shutdown для корректного завершения работы
Мониторинг
Сервис предоставляет health check эндпоинт для мониторинга:
{
"status": "ok",
"timestamp": "2025-01-27T10:30:00Z",
"service": "go-webhook-server",
"version": "1.0.0"
}
Разработка
Структура проекта
go-webhook-server/
├── main.go # Основной файл приложения
├── go.mod # Go модуль
├── go.sum # Хеши зависимостей
├── Dockerfile # Docker образ
├── docker-compose.yml # Docker Compose конфигурация
└── README.md # Документация
Зависимости
github.com/gin-gonic/gin- веб-фреймворкgithub.com/go-git/go-git/v5- Git клиентgithub.com/sirupsen/logrus- логирование
Лицензия
MIT
Description
Languages
Go
77.2%
Makefile
17.8%
Dockerfile
5%