- `GET /api/v1/metrics/{name}?from&to&layer` — ряд точек за период; конверт
объявляет слой, измеренный род, его применимость к отданному ряду и границу
окна измерения, а сам ряд собирается из одного слоя, выбранного по охвату
точек внутри периода
- use-case вынесен в `internal/points`, чтение — одним входом `store.ReadSeries`
под одной транзакцией; правило выбора слоя остаётся в домене и приходит в
хранилище колбэком
- `writeJSON` перестал экранировать HTML-символы и перестал глушить отказ
записи: дословность содержимого точки иначе не удерживается, а оборванное
тело уходило под видом успешного `200`
50 lines
4.3 KiB
TOML
50 lines
4.3 KiB
TOML
# Образец конфигурации healthlog.
|
|
#
|
|
# Реальный config.toml не коммитится (в нём токены), права 0600.
|
|
# Все поля необязательны: без файла сервис поднимается на умолчаниях, что
|
|
# удобно для локального запуска. Умолчание каждого поля указано ниже.
|
|
|
|
[server]
|
|
addr = ":8080" # адрес прослушивания; ":8080" — все интерфейсы (нужно, чтобы телефон достучался по локальной сети)
|
|
read_timeout = "5m" # на всё чтение запроса вместе с телом; Go-duration. Щедро: экспорт истории — десятки мегабайт по мобильной сети
|
|
# ВНИМАНИЕ: write_timeout в Go покрывает НЕ только отправку ответа. Он ставится
|
|
# до вызова обработчика и потому включает чтение тела: значение меньше
|
|
# read_timeout молча обрывает медленную загрузку. Маршрут приёма поэтому держит
|
|
# собственный бюджет (read_timeout + write_timeout), а это значение остаётся
|
|
# защитой от застрявшей записи ответа на остальных маршрутах.
|
|
write_timeout = "30s" # на отправку ответа прочих маршрутов; Go-duration
|
|
|
|
[auth]
|
|
# Токены проверяются как `Authorization: Bearer <токен>`.
|
|
# Health Auto Export умеет слать произвольные заголовки — токен задаётся в
|
|
# настройках автоматизации.
|
|
# ПУСТОЙ СПИСОК = ПРОВЕРКА ВЫКЛЮЧЕНА. Так можно в доверенной локальной сети;
|
|
# сервис предупреждает об этом на старте записями `write auth disabled` и
|
|
# `read auth disabled`.
|
|
#
|
|
# Цена у контуров РАЗНАЯ, и это стоит помнить: открытый приём означает мусор во
|
|
# входе, открытое чтение — выгрузку всей истории здоровья любому, кто нашёл
|
|
# порт. Перед выкладкой наружу `read_tokens` обязан быть непуст.
|
|
write_tokens = [] # токены на приём данных
|
|
read_tokens = [] # токены на чтение: каталог `GET /api/v1/metrics` и точки `GET /api/v1/metrics/{name}`
|
|
|
|
[storage]
|
|
# ВНИМАНИЕ: умолчания в коде (./healthlog.db и ./raw) остались от прежней
|
|
# раскладки, а данные с 2026-08-01 живут в ./data. Запуск без конфига заведёт
|
|
# ПУСТУЮ базу в корне репозитория рядом с настоящей. Умолчания подтянутся к
|
|
# ./data первой же задачей, трогающей конфиг; до тех пор запускай с этим файлом.
|
|
db_path = "./data/healthlog.db" # файл SQLite; каталог должен существовать
|
|
archive_dir = "./data/raw" # корень сырого архива; создаётся при старте
|
|
|
|
[ingest]
|
|
# ВНИМАНИЕ: параметр РЕТРОАКТИВЕН. Тем же пределом читаются тела из архива при
|
|
# пересборке (`healthlog reindex`), поэтому понижение выбрасывает из
|
|
# пересобранной витрины все уже принятые тела крупнее нового значения — они
|
|
# начнут отказывать на каждом прогоне. Понижать только вместе с проверкой, что
|
|
# таких тел в архиве нет.
|
|
max_body_mb = 64 # максимальный размер тела запроса, МиБ; целое > 0. Больше — 413
|
|
|
|
[log]
|
|
level = "info" # debug | info | warn | error
|
|
format = "json" # json | text (text удобен при локальной отладке)
|