# 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"