diet: заведён плейбук, периметр и бэкапы
- playbook-diet.yml и files/diet: образ через app_image, uid=gid=1111, каталоги config/data/cache, backup-targets со строкой data/ - блок сайта в Caddy разделён: /api/* идёт мимо Authelia под собственную аутентификацию, клиентские Remote-* срезаются на уровне сайта - правило Authelia one_factor без subject: пользователи шире группы admins
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
# 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"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Образ собирается локально и доставляется на сервер ролью app_image
|
||||
# (см. playbook-diet.yml): тег — случайный BUILD_ID каждого прогона,
|
||||
# в реестре образа нет, поэтому pull_policy: never.
|
||||
#
|
||||
# В образе нет оболочки (distroless): зайти внутрь работающего контейнера
|
||||
# нечем, разбор идёт по журналу и GET /healthz.
|
||||
|
||||
services:
|
||||
|
||||
diet_app:
|
||||
image: "{{ app_name }}:{{ app_image_tag }}"
|
||||
container_name: diet_app
|
||||
restart: unless-stopped
|
||||
pull_policy: never
|
||||
user: "{{ owner_create_result.uid }}:{{ owner_create_result.group }}"
|
||||
networks:
|
||||
- "web_proxy_network"
|
||||
volumes:
|
||||
- "{{ config_dir }}:/config:ro"
|
||||
- "{{ data_dir }}:/var/lib/diet"
|
||||
- "{{ cache_dir }}:/var/cache/diet"
|
||||
command:
|
||||
- "--config"
|
||||
- "/config/config.toml"
|
||||
|
||||
networks:
|
||||
web_proxy_network:
|
||||
external: true
|
||||
Reference in New Issue
Block a user