- POST /api/v1/ingest: токен, лимит тела, gzip, durable-запись тела в сырой архив, учёт доставки в SQLite - код ответа отражает доставку, а не разбор: битый JSON — 400, непонятое содержимое — 200, данные уже сохранены и доразберутся позже - сохраняется полный набор заголовков запроса с вычисткой секретов по имени и по совпадению значения с токеном
healthlog
Коллектор данных Apple Health. Принимает выгрузки из Health Auto Export, складывает их в единое хранилище и отдаёт другим моим проектам через HTTP API.
Зачем
Данные о здоровье и тренировках нужны сразу нескольким приложениям: анализ здоровья, разбор тренировок, мотиватор по активности. Интегрировать каждое из них с Health Auto Export по отдельности — значит в каждом писать приём, дедупликацию и хранение заново.
healthlog делает это один раз. Телефон шлёт данные в него, все остальные проекты берут данные из него.
Границы
Это хранилище, а не аналитика. healthlog принимает, дедуплицирует, хранит и отдаёт. Он не считает агрегаты, не переименовывает поля Apple и не интерпретирует значения — этим занимается тот, кто данные читает.
Единственный источник — Health Auto Export (куплен, пожизненный премиум). Другие источники не поддерживаем.
Как устроено
iPhone ──HTTPS POST──► healthlog ──► сырой архив (файлы, .json.gz)
│ │
│ └── источник истины, не трогаем
▼
SQLite-витрина ──► HTTP read API ──► мои приложения
(пересобирается из архива)
Приём сначала кладёт тело запроса на диск как есть и только потом разбирает.
Значит, ошибка в нашем разборе не может привести к потере данных: витрина
пересобирается из архива командой healthlog reindex.
Подробности — docs/architecture.md.
Состояние
В разработке. Готовы шаги 1–2 из 8: сервис принимает пакеты и складывает их в сырой архив. Разбора, витрины и read API ещё нет — план в docs/plan.md.
Команды
healthlog serve приём + read API
healthlog import заливка файлов в архив и витрину (шаг 6)
healthlog reindex пересборка витрины из сырого архива (шаг 3)
healthlog healthcheck проверка живости для docker HEALTHCHECK
Локальный запуск
Конфиг необязателен — без него берутся умолчания (:8080, ./healthlog.db,
./raw). Для своих значений скопируй config.example.toml в config.toml.
task run
Проверка:
curl localhost:8080/healthz
curl -X POST localhost:8080/api/v1/ingest -d '{"data":{"metrics":[]}}'
Подключение телефона по локальной сети
Сервис слушает все интерфейсы (addr = ":8080"), так что телефон в той же
сети достучится по IP машины. В Health Auto Export заводится одна
автоматизация: REST API, формат JSON, минимальная гранулярность
(«Summarize Data» выключен), URL вида http://<ip-машины>:8080/api/v1/ingest.
Если auth.write_tokens пуст, проверка токена выключена — для доверенной
локальной сети этого достаточно, сервис пишет об этом write auth disabled
на старте. Для доступа снаружи понадобится и токен, и TLS (шаг 8).
Документация
- docs/architecture.md — устройство, схема данных, API, принятые решения
- docs/conventions.md — как пишем код
- docs/plan.md — шаги и отложенное
- docs/local-research.md — что показал реальный поток Health Auto Export; источник истины по формату, документация приложения местами расходится с тем, что оно шлёт