- в конфиг добавлены секция [auth.test_headers] и предохранитель [server] debug: заголовки входа подставляет слой транспорта, второго процесса локальный запуск больше не требует - подкоманда devtools proxy удалена целиком: всё, ради чего её поднимали, делает сам сервис - адресного предохранителя нет по решению владельца — цена названа в ADR и в модели угроз
155 lines
10 KiB
TOML
155 lines
10 KiB
TOML
# Server configuration
|
|
[server]
|
|
port = 8080
|
|
shutdown_timeout = 5
|
|
force_shutdown_timeout = 20
|
|
|
|
# Предохранитель отладочного запуска. Значения: false (по умолчанию) и true.
|
|
#
|
|
# Означает он одно: прогон идёт на машине разработчика, и сервису позволено
|
|
# подставить то, что в бою даёт обратный прокси, — заголовки входа из секции
|
|
# [auth.test_headers] ниже. Перечня следствий сверх этого у него нет: уровня
|
|
# журнала, текстов внутренних отказов, ограничителя частоты и подмены
|
|
# распознавателя признак не касается.
|
|
#
|
|
# Цена включения названа прямо: сервис с true и заполненной имитацией называет
|
|
# пришедшего сам, никого не спросив, и отдаёт архив всякому, чей запрос пришёл с
|
|
# доверенного адреса. В бою доверенный адрес — это адрес обратного прокси, то
|
|
# есть всякий, кто пришёл обычным путём. В боевом файле ключ стоит false.
|
|
debug = false
|
|
|
|
# Хранилище: каталог данных и числа его базы.
|
|
#
|
|
# Каталог единственный: под ним лежат и файл базы, и подкаталог с файлами
|
|
# записей. Двух путей у хранилища не бывает.
|
|
[storage]
|
|
data_dir = "data"
|
|
|
|
# Сколько ждать занятую базу, миллисекунды. Положительное число.
|
|
#
|
|
# База принимает **одного** писателя: драйвер пишет единственным соединением, и
|
|
# несколько воркеров, пришедших писать разом, встают в очередь. Это число —
|
|
# сколько ждущий готов простоять, прежде чем получить отказ «база занята».
|
|
# Крутят его при таком отказе под несколькими воркерами; ноль означает «отказать
|
|
# сразу» и потому не принимается.
|
|
busy_timeout_ms = 5000
|
|
|
|
# Сколько соединений держит читающий пул. Положительное число.
|
|
#
|
|
# Чтение идёт отдельно от записи: в журнале упреждающей записи читатели не
|
|
# мешают писателю, и список записей не ждёт, пока конвейер сохранит свой шаг.
|
|
# Число выводят из числа воркеров плюс запас под запросы приложения.
|
|
#
|
|
# Пишущее соединение при этом всегда одно и настройкой не делается: второе
|
|
# означало бы отказы по занятости на записи результата шага, то есть после
|
|
# оплаченной работы.
|
|
read_connections = 4
|
|
|
|
# Конвейер расшифровки.
|
|
[pipeline]
|
|
# Число рабочих потоков. Специализации у них нет: каждый берёт любую пригодную к
|
|
# работе запись и выбирает шаг по её рубежу.
|
|
#
|
|
# Ноль — законное значение, а не поломка: сервис поднимается, записи
|
|
# принимаются и не двигаются. Годится местному запуску и выкладке, где конвейер
|
|
# надо остановить, не роняя приём.
|
|
workers = 3
|
|
|
|
# Предел простоя записи там, где работу делаем мы сами, в минутах.
|
|
#
|
|
# Сторож ловит **зависание**, а не долгую работу: пока шаг идёт, запись занята
|
|
# захватом, и живой процесс наблюдается сам по себе. Час меньше времени, которое
|
|
# многочасовая запись занимает на приведении, и это принято сознательно
|
|
# (решение владельца 2026-08-14): цена ложной остановки — одно движение
|
|
# владельца, потому что остановка обратима и рубежа не стирает.
|
|
own_work_limit_minutes = 60
|
|
|
|
# Предел простоя там, где ждём операцию внешнего сервиса, в минутах.
|
|
#
|
|
# Сколько идёт распознавание долгой записи, никто не мерил, поэтому ошибаемся в
|
|
# сторону долгого: ложная остановка хуже поздней. Откладывание опроса этот
|
|
# отсчёт не двигает — иначе зависшая у провайдера операция опрашивалась бы
|
|
# вечно.
|
|
foreign_work_limit_minutes = 1440
|
|
|
|
# Yandex Cloud Configuration
|
|
[yandex]
|
|
# ID папки в Yandex Cloud (получить в консоли Yandex Cloud)
|
|
folder_id = "your_folder_id_here"
|
|
|
|
# API ключ для доступа к Yandex SpeechKit (получить в консоли Yandex Cloud)
|
|
speech_kit_api_key = "your_speech_kit_api_key_here"
|
|
|
|
# Object Storage (S3) configuration
|
|
# Access Key ID для доступа к Object Storage (получить в консоли Yandex Cloud)
|
|
object_storage_access_key_id = "your_access_key_id"
|
|
|
|
# Secret Access Key для доступа к Object Storage (получить в консоли Yandex Cloud)
|
|
object_storage_secret_access_key = "your_secret_access_key"
|
|
|
|
# Имя бакета в Object Storage
|
|
object_storage_bucket_name = "your_bucket_name"
|
|
|
|
# Регион Object Storage
|
|
object_storage_region = "ru-central1"
|
|
|
|
# Endpoint Object Storage
|
|
object_storage_endpoint = "https://storage.yandexcloud.net/"
|
|
|
|
# Кому сервис верит на входе.
|
|
#
|
|
# Своего входа у сервиса нет: кто пришёл, называет обратный прокси заголовком
|
|
# `Remote-User`, сходив к Authelia. Здесь остаётся один ключ — перечень адресов,
|
|
# чьему заголовку верить. Пустой перечень роняет старт: он значит «не верить
|
|
# никому», то есть сервис, поднявшийся никого не узнающим.
|
|
[auth]
|
|
# Адреса и подсети, с которых приходит обратный прокси. Сверяется адрес самого
|
|
# соединения, а не пересылаемый заголовок: пересылаемым распоряжается тот, кто
|
|
# шлёт запрос.
|
|
#
|
|
# **Перечень задаёт адрес прокси, а не весь частный диапазон.** Всякий, кто
|
|
# дотянулся до сервиса с адреса из этого перечня, называет себя кем угодно и
|
|
# получает чужой архив; `172.16.0.0/12` означало бы «любой контейнер на хосте»,
|
|
# включая чужие проекты. На сервере сюда ставят адрес сети, в которой стоит
|
|
# Caddy, — узкий и свой.
|
|
trusted_proxies = ["172.20.0.0/24"]
|
|
|
|
# Локальный вход без Authelia — рецепт целиком.
|
|
#
|
|
# Прокси на машине разработчика нет, а браузер заголовков не ставит — значит
|
|
# приложение локально не открылось бы вовсе. Заголовки входа подставляет сам
|
|
# сервис: второго процесса и второго порта для этого не нужно, приложение
|
|
# открывают по адресу сервиса.
|
|
#
|
|
# Три правки этого файла сверху вниз, и других не нужно:
|
|
#
|
|
# 1. Добавить в перечень выше пару петлевых адресов — обе записи, а не одну:
|
|
#
|
|
# trusted_proxies = ["172.20.0.0/24", "127.0.0.1", "::1"]
|
|
#
|
|
# Браузер разрешает localhost в IPv6 не реже, чем в IPv4, и перечень без
|
|
# `::1` даёт неузнанный запрос. Отказ подстановки при этом виден строкой
|
|
# журнала с адресом пира — по ней и опознаётся недостающая запись.
|
|
#
|
|
# 2. Поставить в секции [server] выше:
|
|
#
|
|
# debug = true
|
|
#
|
|
# 3. Раскомментировать секцию ниже и назвать в ней Remote-User. Ключ —
|
|
# имя заголовка, значение — то, чем сервис назовёт пришедшего. Принимаются
|
|
# три имени: Remote-User, Remote-Name, Remote-Email; иное роняет старт.
|
|
# Ключ Remote-User обязателен: без него сервис подставит всё прочее и не
|
|
# узнает никого.
|
|
#
|
|
# Второй вошедший получается другим значением Remote-User: логин и есть ключ
|
|
# учётной записи.
|
|
#
|
|
# Заполненная секция при debug = false роняет старт с именем ключа
|
|
# предохранителя: состояние «имитация есть, предохранителя нет» не читается
|
|
# никак, а обе его прочтения — поломка.
|
|
#
|
|
# [auth.test_headers]
|
|
# Remote-User = "local"
|
|
# Remote-Name = "Разработчик"
|
|
# Remote-Email = "local@example.com"
|