- POST /api/v1/ingest: токен, лимит тела, gzip, durable-запись тела в сырой архив, учёт доставки в SQLite - код ответа отражает доставку, а не разбор: битый JSON — 400, непонятое содержимое — 200, данные уже сохранены и доразберутся позже - сохраняется полный набор заголовков запроса с вычисткой секретов по имени и по совпадению значения с токеном
49 lines
1.5 KiB
Go
49 lines
1.5 KiB
Go
// Команда healthlog — коллектор данных Apple Health из Health Auto Export.
|
|
//
|
|
// Подкоманды:
|
|
//
|
|
// healthlog [serve] --config <path> принимать пакеты (по умолчанию)
|
|
// healthlog healthcheck --config <p> проверить /healthz (для docker HEALTHCHECK)
|
|
package main
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
|
|
"git.vakhrushev.me/av/healthlog/internal/logging"
|
|
)
|
|
|
|
func main() {
|
|
args := os.Args[1:]
|
|
|
|
// Первый позиционный аргумент (не флаг) — подкоманда. Без него (и при
|
|
// `--config ...`) запускаем сервис.
|
|
cmd := "serve"
|
|
if len(args) > 0 && !strings.HasPrefix(args[0], "-") {
|
|
cmd, args = args[0], args[1:]
|
|
}
|
|
|
|
var err error
|
|
switch cmd {
|
|
case "serve":
|
|
err = runServe(args)
|
|
case "healthcheck":
|
|
err = runHealthcheck(args)
|
|
default:
|
|
_, _ = os.Stderr.WriteString("unknown command: " + cmd + "\n")
|
|
os.Exit(2)
|
|
}
|
|
if err != nil {
|
|
if cmd == "serve" {
|
|
// Фатальный сбой старта сервиса — структурный лог ERROR (как в
|
|
// проде), затем ненулевой код возврата.
|
|
logging.NewStderr().Error("fatal startup", "command", cmd, "error", err)
|
|
} else {
|
|
// Диагностический CLI — человекочитаемый stderr, это
|
|
// пользовательский вывод, а не лог сервиса.
|
|
_, _ = os.Stderr.WriteString("fatal: " + err.Error() + "\n")
|
|
}
|
|
os.Exit(1)
|
|
}
|
|
}
|