Начало работы
Это руководство охватывает установку, настройку и запуск первого экземпляра Letopis.
Требования
| Зависимость | Минимальная версия | Примечание |
|---|---|---|
| Go | 1.25 | Нужен для сборки из исходников |
| MongoDB | 7.0 | Отдельная база данных на каждого тенанта создаётся автоматически |
| Redis | 6.0 | Используется для durable-очереди, ключей идемпотентности и инвалидации кэша правил |
| Docker | любая | Опционально; нужен для compose-стеков и интеграционных тестов |
Установка
Готовые бинари
Скачайте архив под свою платформу (linux/darwin/windows, amd64/arm64) со страницы GitHub Releases. В архиве — бинарь letopis, LICENSE, NOTICE, config.example.yaml и docker-compose.deps.yml.
Из исходников
git clone https://github.com/max-trifonov/letopis.git
cd letopis
make build # создаёт bin/letopis
Бинарь встраивает версию, хэш коммита и дату сборки через ldflags; make build берёт их из git describe автоматически.
Docker
Образ публикуется в ghcr.io/max-trifonov/letopis. Для локальной сборки:
make docker # тегирует ghcr.io/max-trifonov/letopis:latest
Доступны два compose-варианта:
Dev-стек
docker compose -f docker-compose.dev.yml up --build
Собирает образ из рабочей директории и запускает MongoDB, Redis и сервис вместе.
Production-стек
cp config.example.yaml config.yaml # отредактируйте перед запуском
docker compose up -d
Использует опубликованный образ. MongoDB и Redis включены в compose-файл для удобства; в продакшне обычно mongodb.uri и redis.addr указывают на управляемую инфраструктуру.
Конфигурация
Letopis настраивается через YAML-файл. Бинарь ищет config.yaml в следующем порядке:
- Путь, указанный флагом
--config(наивысший приоритет) - Текущая рабочая директория
- Директория рядом с бинарём
Конфигурационный файл обязателен — без него сервер не стартует.
После загрузки файла любая переменная окружения LETOPIS_* переопределяет соответствующий ключ:
| Переменная окружения | Ключ конфига |
|---|---|
LETOPIS_ROLE |
role |
LETOPIS_HTTP_ADDR |
server.http.addr |
LETOPIS_GRPC_ADDR |
server.grpc.addr |
LETOPIS_MONGODB_URI |
mongodb.uri |
LETOPIS_REDIS_ADDR |
redis.addr |
LETOPIS_REDIS_PASSWORD |
redis.password |
LETOPIS_REDIS_DB |
redis.db |
LETOPIS_LOG_LEVEL |
log.level |
Минимальная конфигурация
Минимальная production-конфигурация должна задать:
| Секция | Ключи |
|---|---|
mongodb.uri |
URI подключения к MongoDB |
redis.addr |
Адрес Redis |
tenants |
Одна запись на тенанта с id и хотя бы одним API-ключом |
webhooks.secrets |
Именованные секреты для подписи вебхуков |
Полный справочник — config.example.yaml.
Запуск сервера
./bin/letopis serve
По умолчанию роль all — HTTP + gRPC + worker в одном процессе. Для продакшна можно разделить:
./bin/letopis serve --role=api # только HTTP + gRPC
./bin/letopis serve --role=worker # только async-обработчик событий
Первая запись
# API-ключ из config.yaml
TOKEN=hm_dev_plaintext
# Отправить состояние (сервер вычислит дифф)
curl -s -X POST http://localhost:8080/api/v1/collections/crm.deals/entities/deal-1/state \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"state": {"title": "ООО Ромашка", "amount": 50000, "stage": "prospect"}}'
Ожидаемый ответ (режим durable возвращает 202 с тикетом):
{
"ticket_id": "tkt_01hx...",
"status": "accepted"
}
Чтение данных
# Текущее состояние
curl -s http://localhost:8080/api/v1/collections/crm.deals/entities/deal-1/state \
-H "Authorization: Bearer $TOKEN"
# Полная история
curl -s http://localhost:8080/api/v1/collections/crm.deals/entities/deal-1/history \
-H "Authorization: Bearer $TOKEN"
Системные эндпоинты
| Эндпоинт | Назначение |
|---|---|
GET /healthz |
Liveness probe |
GET /readyz |
Readiness — проверки зависимостей |
GET /metrics |
Prometheus-метрики |
GET /version |
Информация о сборке |
gRPC :9090 |
letopis.v1.SystemService, health, reflection |
Разработка
make test # go test -race ./...
make test-integration # требует Docker — интеграционные тесты (testcontainers)
make lint # golangci-lint + buf lint
make proto # перегенерация gRPC-биндингов
make bench # бенчмарки diff/pipeline