# Diet — конфигурация. Рендерится плейбуком playbook-diet.yml. # # Здесь только обязательные поля и те умолчания, что меняются осознанно: # полный справочник полей с их умолчаниями — config.example.toml в репозитории # приложения. Разбор строгий: неизвестный ключ в этом файле роняет старт. [general] # Часовой пояс новых пользователей: по нему режутся сутки в итогах дня. # Хранение времени и журнал всегда в UTC, его это не трогает. timezone = "Europe/Moscow" [http] # Порт наружу не публикуется: в сеть смотрит только Caddy, а внутрь # web_proxy_network приложение видно по имени контейнера diet_app. listen = "0.0.0.0:8080" [storage] # data/ приложения смонтирован на /var/lib/diet — единственное, что уезжает # в бэкап (backup-targets). db_path = "/var/lib/diet/diet.db" [storage.files] # Снимки тарелок и этикеток: каталог на диске этой же машины. type = "local" dir = "/var/lib/diet/files" [cache.images] # cache/ смонтирован на /var/cache/diet: содержимое восстановимо целиком, # в бэкап не идёт и сносится в любой момент. type = "local" dir = "/var/cache/diet/images" [llm] # Шлюз в общей сети; версию API ("/v1/chat/completions") приложение # дописывает само, поэтому адрес указывается корнем. base_url = "http://bifrost_app:8080/openai" # Bifrost в закрытой сети ключа не спрашивает: governance у него не включён # и виртуальных ключей нет. Пустая строка — приложение ходит без авторизации. # Появится ключ — значение приедет из vault, а файл станет секретным: # тогда задаче рендера нужны no_log и права 0600. api_key = "" [llm.recognition] # Снимки читает vision-модель через bothub — кандидат по умолчанию из замера # на живых фотографиях (docs/research/2026-08-31-vision-recognition.md # в репозитории приложения): точность не хуже моделей в девяносто раз дороже. type = "openai-compat" model = "bothub/gemini-3.1-flash-lite" [llm.composition] # Сведение позиций. Модель медленнее соседки по шлюзу, зато честно говорит # «не знаю» о незнакомом продукте вместо выдуманного КБЖУ. Разбор фоновый, # человек ответа у экрана не ждёт, поэтому ожидание здесь дешевле выдумки. type = "openai-compat" model = "bothub/deepseek-v4-flash" # Замер давал этой модели 19–70 секунд на ответ, то есть умолчание в минуту # обрывало бы её самые долгие ответы, засчитывая их временной неудачей. timeout = "2m"