av 41f2f05f2f добавлен приём пакетов Health Auto Export
- POST /api/v1/ingest: токен, лимит тела, gzip, durable-запись тела в сырой
  архив, учёт доставки в SQLite
- код ответа отражает доставку, а не разбор: битый JSON — 400, непонятое
  содержимое — 200, данные уже сохранены и доразберутся позже
- сохраняется полный набор заголовков запроса с вычисткой секретов по имени
  и по совпадению значения с токеном
2026-08-01 12:37:17 +03:00

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; источник истины по формату, документация приложения местами расходится с тем, что оно шлёт
S
Description
No description provided
Readme
2 MiB
Languages
Go 98.2%
Python 1.7%
Dockerfile 0.1%